您好,欢迎来到网暖!

当前位置:网暖 » 站长资讯 » 建站基础 » 网络技术 » 文章详细 订阅RssFeed

JavaEE基础(01):Servlet实现方式,生命周期执行过程

来源:网络整理 浏览:286次 时间:2020-05-29

本文源码: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:32ThreadId:33ThreadId:32ThreadId:31ThreadId:32

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

五、源代码地址
GitHub·地址https://github.com/cicadasmile/java-base-parentGitEE·地址https://gitee.com/cicadasmile/java-base-parent

JavaEE基础(01):Servlet实现方式,生命周期执行过程

推荐站点

  • 腾讯腾讯

    腾讯网(www.QQ.com)是中国浏览量最大的中文门户网站,是腾讯公司推出的集新闻信息、互动社区、娱乐产品和基础服务为一体的大型综合门户网站。腾讯网服务于全球华人用户,致力成为最具传播力和互动性,权威、主流、时尚的互联网媒体平台。通过强大的实时新闻和全面深入的信息资讯服务,为中国数以亿计的互联网用户提供富有创意的网上新生活。

    www.qq.com
  • 搜狐搜狐

    搜狐网是全球最大的中文门户网站,为用户提供24小时不间断的最新资讯,及搜索、邮件等网络服务。内容包括全球热点事件、突发新闻、时事评论、热播影视剧、体育赛事、行业动态、生活服务信息,以及论坛、博客、微博、我的搜狐等互动空间。

    www.sohu.com
  • 网易网易

    网易是中国领先的互联网技术公司,为用户提供免费邮箱、游戏、搜索引擎服务,开设新闻、娱乐、体育等30多个内容频道,及博客、视频、论坛等互动交流,网聚人的力量。

    www.163.com
  • 新浪新浪

    新浪网为全球用户24小时提供全面及时的中文资讯,内容覆盖国内外突发新闻事件、体坛赛事、娱乐时尚、产业资讯、实用信息等,设有新闻、体育、娱乐、财经、科技、房产、汽车等30多个内容频道,同时开设博客、视频、论坛等自由互动交流空间。

    www.sina.com.cn
  • 百度一下百度一下

    百度一下,你就知道

    www.baidu.com