Servlet生命周期

  • 1.从第一次调用到服务器关闭
  • 2.web.xml中配置load-on-startup,则从服务器启动到服务器关闭

 

Servlet 生命周期方法

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

 

执行过程

1.接收浏览器请求(web.xml寻找类)

  • 浏览器向服务器请求时,服务器不会直接执行我们的类,而是到web.xml里寻找路径名
  • ①:第一步,浏览器输入访问路径后,携带了请求行,头,体
  • ②:第二步,根据访问路径找到已注册的servlet名称(即图中的mapping)
  • ③:第三步,根据映射找到对应的servlet名
  • ③:第四步,根据根据servlet名找到我们全限定类名,既我们自己写的类

Servlet问题整理

 

2.服务器创建对象(通过反射实例化)

服务器找到全限定类名后,通过反射创建对象,同时也创建了servletConfig,里面存放了一些初始化信息(注意服务器只会创建一次servlet对象,所以servletConfig也只有一个)

 

3.调用init方法

  • ①:对象创建好之后,首先要执行init方法,但是我们发现我们自定义类下没有init方法,所以程序会到其父类HttpServlet里找
  • ②:我们发现HttpServlet里也没有init方法,所以继续向上找,既向其父类GenericServlet中继续寻找,在GenericServlet中我们发现了init方法,则执行init方法(对接口Servlet中的init方法进行了重写)
  • 注意:
  • 在GenericServlet中执行public void init(ServletConfig config)方法的时候,又调用了自己无参无方法体的init()方法,其目的是为了方便开发者,如果开发者在初始化的过程中需要实现一些功能,可以重写此方法

4.调用service方法(到父类HTTPServlet执行service方法,并判断后执行)

  • 服务器会先创建两个对象:ServletRequest请求对象和ServletResponse响应对象,用来封装浏览器的请求数据和封装向浏览器的响应数据
  • ①:接着服务器会默认在我们写的类里寻找service(ServletRequest req, ServletResponse res)方法,但是DemoServlet中不存在,那么会到其父类中寻找
  • ②:到父类HttpServlet中发现有此方法,则直接调用此方法,并将之前创建好的两个对象传入
  • ③:然后将传入的两个参数强转,并调用HttpServlet下的另外一个service方法
  • ④:接着执行service(HttpServletRequest req, HttpServletResponse resp)方法,在此方法内部进行了判断请求方式,并执行doGet和doPost,但是doGet和doPost方法已经被我们自己重写了,所以会执行我们重写的方法看到这里,你或许有疑问:
  •  

为什么我们不直接重写service方法?因为如果重写service方法的话,我们需要将强转,以及一系列的安全保护判断重新写一遍,会存在安全隐患

 

5.向浏览器响应

处理完数据后,将数据响应到浏览器(响应行、头、体)

 

doGet()方法和doPost()方法有什么区别?

  •  get一般用于请求, 其实就是发送了一个 get 请求,它的主要特征是请求服务器返回资源
  • post一般用于表单的提交,相当于是把信息提交给服务器,等待服务器作出响应
  • doGet:路径传参。效率高,安全性差
  • GET方法会把名值对追加在请求的URL后面。因为URL对字符数目有限制,进而限制了用在客户端请求的参数值的数目。并且请求中的参数值是可见的,因此,敏感信息不能用这种方式传递。
  • doPOST:实体传参。效率低,安全性好
  • POST方法通过把请求参数值放在请求体中来克服GET方法的限制,因此,可以发送的参数的数目是没有限制的。最后,通过POST请求传递的敏感信息对外部客户端是不可见的。

 

HTTP请求信息与响应信息

 

  • HTTP请求信息由3部分组成:
  • 请求报文(请求行/请求头/请求数据/空行)
  • 请求行:请求方法字段、URL字段和HTTP协议版本
    • 例如:GET /index.html HTTP/1.1
    • get方法是将数据拼接在url后面,传递参数受限
  • --------------------------------------------------------------------------
  • HTTP响应信息由3部分组成:
  • 响应报文(状态行、响应头、响应正文)
  • 状态行是由:HTTP-Version+Status-Code+Reason-Phrase
    • 比如:HTTP/1.1 200 ok
    • 分别表示http版本 + 状态码 + 状态代码的文本描述

 

Request、Response和Session的生命周期

  • request的生命周期是request请求域,一个请求结束(页面访问结束),则request、response都结束
  • session:
  • 会话作用域,当用户首次访问时,产生一个新的会话,以后服务器就可以记住这个会话状态。生命周期:会话超时,或者服务器端强制使会话失效。
  • session的生命周期是session会话域,打开一个浏览器,请求一个网站的页面后,Session开始,当session超过时间限制(一般是20分种)后,session注销而失效
  • 或是人为使用session.invalidate();使用session失效;
  • 或是关闭浏览器后,session还存在,但是这里已经无法获取权session了,过一会它还是失效

相关文章: