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