1 继承体系/生命周期
1.1 基本概念
基本概念
- Servlet 是 JavaEE 规范之一,规范就是接口。是 JavaWeb 三大组件之一(三大组件分别是:Servlet 程序、Filter 过滤器、Listener 监听器)
- Servlet 是运行在服务器上的一个 java 小程序,它可以接收客户端发送过来的请求,并响应数据给客户端。
Servlet类的继承体系
Servlet的生命周期
- 执行servlet构造器方法
- 执行init初始化方法
如上两步:只在第一次访问的时候(创建Servlet程序)时才会被调用
- 执行service方法:每次访问都会调用
-
1.2 Servlet.service方法的分发请求
在servlet.service()接收用户的请求,其方法内会判断当前请求的状态(get/post),以分发具体的处理逻辑
1.3 手动编写一个servlet程序
编写一个类去实现 Servlet 接口
- 实现 service 方法,处理请求,并响应数据
- 到 web.xml 中去配置 servlet 程序的访问地址
1.4 使用idea创建servlet程序
2 HttpServletRequest(request)类
2.1 请求的内部转发
概念
请求的是Servlet1,其内部转发给Servlet2处理并返回
特点
- 浏览器地址栏没有变化,是属于一次请求
- 共享request域内的数据
- 可以转发到web-inf目录下
- 不可以转发到工程以外的资源
代码
Servlet1代码内部
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1.0 在Servlet1里获取请求的参数
String username = request.getParameter("login");
//2.0 在Servlet1里设置共享域数据
request.setAttribute("name","value");
//3.0 请求转发必须要以斜杠打头,/斜杠表示地址为:http://ip:port/工程名/
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/HelloServlet2");
//4.0 走向Servlet2
requestDispatcher.forward(request,response);
}
Servlet2代码内部
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1.0 在Servlet2中查看浏览器的请求参数
String username = request.getParameter("login");
System.out.println("在Servlet2中查看浏览器的请求参数:" + username);
//2.0 在Servlet2查看Servlet1的数据(共享域)
Object key = request.getAttribute("name");
System.out.println("servlet传入的值" + key);
}
2.2 作用和常用方法
- 作用
每次只要有请求进入Tomcat服务器,Tomcat服务器就会把请求过来的 HTTP 协议信息解析好封装到 Request 对象中。然后传递到 service 方法(doGet 和 doPost)中给我们使用。我们可以通过 HttpServletRequest 对象,获取到所有请求的信息。
- 常用方法
getRequestURI() 获取请求的资源路径
getRequestURL() 获取请求的统一资源定位符(绝对路径)
getRemoteHost() 获取客户端的 ip 地址
getHeader() 获取请求头
getParameter() 获取请求的参数
getParameterValues() 获取请求的参数(多个值的时候使用)
getMethod() 获取请求的方式 GET 或 POST
setAttribute(key, value) 设置域数据
getAttribute(key)获取域数据
getRequestDispatcher() 获取请求转发对象
2.3 Servlet获得请求参数和解决乱码
```java //GET请求:获取请求参数 String username = req.getParameter(“username”); //先以iso8859-1进行编码;再以 utf-8 进行解码 username = new String(username.getBytes(“iso-8859-1”), “UTF-8”);
//POST请求 req.setCharacterEncoding(“gbk”);//gbk为当前idea的编码方式 String username = req.getParameter(“test”); System.out.println(username);
<a name="JaISV"></a>
# 3 HttpServletResponse(response)类
<a name="v0yPZ"></a>
## 3.1 作用
HttpServletResponse 类和 HttpServletRequest类一样。每次请求进来,Tomcat 服务器都会创建一个 Response对象传递给 Servlet 程序去使用。<br />HttpServletRequest 表示请求过来的信息,HttpServletResponse 表示所有响应的信息,<br />我们如果需要设置返回给客户端的信息,都可以通过 HttpServletResponse 对象来进行设置.
<a name="g6jMP"></a>
## 3.2 使用
字节流 getOutputStream(); 常用于下载(传递二进制数据)<br />字符流 getWriter(); 常用于回传字符串(常用)<br />使用注意点:两个流同时只能使用一个<br />解决返回值乱码的问题:response.setContentType("text/html;charset=utf-8");
```java
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
PrintWriter writer = response.getWriter();
writer.write("response's content!!!");
}
3.3 请求重定向(302)
代码使用
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//方式一:采用302+设置响应请求头
//设置响应状态码 302 ,表示重定向
response.setStatus(302);
//设置响应头,说明 新的地址在哪里
response.setHeader("Location", "https://www.baidu.com/");
//方式二:直接重定向
response.sendRedirect("https://www.baidu.com/");
}
4 ServletConfig类
基本概念
- Servlet程序和 ServletConfig对象都是由 Tomcat 负责创建。
- Servlet 程序默认在第一次访问的时候创建,ServletConfig对象在每个Servlet程序第一次创建时也相应的被实例化。
基本作用
- 可以获取 Servlet 程序的别名 servlet-name 的值
- 获取初始化参数 init-param
- 获取 ServletContext 对象
使用
注意点
Servlet子类重写init一定要super.init(config)
5 ServletContext类的使用
什么是 ServletContext
- ServletContext 是一个接口,它表示 Servlet 上下文对象
- 一个 web 工程只有一个 ServletContext 对象实例
- ServletContext 对象是一个域对象(域对象:可以像 Map 一样存取数据的对象)
- ServletContext 是在 web 工程部署启动的时候创建。在 web 工程停止的时候销毁。
ServletContext的作用
- 获取web.xml 中配置的上下文参数 context-param
- 获取当前的工程路径,格式: /工程路径
- 获取工程部署后在服务器硬盘上的绝对路径
- 像Map 一样存取数据(使用context-param上下文参数值(它属于整个web工程)
6 SpringMVC乱码问题
- Request_后台获取GET请求数据时的乱码
前提:数据到服务器的必须是utf-8格式
改server.xml;在8080端口处URIEncoding=”UTF-8”
- Request_后台获取POST请求数据的乱码
前提:数据到服务器的必须是utf-8格式
在第一次获取请求参数之前设置request.setCharacterEncoding(“UTF-8”);
如果是SpringMVC框架:可以查看到在StringHttpMessageConverter类有个静态代码块,其内部是使用IOS_8859_1编码方式
static {
DEFAULT_CHARSET = StandardCharsets.ISO_8859_1;}
需要在web.xml配置一个过滤器,手动转换字符串编码,该过滤器必须在其他Filter之前
<!-- 配置一个字符编码的Filter;一定注意:字符编码filter一般都在其他Filter之前; --><filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
- 响应给客户端乱码
response.setContentType(“text/html;charset=utf-8”)
客户端浏览器也要设置为utf-8格式
- IDEA打印的乱码
修改IDEA的字符解析编码(可解决系统的提示如:正在把web应用部署到…的乱码问题);
修改Tomcat的配置(可解决自己在后台打印的中文乱码)
https://www.cnblogs.com/chy18883701161/p/10994655.html