Servlet知识点回顾以及SpringMVC分析入口

1.Servlet的生命周期

  • Servlet通过调用init()方法进行初始化。
  • Servlet调用service()方法来处理客户端的请求
  • Servlet通过调用destroy()方法结束
  • 最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。

创建UserServlet

/**
 * @author 周宁
 * @Date 2019-08-09 9:44
 */
public class UserServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("UserServlet service");
        super.service(req, resp);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servletContext = getServletContext();
        String username = servletContext.getAttribute("username").toString();
        String age = servletContext.getAttribute("age").toString();
        resp.setContentType("text/html");
        //返回数据或者视图
        PrintWriter out = resp.getWriter();
        out.println("<h1>" + username + age + "</h1>");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html");
        // 实际的逻辑是在这里
        PrintWriter out = resp.getWriter();
        out.println("<h1>" + "hello world" + "</h1>");
    }

    @Override
    public void destroy() {
        System.out.println("UserServlet destroy");
    }

    @Override
    public void init() throws ServletException {
        System.out.println("UserServlet init");
    }
}

在web.xml中配置servlet

<servlet>
        <servlet-name>userServlet</servlet-name>
        <servlet-class>org.springframework.studymvc.servlet.UserServlet</servlet-class>

    </servlet>
    <servlet-mapping>
        <servlet-name>userServlet</servlet-name>
        <url-pattern>/user</url-pattern>
    </servlet-mapping>

1.init
init 方法被设计成只调用一次。它在第一次创建 Servlet 时被调用,在后续每次用户请求时不再调用。因此,它是用于一次性初始化,就像 Applet 的 init 方法一样。
Servlet 创建于用户第一次调用对应于该 Servlet 的 URL 时,但是您也可以指定 Servlet 在服务器第一次启动时被加载。
当用户调用一个 Servlet 时,就会创建一个 Servlet 实例,每一个用户请求都会产生一个新的线程,适当的时候移交给 doGet 或 doPost 方法。init() 方法简单地创建或加载一些数据,这些数据将被用于 Servlet 的整个生命周期。

2.service
service() 方法是执行实际任务的主要方法。Servlet 容器(即 Web 服务器)调用 service() 方法来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端。
每次服务器接收到一个 Servlet 请求时,服务器会产生一个新的线程并调用服务。service() 方法检查 HTTP 请求类型(GET、POST、PUT、DELETE 等),并在适当的时候调用 doGet、doPost、doPut,doDelete 等方法。

3.doGet和doPost
GET 请求来自于一个 URL 的正常请求,或者来自于一个未指定 METHOD 的 HTML 表单,它由 doGet() 方法处理。
POST 请求来自于一个特别指定了 METHOD 为 POST 的 HTML 表单,它由 doPost() 方法处理。

4.destroy
destroy() 方法只会被调用一次,在 Servlet 生命周期结束时被调用。destroy() 方法可以让您的 Servlet 关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘,并执行其他类似的清理活动。
在调用 destroy() 方法之后,servlet 对象被标记为垃圾回收。

5.整体流程

  • 第一个到达服务器的HTTP请求被委派到Servlet容器。
  • Servlet容器在调用service()方法之前加载Servlet
  • 然后 Servlet 容器处理由多个线程产生的多个请求,每个线程执行一个单一的 Servlet 实例的 service() 方法。

å¨è¿éæå¥å¾çæè¿°

 2.ServletContextListener

在ServletAPI中有一个ServletContextListener接口,它能够监听 ServletContext 对象的生命周期,当Servlet 容器启动或终止Web 应用时,会触发ServletContextEvent 事件,该事件由ServletContextListener 来处理。在 ServletContextListener 接口中定义了处理ServletContextEvent 事件的两个方法

自定义一个ServletContextLisnter

public class UserServletContextListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        ServletContext servletContext = sce.getServletContext();
        servletContext.setAttribute("username","zhouning");
        servletContext.setAttribute("age",26);
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("UserServletContextListener destroyed");
    }
}

配置web.xml

<listener>
        <listener-class>org.springframework.studymvc.servlet.UserServletContextListener</listener-class>
    </listener>

我们通过实现ServletContextListener并重写其contextInitialized方法,为应用设置了name和age两个属性,并且在servlet中成功读取到了这两个属性。

3.ServletContext、ServletConfig和Servlet创建顺序

ServletContext作为所有Servlet的上下文,第一个被创建,然后容器在创建Servlet的时候,会解析servlet标签配置的参数封装成ServletConfig对象交给Servlet,创建完成之后,再去调用Servlet的初始化方法,ServleConfig会作为参数传递给初始化的init方法,所以ServletConfig第二个被创建,Servlet第三个被创建。

ServletContext为所有Servlet共享,ServletConfig只为一个Servlet服务;通过ServletConfig可以获取到ServletContext方法如下

 public ServletContext getServletContext() {
        ServletConfig sc = getServletConfig();
        if (sc == null) {
            throw new IllegalStateException(
                lStrings.getString("err.servlet_config_not_initialized"));
        }

        return sc.getServletContext();
    }

4.SpringMVC源码分析:这里借鉴《Spring源码深度解析》一文

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值