[Servlet] 笔记

Servlet 创建步骤

  1. 创建web项目导入依赖
<dependency>
<groupld>javax.servlet</groupld>
<artifactld>javax.servlet-api</artifactld>
<version>3.1.0</version>
<!-- 排除运行环境,防止与tomcat中的servlet冲突 -->
<scope>provided</scope>
</dependency>
  1. 定义一个类,实现 Servlet 接口,并重写接口中所有方法,并在 service 方法中编写业务逻辑(比如在控制台输出一句话)

  2. 在类上使用 @WebServlet 注解,配置该 Servlet 的访问路径

@WebServlet("/servlet1")
public class Servlet1 implements Servlet {
    public void init(ServletConfig servletConfig) throws ServletException {

    }

    public ServletConfig getServletConfig() {
        return null;
    }

    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("Hello Servlet!!");
    }

    public String getServletInfo() {
        return null;
    }

    public void destroy() {

    }
}
  1. 启动 Tomcat,浏览器输入 URL 访问该 Servlet

Servlet执行流程

浏览器请求 Servlet Url ===> Tomcat

Tomcat 自动创建 Servlet 对象,并调用其中的 Service 方法

浏览器 <=== Tomcat 将 Service 中的响应数据

  • Servlet 类是对 Servlet 接口的实现。接口中有 Service 方法的声明。

Servlet 生命周期

Servlet运行在servlet容器(web服务器)中,其生命周期由容器来管理,分为4个阶段

  1. 加载和实例化: 默认情况下,当Servlet第一次被访问时,由容器创建servlet对象
    • @WebServlet(value = "/servlet1", loadOnStartup = -1)
    • loadOnStartup 负整数:在第一次访问时创建
    • loadOnStartup 0 或正整数:服务器启动时创建 servlet 对象
  2. 初始化: 在 Servlet 实例化之后,容器将调用 servlet 的 init() 方法初始化这个对象,完成一些如加载配置文件、创建连接等初始化的工作。该方法只调用一次
  3. 请求处理: 每次请求 servlet 时,Servlet 容器都会调用 servlet 的 service() 方法对请求进行处理。
  4. 服务终止: 当需要释放内存或者容器关闭时,容器就会调用 servlet 实例的 destroy() 方法完成资源的释放。在 destroy() 方法调用之后,容器会释放这个 Servlet 实例,该实例随后会被 Java 的垃圾收集器所回收

Servlet 体系结构

img

@WebServlet(urlPatterns = "/custom")
public class CustomServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("get...");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("post...");
    }
}

HttpServlet 使用不同的请求方法为什么要用不同的方法?

不同请求的请求体,请求参数位置不同,要分别处理

HttpServlet 原理

获取发起请求的方式,对应方式调用不同的方法

HttpServlet 的部分源码

public abstract class HttpServlet extends GenericServlet {
    private static final String METHOD_DELETE = "DELETE";
    private static final String METHOD_HEAD = "HEAD";
    private static final String METHOD_GET = "GET";
    private static final String METHOD_OPTIONS = "OPTIONS";
    private static final String METHOD_POST = "POST";
    private static final String METHOD_PUT = "PUT";
    private static final String METHOD_TRACE = "TRACE";
    private static final String HEADER_IFMODSINCE = "If-Modified-Since";
    private static final String HEADER_LASTMOD = "Last-Modified";
    private static final String LSTRING_FILE = "javax.servlet.http.LocalStrings";
    private static ResourceBundle lStrings = ResourceBundle.getBundle("javax.servlet.http.LocalStrings");

    public HttpServlet() {
    }

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String protocol = req.getProtocol();
        String msg = lStrings.getString("http.method_get_not_supported");
        if (protocol.endsWith("1.1")) {
            resp.sendError(405, msg);
        } else {
            resp.sendError(400, msg);
        }

    }

urlPattern 配置

配置方式

@WebServlet(urlPatterns = {"/demo1", "/demo2"})

匹配规则

  • 精确匹配 (优先级最高)
    • 配置 @WebServlet(urlPatterns = "/servlet1")
    • 访问 /localhost/webapp/servlet1
  • 目录匹配
    • 配置 @WebServlet(urlPatterns = "/user/*")
    • 访问 /localhost/webapp/user/aa
    • 访问 /localhost/webapp/user/zhangsan 等等
  • 扩展名匹配
    • 配置 @WebServlet(urlPatterns = "*.jpg")
    • 访问 /localhost/webapp/user/aa.jpg
    • 访问 /localhost/webapp/user/girl.jpg 等等
  • 任意匹配
    /**
    * 任意匹配url
    * * 方式1: /*
    * * 方式2: /
    * 方式1 的优先级高于 方式2
    */
    @WebServlet(urlPatterns = "/*")
    @WebServlet(urlPatterns = "/")
    
    • 在 tomcat 中有一个默认 Servlet 它的访问路径是 "/"
    /tomcat/conf/web.xml中定义了默认 Servlet
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    
    • 问题 :覆盖掉默认路径为 / 的 Servlet 会导致静态资源无法被访问
    • 结论 :别配,危!

优先级:

精确匹配 > 目录匹配 > 扩展名匹配 > /* > /


遇到的问题

Maven [ERROR] 不再支持源选项 5,请使用 7 或更高版本的解决办法

解决:

pom.xml 中添加

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
</properties>
posted @   李八御  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示