1 继承体系/生命周期

1.1 基本概念

基本概念

  1. Servlet 是 JavaEE 规范之一,规范就是接口。是 JavaWeb 三大组件之一(三大组件分别是:Servlet 程序、Filter 过滤器、Listener 监听器)
  2. Servlet 是运行在服务器上的一个 java 小程序,它可以接收客户端发送过来的请求,并响应数据给客户端。

image.png

Servlet类的继承体系

Servlet的使用 - 图2

Servlet的生命周期

  1. 执行servlet构造器方法
  2. 执行init初始化方法

如上两步:只在第一次访问的时候(创建Servlet程序)时才会被调用

  1. 执行service方法:每次访问都会调用
  2. 执行destory销毁方法:在web工程停止的时候才会调用

    1.2 Servlet.service方法的分发请求

    在servlet.service()接收用户的请求,其方法内会判断当前请求的状态(get/post),以分发具体的处理逻辑
    Servlet的使用 - 图3

    1.3 手动编写一个servlet程序

  3. 编写一个类去实现 Servlet 接口

  4. 实现 service 方法,处理请求,并响应数据
  5. 到 web.xml 中去配置 servlet 程序的访问地址

web.xml里配置的文件
Servlet的使用 - 图4

1.4 使用idea创建servlet程序

Servlet的使用 - 图5
配置servlet的信息
Servlet的使用 - 图6

2 HttpServletRequest(request)类

2.1 请求的内部转发

概念
请求的是Servlet1,其内部转发给Servlet2处理并返回
Servlet的使用 - 图7
特点

  1. 浏览器地址栏没有变化,是属于一次请求
  2. 共享request域内的数据
  3. 可以转发到web-inf目录下
  4. 不可以转发到工程以外的资源

代码
Servlet1代码内部

  1. protected void doGet(HttpServletRequest request, HttpServletResponse response)
  2. throws ServletException, IOException {
  3. //1.0 在Servlet1里获取请求的参数
  4. String username = request.getParameter("login");
  5. //2.0 在Servlet1里设置共享域数据
  6. request.setAttribute("name","value");
  7. //3.0 请求转发必须要以斜杠打头,/斜杠表示地址为:http://ip:port/工程名/
  8. RequestDispatcher requestDispatcher = request.getRequestDispatcher("/HelloServlet2");
  9. //4.0 走向Servlet2
  10. requestDispatcher.forward(request,response);
  11. }

Servlet2代码内部

  1. protected void doGet(HttpServletRequest request, HttpServletResponse response)
  2. throws ServletException, IOException {
  3. //1.0 在Servlet2中查看浏览器的请求参数
  4. String username = request.getParameter("login");
  5. System.out.println("在Servlet2中查看浏览器的请求参数:" + username);
  6. //2.0 在Servlet2查看Servlet1的数据(共享域)
  7. Object key = request.getAttribute("name");
  8. System.out.println("servlet传入的值" + key);
  9. }

2.2 作用和常用方法

  1. 作用

每次只要有请求进入Tomcat服务器,Tomcat服务器就会把请求过来的 HTTP 协议信息解析好封装到 Request 对象中。然后传递到 service 方法(doGet 和 doPost)中给我们使用。我们可以通过 HttpServletRequest 对象,获取到所有请求的信息。

  1. 常用方法
    1. getRequestURI() 获取请求的资源路径
    2. getRequestURL() 获取请求的统一资源定位符(绝对路径)
    3. getRemoteHost() 获取客户端的 ip 地址
    4. getHeader() 获取请求头
    5. getParameter() 获取请求的参数
    6. getParameterValues() 获取请求的参数(多个值的时候使用)
    7. getMethod() 获取请求的方式 GET POST
    8. setAttribute(key, value) 设置域数据
    9. getAttribute(key)获取域数据
    10. 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);

  1. <a name="JaISV"></a>
  2. # 3 HttpServletResponse(response)类
  3. <a name="v0yPZ"></a>
  4. ## 3.1 作用
  5. HttpServletResponse 类和 HttpServletRequest类一样。每次请求进来,Tomcat 服务器都会创建一个 Response对象传递给 Servlet 程序去使用。<br />HttpServletRequest 表示请求过来的信息,HttpServletResponse 表示所有响应的信息,<br />我们如果需要设置返回给客户端的信息,都可以通过 HttpServletResponse 对象来进行设置.
  6. <a name="g6jMP"></a>
  7. ## 3.2 使用
  8. 字节流 getOutputStream(); 常用于下载(传递二进制数据)<br />字符流 getWriter(); 常用于回传字符串(常用)<br />使用注意点:两个流同时只能使用一个<br />解决返回值乱码的问题:response.setContentType("text/html;charset=utf-8");
  9. ```java
  10. protected void doGet(HttpServletRequest request, HttpServletResponse response)
  11. throws ServletException, IOException {
  12. PrintWriter writer = response.getWriter();
  13. writer.write("response's content!!!");
  14. }

3.3 请求重定向(302)

Servlet的使用 - 图8
代码使用

  1. protected void doGet(HttpServletRequest request, HttpServletResponse response)
  2. throws ServletException, IOException {
  3. //方式一:采用302+设置响应请求头
  4. //设置响应状态码 302 ,表示重定向
  5. response.setStatus(302);
  6. //设置响应头,说明 新的地址在哪里
  7. response.setHeader("Location", "https://www.baidu.com/");
  8. //方式二:直接重定向
  9. response.sendRedirect("https://www.baidu.com/");
  10. }

4 ServletConfig类

基本概念

  1. Servlet程序和 ServletConfig对象都是由 Tomcat 负责创建。
  2. Servlet 程序默认在第一次访问的时候创建,ServletConfig对象在每个Servlet程序第一次创建时也相应的被实例化。

基本作用

  1. 可以获取 Servlet 程序的别名 servlet-name 的值
  2. 获取初始化参数 init-param
  3. 获取 ServletContext 对象

使用
Servlet的使用 - 图9
注意点
Servlet子类重写init一定要super.init(config)
Servlet的使用 - 图10

5 ServletContext类的使用

什么是 ServletContext

  1. ServletContext 是一个接口,它表示 Servlet 上下文对象
  2. 一个 web 工程只有一个 ServletContext 对象实例
  3. ServletContext 对象是一个域对象(域对象:可以像 Map 一样存取数据的对象)
  4. ServletContext 是在 web 工程部署启动的时候创建。在 web 工程停止的时候销毁。

ServletContext的作用

  1. 获取web.xml 中配置的上下文参数 context-param
  2. 获取当前的工程路径,格式: /工程路径
  3. 获取工程部署后在服务器硬盘上的绝对路径
  4. 像Map 一样存取数据(使用context-param上下文参数值(它属于整个web工程)

案例
Servlet的使用 - 图11

6 SpringMVC乱码问题

  1. Request_后台获取GET请求数据时的乱码

前提:数据到服务器的必须是utf-8格式
改server.xml;在8080端口处URIEncoding=”UTF-8”

  1. Request_后台获取POST请求数据的乱码

前提:数据到服务器的必须是utf-8格式
在第一次获取请求参数之前设置request.setCharacterEncoding(“UTF-8”);
如果是SpringMVC框架:可以查看到在StringHttpMessageConverter类有个静态代码块,其内部是使用IOS_8859_1编码方式
static {
DEFAULT_CHARSET = StandardCharsets.ISO_8859_1;}
需要在web.xml配置一个过滤器,手动转换字符串编码,该过滤器必须在其他Filter之前
Servlet的使用 - 图12

  1. <!-- 配置一个字符编码的Filter;一定注意:字符编码filter一般都在其他Filter之前; --><filter>
  2. <filter-name>encodingFilter</filter-name>
  3. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  4. <init-param>
  5. <param-name>encoding</param-name>
  6. <param-value>UTF-8</param-value>
  7. </init-param>
  8. <init-param>
  9. <param-name>forceEncoding</param-name>
  10. <param-value>true</param-value>
  11. </init-param>
  12. </filter>
  13. <filter-mapping>
  14. <filter-name>encodingFilter</filter-name>
  15. <url-pattern>/*</url-pattern>
  16. </filter-mapping>
  1. 响应给客户端乱码

response.setContentType(“text/html;charset=utf-8”)
客户端浏览器也要设置为utf-8格式

  1. IDEA打印的乱码

修改IDEA的字符解析编码(可解决系统的提示如:正在把web应用部署到…的乱码问题);
修改Tomcat的配置(可解决自己在后台打印的中文乱码)
https://www.cnblogs.com/chy18883701161/p/10994655.html