Servlet生命周期及其他

Servlet生命周期

四个阶段简述

  1. 加载和实例化(调用构造方法):
    • 当Servlet容器启动或客户端发送一个请求时,Servlet容器会查找内存中是否存在该Servlet实例,若存在,则直接读取该实例响应请求;如果不存在,就创建一个Servlet实例
  2. 初始化:
    • 实例化后,Servlet容器将调用Servlet的init()方法进行初始化(一些准备工作或资源预加载工作)。
  3. 就绪/服务:
    • 初始化后,Servlet处于能响应请求的就绪状态。当接收到客户端请求时,调用service()的方法处理客户端请求,HttpServlet的service()方法会根据不同的请求转调不同的doXxx()方法。
  4. 销毁:
    • 当Servlet容器关闭时,Servlet实例也随时销毁。其间,Servlet容器会调用Servlet 的destroy()方法去判断该Servlet是否应当被释放(或回收资源)。

Servlet生命周期详解介绍

  • 阶段一
    • 实例化阶段是Servlet生命周期中的第一步,由Servlet容器调用Servlet的构造器创建一个具体的Servlet对象的过程。
    • 而这个创建的时机可以是在容器收到针对这个组件的请求之后,即用了才创建;也可以在容器启动之后立刻创建实例,而不管此时Servlet是否使用的上。
    • 使用如下代码可以设置Servlet是否在服务器启动时就执行创建
    • <load-on-startup>1</load-on-startup>
  • 阶段二
    • Servlet在被加载实例化之后,必须要初始化它。
    • 在初始化阶段,init()方法会被调用。
    • 这个方法在javax.servlet.Servlet接口中定义。其中,方法以一个ServletConfig类型的对象作为参数。
    • ServletConfig对象由Servlet引擎负责创建,从中可以读取到事先在web.xml文件中通过<init-param>节点配置的多个name-value名值对。
    • ServletConfig对象还可以让Servlet接受一个ServletContext对象。
    • 一般情况下,init方法不需要编写,因GenericServlet已经提供了init方法的实现,并且提供了getServletConfig方法来获得ServletConfig对象。
    • 注:init方法只被执行一次
  • 阶段三
    • Servlet被初始化以后就处于响应请求的就绪状态。每个对Servlet的请求由一个ServletRequest对象代表,Servlet给客户端的响应由一个ServletResponse对象代表。
    • 当客户端有一个请求时,容器就会将请求与响应对象转给Servlet,以参数的形式传给service方法。service方法由javax.servlet.Servlet定义,由具体的Servlet实现
    • HttpServlet将service方法拆分了。doGet和doPost
  • 阶段四
    • Servlet容器在销毁Servlet对象时会调用destroy方法来释放资源。
    • 通常情况下Servlet容器停止或者重新启动都会引起销毁Servlet对象的动作
    • 但除此之外,Servlet容器也有自身管理Servlet对象的准则,整个生命周期并不需要人为进行干预

请求方式

  • 默认的请求方式是GET请求

GET请求

  1. GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连
  2. GET提交的数据大小有限制(因为浏览器对URL的长度有限制)
  3. GET方式提交数据,会带来安全问题
  4. 效率高
  • 对应的Servlet的方法是doGet

POST请求

  1. POST方法是把提交的数据放在HTTP包的Body中
  2. POST方法提交的数据没有限制
  3. POST提交的数据相对安全
  4. 效率相对没有GET高
  • 对应的Servlet的方法是doPost

解决乱码问题

  • 为什么表单中会产生中文乱码
    • 产生乱码,就是因为服务器和客户端沟通的编码不一致造成的
    • 因此解决的办法是:在客户端和服务器之间设置一个统一的编码,之后就按照此编码进行数据的传输和接收
  • 解决get中文乱码的代码:
    • String name=request.getParameter(“name”);
    • name=new String(name.getBytes(“ISO8859-1”),”UTF-8”);
  • 解决POST中文乱码代码如下:
    • 当获取用户输入参数时,可通过下面方式解决乱码
    • request.setCharacterEncoding(“UTF-8”);
  • Servlet输出中文内容:
    • 目的是为了控制浏览器的行为,即控制浏览器用UTF-8进行解码;
    • 在响应报文中添加一个响应头content-type:text/html;charset=utf-8
    • response.setContentType(“text/html;charset=UTF-8”);
    • 目的是用于 response.getWriter()输出的字符流的乱码问题,如果是 response.getOutputStream()是不需要此种解决方案的;
    • 因为这句话的意思是为了将response对象中的数据以UTF-8解码后发向浏览器;
    • 缺点:导致浏览器会用错编码
    • response.setCharacterEncoding(“UTF-8”);


转载请注明:Memory的博客 » 点击阅读原文

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦