什么是Servlet

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

手动实现Servlet程序

  1. 编写一个类去实现Servlet接口
  2. 实现servic 方法,处理请求,并响应数据
  3. 到web.xml中去配置servlet程序的访问地址

    url地址到Servlet程序的访问

    截屏2021-08-01 下午5.32.20.png

    Servlet的生命周期

  4. 执行Servlet构造器方法

  5. 执行init初始化方法
  6. 执行service方法
  7. 执行destroy方法

    说明

    步骤1、2只在初始化后第一次访问的时候,创建Servlet程序会调用
    步骤3,在每次访问都会调用
    步骤4,只有在web 结束后才执行

GET和POST请求的分发处理

在service 获取 method 实现不同处理

  1. @Override
  2. public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
  3. System.out.println("3.service");
  4. HttpServletRequest httpServlet = (HttpServletRequest) servletRequest;
  5. String method = httpServlet.getMethod();
  6. System.out.println(method);
  7. }

通过继承HttpServlet实现Servlet

  1. 编写一个类去继承HttpServlet类
  2. 根据业务需要重写doGet 和 doPost方法
  3. 到web.xml 中配置Servlet程序访问地址 ```java package com.wujing.servletTest;

import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException;

/**

  • @ClassName: HttpServletTest
  • @Description: 测试httpServlet
  • @Author liujiexin
  • @Date 2021/8/1 10:36 下午 */ public class HttpServletTest extends HttpServlet {

    @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    1. System.out.println("HttpServletTest do get ");

    }

    @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

     System.out.println("HttpServletTest do post ");
    

    } }


```xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">


    <!-- servlet 标签给tomcat配置Servlet程序 -->
    <servlet>
        <!-- servlet-name 标签Servlet程序起一个别名(一般是类名) -->
        <servlet-name>HelloServlet1</servlet-name>
        <!-- servlet-class 是Servlet 程序的全类名 -->
        <servlet-class>com.wujing.servletTest.HelloServlet1</servlet-class>
    </servlet>

    <!-- 配置访问地址 -->
    <servlet-mapping>
        <!-- servlet-name 对应地址访问的是哪个Servlet程序使用-->
        <servlet-name>HelloServlet1</servlet-name>
        <!-- url-pattern 访问的地址
            / 斜杠在服务器解析的时候,表示地址为: http://ip:port/工程路径
            /hello 表示地址为: http://ip:port/工程路径/hello
        -->
        <url-pattern>/hello1</url-pattern>
    </servlet-mapping>



    <!-- servlet 标签给tomcat配置Servlet程序 -->
    <servlet>
        <!-- servlet-name 标签Servlet程序起一个别名(一般是类名) -->
        <servlet-name>HttpServletTest</servlet-name>
        <!-- servlet-class 是Servlet 程序的全类名 -->
        <servlet-class>com.wujing.servletTest.HttpServletTest</servlet-class>
    </servlet>

    <!-- 配置访问地址 -->
    <servlet-mapping>
        <!-- servlet-name 对应地址访问的是哪个Servlet程序使用-->
        <servlet-name>HttpServletTest</servlet-name>
        <!-- url-pattern 访问的地址
            / 斜杠在服务器解析的时候,表示地址为: http://ip:port/工程路径
            /hello 表示地址为: http://ip:port/工程路径/hello
        -->
        <url-pattern>/HttpServlet</url-pattern>
    </servlet-mapping>

</web-app>

使用IDEA创建Servlet程序

Servlet类的继承体系

截屏2021-08-01 下午11.30.26.png

/**
     * Receives standard HTTP requests from the public
     * <code>service</code> method and dispatches
     * them to the <code>do</code><i>Method</i> methods defined in
     * this class. This method is an HTTP-specific version of the
     * {@link javax.servlet.Servlet#service} method. There's no
     * need to override this method.
     *
     * @param req   the {@link HttpServletRequest} object that
     *                  contains the request the client made of
     *                  the servlet
     *
     * @param resp  the {@link HttpServletResponse} object that
     *                  contains the response the servlet returns
     *                  to the client
     *
     * @exception IOException   if an input or output error occurs
     *                              while the servlet is handling the
     *                              HTTP request
     *
     * @exception ServletException  if the HTTP request
     *                                  cannot be handled
     *
     * @see javax.servlet.Servlet#service
     */
    protected void service(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {

        String method = req.getMethod();

        if (method.equals(METHOD_GET)) {
            long lastModified = getLastModified(req);
            if (lastModified == -1) {
                // servlet doesn't support if-modified-since, no reason
                // to go through further expensive logic
                doGet(req, resp);
            } else {
                long ifModifiedSince;
                try {
                    ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);
                } catch (IllegalArgumentException iae) {
                    // Invalid date header - proceed as if none was set
                    ifModifiedSince = -1;
                }
                if (ifModifiedSince < (lastModified / 1000 * 1000)) {
                    // If the servlet mod time is later, call doGet()
                    // Round down to the nearest second for a proper compare
                    // A ifModifiedSince of -1 will always be less
                    maybeSetLastModified(resp, lastModified);
                    doGet(req, resp);
                } else {
                    resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
                }
            }

        } else if (method.equals(METHOD_HEAD)) {
            long lastModified = getLastModified(req);
            maybeSetLastModified(resp, lastModified);
            doHead(req, resp);

        } else if (method.equals(METHOD_POST)) {
            doPost(req, resp);

        } else if (method.equals(METHOD_PUT)) {
            doPut(req, resp);

        } else if (method.equals(METHOD_DELETE)) {
            doDelete(req, resp);

        } else if (method.equals(METHOD_OPTIONS)) {
            doOptions(req,resp);

        } else if (method.equals(METHOD_TRACE)) {
            doTrace(req,resp);

        } else {
            //
            // Note that this means NO servlet supports whatever
            // method was requested, anywhere on this server.
            //

            String errMsg = lStrings.getString("http.method_not_implemented");
            Object[] errArgs = new Object[1];
            errArgs[0] = method;
            errMsg = MessageFormat.format(errMsg, errArgs);

            resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);
        }
    }

ServletConfig类

什么是ServletConfig

servlet 程序的配置类
Servlet程序 默认是第一次访问时候创建,ServletConfig是每个Servlet程序创建时,就创建一个对应的SerletConfig对象

ServletConfig的三大作用

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

ServletContext 接口

什么是ServletContext

  1. ServletContext 是一个接口,它表示Servlet上下文对象
  2. 一个web工程,只有一个ServletContext 对象实例
  3. ServletContext 对象是一个域对象
  4. ServletContext 是在web工程部署启动的时候创建,在web工程停止的时候销毁(单例)

ServletContext 类的四个作用

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

HttpServletRequest

有什么作用

可以获取请求信息

常用方法

  1. getRequestURI()
  2. getRequestURL()
  3. getRemoteHost()
  4. getHeader()
  5. getParameter()
  6. getParameterValues()
  7. getMethod()
  8. setAttribute(key, value)
  9. getAttribute(key)
  10. getRequestDispatcher()

请求的转发

什么是转发

服务器资源,从一个资源跳到另一个资源的操作

base 标签

web中 /斜杠的不同意义

截屏2021-08-10 下午10.52.39.png

HttpServletRespose 类的作用

HttpServletRequest 表示请求过来的信息
HttpServletResponse 表示所有响应的信息

解决服务器中文乱码问题

请求重定向

重定向的方式一

resp.setStatus(302);
resp.setHeader(“Location”, “url”);

方式二

resp.sendRediret(url);
截屏2021-08-10 下午11.15.14.png

Cookie

什么是Cookie

  1. 是服务器通知客户端保存键值对的一种技术