0


JavaEE—— Servlet生命周期篇

一、Servlet基础

  1. BS架构

** ** 首先,我们先介绍一下BS架构。当我们访问网站或者使用App时,大部分场景下都是基于Browser/Server 模式,简称BS架构,它的特点是,户端只需要浏览器,应用程序的逻辑和数据都存储在服务器端。浏览器只需要请求服务器,获取Web页面,并把Web页面展示给用户即可。Web页面具有极强的交互性。于Web页面是用HTML编写的,而HTML具备超强的表现力,并且,服务器端升级后,客户端无需任何部署就可以使用到新的版本,因此,BS架构升级非常容易。

 2. HTTP协议

   HTTP协议是一个基于TCP 协议之上的应用层协议,基于**请求——响应模式**。例如:我们

使用Chrome 浏览器查看百度首页的过程就是基于请求——响应模式。 在Web应用中,浏览器请求一个URL,服务器就把生成的HTML网页发送给浏览器,浏览器和服务器之间的传输协议是HTTP, 所以:

  • HTML是一种用来定义网页的文本,掌握HTML ,就可以编写网页;

  • HTTP 是在网络上传输HTML 的协议,用于浏览器和服务器的通信。

    3.Servlet 实现

      编写HTTP服务器其实是非常简单的,只需要先编写基于TCP协议的服务,然后在一个TCP连接中读取HTTP请求,发送HTTP响应即可。但是,要编写一个完善的HTTP服务器,以HTTP/1.1为例,需要考虑的包括:
    
  • 识别正确和错误的HTTP请求;

  • 识别正确和错误的HTTP头;

  • 复用TCP连接;

  • 复用线程;

  • IO异常处理;

       这些基础工作需要耗费大量的时间,并且经过长期测试才能稳定运行。如果我们只需要输出一个简单的HTML页面,就不得不编写上千行底层代码,那就根本无法做到高效而可靠地开发。因此,在JavaEE平台上,处理TCP连接,解析HTTP协议这些底层工作统统扔给现成的Web服务器去做,我们只需要把自己的应用程序跑在Web服务器上。为实现这一目的,**JavaEE 提供了Servlet API**,我们使用 Servlet API 编写自己的Servlet来处理HTTP请求,Web 服务器实现ServletAPI接口,实现底层功能:
    
                              ![](https://img-blog.csdnimg.cn/fa8f52544a8644c791c71923163af3b2.png)                            
    
      接下来,我们来做一个简单的Servlet:
    
// WebServlet注解表示这是一个Servlet,并映射到地址 hello.do
@WebServlet("/hello.do")
public class HelloServlet extends HttpServlet {
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        // 设置响应类型:
        resp.setContentType("text/html");
        // 获取输出流:
        PrintWriter out = resp.getWriter();
        // 写入响应:
        out.write("<h1>Hello, world!</h1>");
        // 最后不要忘记flush强制输出:
        out.flush();
    }
}

二、Servlet的生命周期

    1.Servlet概述

    简单来讲,一个Web App就是由一个或多个Servlet组成的,每个Servlet通过注

解说明自己能处理的路径。一个Web app完全可以有多个Servlet,分别映射不同的路
径。例如: HelloServlet能处理/hello.do这个路径的请求。

@WebServlet(urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
    ...
}

@WebServlet(urlPatterns = "/signin")
public class SignInServlet extends HttpServlet {
    ...
}

@WebServlet(urlPatterns = "/")
public class IndexServlet extends HttpServlet {
    ...
}

注:早期的Servlet需要要在web.xml中配置映射路径,但最新Servlet 版本只需要通过注解就可以完成映射。
因为浏览器发送请求的时候,还会有请求方法( HTTP Method ) :即GET、POST、PUT 等不同类型的请求。因此,我们要处理相应的请求,就得覆写对应的方法。例如要处理GET请求,我们就要覆写doGet()方法:

@WebServlet("/hello.do")
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ...
    }
}
    2. Servlet的生命周期

    在通过一个URL路径发起对一个Servlet请求的过程中,其本质是在调用执行Servlet实例的doXXX() 方法。该Servlet实例创建和使用的过程,被称为Servlet的生命周期。整个生命周期包括:**实例化、初始化、服务、销毁**。
  1. 实例化:根据Servlet请求的路径(例如: home.do ),查找该 Servlet的实例。如果实例不存在,则通过调用构造方法,完成Servlet 实例的创建。
  2. 初始化:通过该Servlet的实例,调用init() 方法,执行初始化的逻辑。
  3. 服务:通过该Servlet的实例,调用service() 方法,如果子类没有重写该方法,则调用HttpServlet父类的service() 方法,在父类的该方法中进行请求方式的判断,如果是GET请求,则调用doGet() 方法;如果是POST请求,则调用doPost() 方法;如果子类重写doXXX() 方法,则调用子类重写后的doXXX() 方法;如果子类没有重写doXXX() 方法,则调用父类的doXXX() 方法,在父类的方法实现中,返回一个405状态码的错误页面。 405状态码:代表请求的方式服务器不提供支持。
  4. ** **销毁:服务器关闭或重启时,会销毁所有的Servlet实例,会调用Servlet实例的destroy()方法。

三、常见的状态码

  • 200 OK:表示成功;
  • 301 Moved Permanently:示该URL已经永久重定向;
  • 302 Found:示该URL需要临时重定向;
  • 304 Not Modified:示该资源没有修改,客户端可以使用本地缓存的版本;
  • 400 Bad Request:表示客户端发送了一个错误的请求,例如参数无效;
  • 401 Unauthorized:表示客户端因为身份未验证而不允许访问该URL;
  • 403 Forbidden:示服务器因为权限问题拒绝了客户端的请求;
  • 404 Not Found:表示客户端请求了一个不存在的资源;
  • 500 Internal Server Error:表示服务器处理时内部出错,例如因为无法连接数据库;
  • 503 Service Unavailable:表示服务器此刻暂时无法处理请求。
标签: servlet java-ee java

本文转载自: https://blog.csdn.net/qq_45475528/article/details/126453722
版权归原作者 落日即是告别 所有, 如有侵权,请联系我们删除。

“JavaEE&mdash;&mdash; Servlet生命周期篇”的评论:

还没有评论