Servlet生命周期
四个阶段简述
- 加载和实例化(调用构造方法):
- 当Servlet容器启动或客户端发送一个请求时,Servlet容器会查找内存中是否存在该Servlet实例,若存在,则直接读取该实例响应请求;如果不存在,就创建一个
Servlet实例
。- 初始化:
- 实例化后,Servlet容器将调用Servlet的
init()
方法进行初始化(一些准备工作或资源预加载工作)。- 就绪/服务:
- 初始化后,Servlet处于能
响应请求的就绪状态
。当接收到客户端请求时,调用service()
的方法处理客户端请求,HttpServlet的service()方法会根据不同的请求
转调不同的doXxx()
方法。- 销毁:
- 当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请求
- GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连
- GET提交的数据大小有限制(因为浏览器对URL的长度有限制)
- GET方式提交数据,会带来安全问题
- 效率高
- 对应的Servlet的方法是doGet
POST请求
- POST方法是把提交的数据放在HTTP包的Body中
- POST方法提交的数据没有限制
- POST提交的数据相对安全
- 效率相对没有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”);