Servlet
Servlet是一个接口,常用方法是service
package com.tjsmc.servlet;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class Hello implements Servlet{
public void destroy() {
}
public ServletConfig getServletConfig() {
return null;
}
public String getServletInfo() {
return null;
}
public void init(ServletConfig arg0) throws ServletException {
}
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
System.out.println("测试");
}
}
在webcontent下面的web-inf文件夹下面的web.xml文件中配置servlet和路由
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>HelloServlet</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- 向tomcat说明,项目里面有哪些servlet,不注册的话无效 -->
<servlet>
<servlet-name>Hello</servlet-name>
<servlet-class>com.tjsmc.servlet.Hello</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
HttpServlet
HttpServlet是Servlet的实现类,可选择实现对应的方法,但是一般此类中不重写service方法
因为该类的service自身也是判断请求方式,然后调用doget或者dopost,所以一般直接写doGet或doPost
package com.tjsmc.servlet;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Hello2 extends HttpServlet{
@Override
protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
super.service(arg0, arg1);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
Servlet的生命周期
public class Hello implements Servlet{
/**
* 默认情况下:创建类的实例时候调用
* 初次访问servlet才会创建实例
* init方法只会执行一次
*/
public void init(ServletConfig arg0) throws ServletException {
System.out.println("init");
}
/**
* 客户端请求到达就执行
* 可多次执行
* 一次请求对应一次service执行
*/
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
System.out.println("service");
}
/**
* servlet销毁的时候,执行该方法
* 1. 项目从tomcat中移除
* 2. tomcat中shutdown.bat执行正常关闭时候执行
*/
public void destroy() {
System.out.println("destroy");
}
}
Servlet的提前初始化
<!-- 向tomcat说明,项目里面有哪些servlet -->
<servlet>
<servlet-name>Hello</servlet-name>
<servlet-class>com.tjsmc.servlet.Hello</servlet-class>
<!--默认情况下,servlet的init初始化在第一次访问到达时候执行
如果想提前初始化(在项目部署到tomcat中就进行初始化),则通过下面的标签,而且值是一个数字
数字越小,创建时机越早,一般不写负数,从2开始即可,1被tomcat内部占用 -->
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
ServletConfig
servlet的配置,通过这个对象可以获取servlet在配置时候的一些信息
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//ServletConfig 可以获取servlet的配置信息
//1. 获取servlet的配置对象
ServletConfig config= getServletConfig();
//2.获取servlet的名称:是servlet-name的文本内容
String servletName = config.getServletName();
//3.获取初始化参数
String initParameter = config.getInitParameter("name");
// System.out.println("初始化:"+initParameter);
//4.获取所有初始化参数的名称的枚举集合
Enumeration<String> initParameterNames = config.getInitParameterNames();
while (initParameterNames.hasMoreElements()) {
String string = (String) initParameterNames.nextElement();
String pars = config.getInitParameter(string);
System.out.println(pars);
}
}
<servlet>
<servlet-name>Hello2</servlet-name>
<servlet-class>com.tjsmc.servlet.Hello2</servlet-class>
<!-- 添加初始化参数 -->
<init-param>
<param-name>name</param-name>
<param-value>qiang</param-value>
</init-param>
</servlet>
路径匹配
- 全路径匹配
- 例如:/aa /bb
- 前半段匹配(以*结束)
- 例如: /a/* /*
- 以扩展名匹配(此时不需要/)
- 写法 *.扩展名 *.aa *.bb
ServletContext(上下文)
public class Hello3 extends HttpServlet {
/**
* 一个web程序只有一个上下文对象ServletContext
* 也就是说不论哪个servlet获取的ServletContext都是同一个
* ServletContext作用:
* 1. 获取全局配置参数
* 2. 获取web应用的资源(因为项目发布到tomcat中之后资源文件路径用相对路径不对,绝对路径又不合适)
* 3. 存储数据(servlet间共享数据,域对象)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取上下文对象
ServletContext servletContext = getServletContext();
//2.获取全局配置的参数
String initParameter = servletContext.getInitParameter("name");
//3.获取给定的文件在服务器上面的绝对路径,该方法如果不添加参数,则是项目根目录
String realPath = servletContext.getRealPath("props/stus.properties");
//D:\DevelopSoft\Tomcat\apache-tomcat-7.0.52\wtpwebapps\HelloServlet\stus.properties
Properties properties=new Properties();
// properties.load(new FileInputStream(realPath));
// String name = (String) properties.get("name");
//3.获取资源方式二
// InputStream resourceAsStream = servletContext.getResourceAsStream("props/stus.properties");
// properties.load(resourceAsStream);
// String name = (String) properties.get("name");
//3.利用classloader获取资源方式三
/**
* classloader的路径是:
* D:\DevelopSoft\Tomcat\apache-tomcat-7.0.52\wtpwebapps\HelloServlet\WEB-INF\classes
*
* 但是真实需要的是:
* D:\DevelopSoft\Tomcat\apache-tomcat-7.0.52\wtpwebapps\HelloServlet\stus.properties
* 所以需要回两级目录
*/
InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream("../../props/stus.properties");
properties.load(resourceAsStream);
String name = (String) properties.get("name");
System.out.println(name);
//4.存储数据和取出数据
//获取get请求来的参数
String username = request.getParameter("username");
Object loginnum =servletContext.getAttribute("loginnum");
int total=0;
if (loginnum!=null) {
total=(Integer) loginnum;
}
servletContext.setAttribute("loginnum", ++total);
//返回给客户端
response.getWriter().write(username+"..."+total);
}
}
资源路径.png
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<p>
请输入内容并提交
</p>
<!-- 注意此处不需要/Hello3 直接Hello3即可 -->
<form action="Hello3" method="get">
<input type="text" name="username" value="请输入用户名">
<input type="submit" value="提交">
</form>
</body>
</html>
<!-- 全局参数 -->
<context-param>
<param-name>name</param-name>
<param-value>全局参数</param-value>
</context-param>
全局参数.png
HttpServletRequest和HttpServletResponse
HttpServletRequest客户端提交数据的封装,HttpServletResponse是响应对象
public class Hello4 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 获取单个提交的参数
String username = request.getParameter("username");
// 获取所有参数得到一个枚举集合
Enumeration<String> parameterNames = request.getParameterNames();
// 获取所有参数的map集合
Map<String, String[]> parameterMap = request.getParameterMap();
/**
* GET请求方式中文乱码问题 tomcat收到数据,getParameter默认使用ISO-8859-1编码
* 所以先利用username.getBytes("ISO-8859-1")通过ISO-8859-1解码 然后通过new
* String编码为UTF-8
*
* 解决方案二: 在tomcat中配置get请求过来的数据永远使用UTF-8编码即可
* tomcat文件夹下面的conf文件夹内部的server.xml中的64行
* <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" * redirectPort="8443" URIEncoding="UTF-8"/>
*/
username = new String(username.getBytes("ISO-8859-1"), "UTF-8");
/**
* 响应也有中文乱码问题
*/
// 以字符流的方式写,默认是ISO-8859-1会中文乱码
// 1.首先设置响应体的编码格式
// response.setCharacterEncoding("UTF-8");
// 2. 设置浏览器使用的解码格式
// response.setHeader("Content-Type", "text/html;charset=UTF-8");
// response.getWriter().write("呵呵");
// 以字节流的方式写也可能有会中文乱码
/**
* 默认使用的是utf-8的编码
*/
//方式一:
//response.setContentType( "text/html;charset=UTF-8");
//方式二
response.setHeader("Content-Type", "text/html;charset=UTF-8");
//起始因为默认是utf-8的编码所以getBytes("utf-8")可以直接写getBytes()
response.getOutputStream().write("呵呵呵".getBytes("utf-8"));
// 设置状态码
// response.setStatus(200);
// 设置消息头
// response.setHeader(arg0, arg1);
// 设置响应类型
// response.setContentType(arg0);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// post请求中文乱码问题,通过下面代码设置编码即可解决
// 设置请求体内容编码格式
resp.setCharacterEncoding("UTF-8");
String username = req.getParameter("username");
resp.getWriter().write(username);
}
}
下载文件的案例
代码实现下载:
public class down extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String filename = request.getParameter("filename");
/**
* 这句代码:
* 表示是使用下载的方式操作文件,而不是浏览器默认行为
* 比如说浏览器默认打开图片,xml,而不是下载
*/
response.setHeader("Content-Disposition", "attachment;filename="+filename);
InputStream is = getServletContext().getResourceAsStream("download/" + filename);
OutputStream os = response.getOutputStream();
int len = 0;
byte[] bys = new byte[1024];
while ((len = is.read(bys)) != -1) {
os.write(bys, 0, len);
}
os.close();
is.close();
}
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<p>使用tomcat默认servlet实现下载</p>
<!-- 不需要java代码配合,但是浏览器是按照默认行为操作的 -->
<a href="download/a.zip">下面</a>
<p>编码实现下载</p>
<a href="down?filename=a.zip">下面</a>
<a href="down?filename=a.png">下面</a>
</body>
</html>
download.png
网友评论