zoukankan      html  css  js  c++  java
  • JavaEE基础(01):Servlet实现方式,生命周期执行过程

    本文源码:GitHub·点这里 || GitEE·点这里

    一、Servlet简介

    Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。使用Servlet,可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。

    二、实现方式

    1、继承HttpServlet

    • API简介

    继承自 GenericServlet. 遵守 HTTP协议实现,以设计模式的角度看,HttpServlet担任抽象模板角色,模板方法:由service()方法担任。基本方法:由doPost()、doGet()等方法担任。service()方法流程,省略了部分判断逻辑。该方法调用七个do方法中的一个或几个,完成对客户端请求的响应。这些do方法需要由HttpServlet的具体子类提供,这种API封装是典型的模板方法模式。

    • 代码案例
    public class ServletOneImpl extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            response.setContentType("text/html;charset=utf-8");
            response.getWriter().print("执行:doGet");
        }
    
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            response.setContentType("text/html;charset=utf-8");
            response.getWriter().print("执行:doPost");
        }
    }
    

    2、继承GenericServlet

    • API 简介

    Servlet 接口和 ServletConfig 接口的实现类. 一个抽象类. 其中的 service 方法为抽象方法。

    • 代码案例
    public class ServletTwoImpl extends GenericServlet {
        @Override
        public void service(ServletRequest servletRequest, ServletResponse servletResponse)
                throws ServletException, IOException {
            HttpServletResponse response = (HttpServletResponse)servletResponse ;
            response.setContentType("text/html;charset=utf-8");
            response.getWriter().print("执行:service");
        }
    }
    

    3、实现Servlet接口

    • API 简介

    Servlet是一个接口,其中包含init、getServletConfig、service、getServletInfo、destroy几个核心方法。

    • 代码案例
    public class ServletThreeImpl implements Servlet {
        @Override
        public void init(ServletConfig servletConfig) throws ServletException {
            servletConfig.getServletName();
            System.out.println("init 被调用...");
        }
        @Override
        public void service(ServletRequest servletRequest, ServletResponse servletResponse)
                throws ServletException, IOException {
            System.out.println("ThreadId:"+Thread.currentThread().getId());
            System.out.println("service 被调用...");
            HttpServletResponse response = (HttpServletResponse)servletResponse ;
            response.getWriter().print("Servlet.Life");
        }
        @Override
        public void destroy() {
            System.out.println("destroy 被调用...");
        }
        @Override
        public ServletConfig getServletConfig() {
            System.out.println("getServletConfig 被调用...");
            return null;
        }
        @Override
        public String getServletInfo() {
            System.out.println("getServletInfo 被调用...");
            return null;
        }
    }
    

    三、生命周期

    • 加载和实例化

    当Servlet容器启动或客户端发送请求时,Servlet容器会查找是否存在该Servlet实例,若存在,则直接读取该实例响应请求;如果不存在,就创建一个Servlet实例(属于单例设计模式)。load-on-startup 可以配置创建时序。

    • 初始化:init()

    实例化后,Servlet容器将调用init方法一次,初始化当前 Servlet。

    • 服务:service()

    初始化后,Servlet处于响应请求的就绪状态。当接收到客户端请求时,调用service()的方法处理客户端请求,HttpServlet的service()方法会根据不同的请求 调用不同的模板方法。

    • 销毁:destroy()

    当Servlet容器关闭时,Servlet实例也随时销毁。关闭 Tomcat 服务时可以通过日志打印看到该方法的执行。

    四、运行配置

    1、web.xml配置

    <servlet>
        <servlet-name>servletOneImpl</servlet-name>
        <servlet-class>com.node01.servlet.impl.ServletOneImpl</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>servletOneImpl</servlet-name>
        <url-pattern>/servletOneImpl</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>servletTwoImpl</servlet-name>
        <servlet-class>com.node01.servlet.impl.ServletTwoImpl</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>servletTwoImpl</servlet-name>
        <url-pattern>/servletTwoImpl</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>servletThreeImpl</servlet-name>
        <servlet-class>com.node01.servlet.impl.ServletThreeImpl</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>servletThreeImpl</servlet-name>
        <url-pattern>/servletThreeImpl</url-pattern>
    </servlet-mapping>
    

    请求:http://localhost:6003/servletOneImpl 测试。

    • servlet-name:Servlet 注册名称。
    • servlet-class:Servlet 全路径类名。
    • serlvet-mapping:同一个Servlet可以被映射到多个URL上。
    • url-pattern:Servlet 访问的映射路径。

    2、线程池运行

    观察上述第三种Servlet实现方式的日志打印:Thread.currentThread().getId());

    ThreadId:32
    ThreadId:33
    ThreadId:32
    ThreadId:31
    ThreadId:32
    

    这里不难发现,Servlet以线程池的方式执行的。

    五、源代码地址

    GitHub·地址
    https://github.com/cicadasmile/java-base-parent
    GitEE·地址
    https://gitee.com/cicadasmile/java-base-parent
    

  • 相关阅读:
    [LeetCode]Search a 2D Matrix
    [LeetCode]Trapping Rain Water
    [LeetCode]Container With Most Water
    [LeetCode]Permutations
    [LeetCode]Missing Number
    [LeetCode]Set Matrix Zeroes
    [LeetCode]Find Peak Element
    [LeetCode]Balanced Binary Tree
    [LeetCode]Spiral Matrix II
    [LeetCode]Spiral Matrix
  • 原文地址:https://www.cnblogs.com/cicada-smile/p/12009050.html
Copyright © 2011-2022 走看看