经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Servlet » 查看文章
Java中Servlet的生命周期详解
来源:jb51  时间:2022/8/22 18:17:24  对本文有异议

Web基础和HTTP协议

  1. ┌─────────┐
  2. ┌─────────┐ │?????????│
  3. O ???????│ ├─────────┤
  4. ├─────────┤ │?????????│
  5. ├─────────┤
  6. │?????????│
  7. └─────────┘ └─────────┘
  8. request 1
  9. │─────────────────────>│
  10. request 2
  11. │─────────────────────>│
  12. response 1
  13. │<─────────────────────│
  14. request 3
  15. │─────────────────────>│
  16. response 3
  17. │<─────────────────────│
  18. response 2
  19. │<─────────────────────│

我们注意到HTTP协议是一个请求-响应协议,它总是发送一个请求,然后接收一个响应。能不能一次性发送多个请求,然后再接收多个响应呢?HTTP 2.0可以支持浏览器同时发出多个请求,但每个请求需要唯一标识,服务器可以不按请求的顺序返回多个响应,由浏览器自己把收到的响应和请求对应起来。可见,HTTP 2.0进一步提高了传输效率,因为浏览器发出一个请求后,不必等待响应,就可以继续发下一个请求。

HTTP 3.0为了进一步提高速度,将抛弃TCP协议,改为使用无需创建连接的UDP协议,目前HTTP 3.0仍然处于实验推广阶段。

什么是Servlet

JavaEE平台上,处理TCP连接,解析HTTP协议这些底层工作统统扔给现成的Web服务器去做,我们只需要把自己的应用程序跑在Web服务器上。为了实现这一目的,JavaEE提供了Servlet API,我们使用Servlet API编写自己的Servlet来处理HTTP请求,Web服务器实现Servlet API接口,

实现底层功能.

  1. // WebServlet注解表示这是一个Servlet,并映射到地址 hello.do
  2. @WebServlet(urlPatterns = "/hello.do")
  3. public class HelloServlet extends HttpServlet {
  4. protected void doGet(HttpServletRequest req, HttpServletResponse resp)
  5. throws ServletException, IOException {
  6. // 设置响应类型:
  7. resp.setContentType("text/html");
  8. // 获取输出流:
  9. PrintWriter pw = resp.getWriter();
  10. // 写入响应:
  11. pw.write("<h1>Hello, world!</h1>");
  12. // 最后不要忘记flush强制输出:
  13. pw.flush();
  14. }
  15. }

一个Servlet总是继承自HttpServlet,然后覆写doGet()doPost()方法。注意到doGet()方法传入了HttpServletRequestHttpServletResponse两个对象,分别代表HTTP请求和响应。我们使用Servlet API时,并不直接与底层TCP交互,也不需要解析HTTP协议,因为HttpServletRequestHttpServletResponse就已经封装好了请求和响应。以发送响应为例,我们只需要设置正确的响应类型,然后获取PrintWriter,写入响应即可。

而这样的一个项目最终会打包成一个*.war文件,运行这个文件,需要使用支持ServletAPI的Web容器(Web服务器)。

因此,我们首先要找一个支持Servlet API的Web服务器。

常用的服务器有:

  • Tomcat:由Apache开发的开源免费服务器;
  • Jetty:由Eclipse开发的开源免费服务器;
  • GlassFish:一个开源的全功能JavaEE服务器。

Servlet的生命周期

在通过一个URL路径发起对一个Servlet请求的过程中,其本质是在调用执行Servlet实例的doXXX()方法。该Servlet实例创建和使用的过程,被称为Servlet的生命周期。整个生命周期包括:实例化、初始化、服务、销毁。

  • 实例化:根据Servlet请求的路径(例如:home.do),查找该Servlet实例。如果实例不存在,则通过调用构造方法,完成Servlet实例的创建。
  • 初始化:通过该Servlet实例,调用init()方法,执行初始化的逻辑。
  • 服务:通过该Servlet实例,调用service()方法,如果子类没有重写该方法,则调用HttpServlet父类的service()方法,在父类的该方法中进行请求方式的判断,如果是GET请求,则调用doGet()方法;如果是POST请求,则调用doPost()方法;

如果子类重写doXXX()方法,则调用子类重写后的doXXX()方法;

如果子类没有重写doXXX()方法,则调用父类的doXXX()方法,在父类的方法实现中,返回一个405状态码的错误页面。

405状态码:代表请求的方式服务器不提供支持。

 4.销毁:服务器关闭或重启时,会销毁所有的Servlet实例,会调用Servlet实例的destroy()方法。

  1. package com.my.hyz.web.servlet;
  2. import java.io.IOException;
  3. import javax.servlet.ServletException;
  4. import javax.servlet.annotation.WebServlet;
  5. import javax.servlet.http.HttpServlet;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. //@WebServlet("/home.do")
  9. public class HomeServlet extends HttpServlet {
  10.  
  11. public HomeServlet() {
  12. System.out.println("实例化");
  13. }
  14. @Override
  15. public void init() throws ServletException {
  16. System.out.println("初始化");
  17. //super.init();
  18. }
  19.  
  20. @Override
  21. protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  22. System.out.println("调用Service实例");
  23. }
  24.  
  25. @Override
  26. public void destroy() {
  27. System.out.println("销毁咯!!!!");
  28. }
  29. @Override
  30. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  31. // TODO Auto-generated method stub
  32. System.out.println("哎呦get到了"+this.hashCode());
  33. }
  34. @Override
  35. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  36. System.out.println("哎呦post到了");
  37. }
  38. }

到此这篇关于Java中Servlet的生命周期详解的文章就介绍到这了,更多相关Java Servlet 生命周期内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号