servlet的生命周期

 
重点内容:
Servlet的生命周期:Servlet交给Tomcat服务器运行的
 生命周期相关的方法生命周期:
  1.构造方法:当第一次访问servlet的时候调用,一般情况下,构造方法只会执行一次。(servlet在tomcat中是单例的)

  2.init():servlet初始化--在构造方法执行之后执行,并且也只会调用一次
  3.service()方法:每次调用servlet都会调用 (调用多次) 用于调用doGet() doPost() 处理请求(根据不同的请求调用不用的处理方法)
  4. destroy()方法:servlet销毁时调用 (重新部署项目、重启服务器调用、关闭服务器调用)

load-on-startup:servlet自动加载。如果servlet的初始化参数比较多,那么第一次访问的时候,就会占用很长时间。

将该servlet提前到服务器启动的时候创建
配置:

<servlet>
    <servlet-name>lifeCycleServlet</servlet-name>

    <servlet-class>com.igeekhome.servlet.LifeCycleServlet</servlet-class>

     <!-- 将该servlet提前到服务器启动的时候创建 -->

   <load-on-startup>1</load-on-startup> <!-- 数值:优先级 数值越大,优先级越低 -->

</servlet>
<servlet-mapping>
     <servlet-name>lifeCycleServlet</servlet-name>
    <url-pattern>/life</url-pattern>
</servlet-mapping>

  

  
 
HttpServletRequest:请求对象  获取请求参数
HttpServletResponse:响应对象  设置响应信息
ServletContext
ServletConfig:获取加载servlet时初始化参数(一个web应用可以有多个servletConfig对象,取某一个Servlet的初始化参数,只能针对该servlet对象的ServletCOnfig对象进行获取)
(1)创建:在初始化servlet时创建该对象
(2)获取:在init()有参方法中进行获取
     init(ServletConfig config)中的方法:
  • ① java.lang.String               getInitParameter(java.lang.String name)   获取指定初始化参数值
  • ② java.util.Enumeration<java.lang.String>     getInitParameterNames()  返回初始化参数的name(以枚举类型返回) 如果该servlet没有初始化参数 则返回空的枚举。
  • ServletContext                              getServletContext()        返回ServletContext对象
  • ④ java.lang.String                                            getServletName()  返回servlet的名称
 
 
ServletContext对象:servlet上下文对象,代表了web应用环境(一个web应用只有一个servlet上下文对象)
ServletConfig对象包含了ServletContext对象 

ServletContext对象:
  创建:在加载web应用的时候创建该对象
  获取:从ServletConfig中获取(从ServletRequest对象中也能获取)
 
常用方法:(数据共享方式:域对象,GET+URL)
域对象相关:(域对象:获取数据 设置数据 用于数据在不同资源间的共享)【 ServletContext是一个域对象】(方法)
 void
removeAttribute(java.lang.String name)  移除属性
 void
setAttribute(java.lang.String name, java.lang.Object object)   设置属性
 java.lang.Object
getAttribute(java.lang.String name)   获取属性
 java.util.Enumeration<java.lang.String>
getAttributeNames()   获取多个属性
java.lang.String
 返回当前应用路径
  java.lang.String  getInitParameter(java.lang.String name) 全局参数
 java.util.Enumeration<java.lang.String>
getInitParameterNames()    获取全局参数
boolean
setInitParameter(java.lang.String name, java.lang.String value)   设置初始化参数
   
 
与转发有关的方法:
getRequestDispatcher(java.lang.String path)  分派,转发
 
 
 
界面跳转:
 html->html
html->servlet
servlet->html
servlet->servlet
重定向(set)
转发(get)
1.地址发生改变,指向重定向后的地址
1.地址不会发生改变
2.重定向可以重定向到当前web资源,也可以定向到其他web资源或者网络资源都可以
2.转发只能转发到当前web资源
3.不能使用request域对象传值 ,重定向前后两个资源的request是不一样
3.转发可以使用request域对象传值
 
域对象:用于数据在不同资源间的共享
域对象: ServletContext   HttpServletRequest  HttpSession  PageContext
重定向:
(1)拼接参数(适用于简单字符串)
    例:reapose.sendReadirect("d?name=jack");
            Person person = new Person("jack",20);
  (2)使用域对象
         例 :  ServletContext sc = request.getServletContext( );
            sc.setAttribute("person",person);
          request.setAttribute("person",person );注意在“d”中无法接收因为重定向 “c”"d"是两个不同的request对象
重定向:
Servlet传递
response.sendRedirect("d");
config配置
获取web应用路径
System.out.println(context.getContextPath( ));
设置域对象
Context.setAttribute("name",张三);
获取域对象
System.out.println(context.getAttribute("name"));
移除对象
System.out.println(context.getAttribute("name") );
context.removetAttribute("name");
数据共享方式:
GET方式提交 拼接在URL后面
location.href = "c?name="+val;
局限性:只能传递string类型,不能传递对象
使用域对象
会话管理:对浏览器客户端与服务端的会话过程中的会话数据进行管理
现实:打开QQ   开始聊天   结束聊天     【聊天记录->会话数据】
Web:打开网页  浏览数据    关闭网页
域对象:HttpServletRequest(必须使用转发技术)  ServletContext(数据覆盖,因为整个web应用只有一个上下文对象)
 
转发
进行转发:
r equest.getRequestDisPathcher(“d”).forward(request,response);
跳转到index.jsp——html   转发地址保持不变
(1)获取上下文对象
   ServletContext = request.getServletContext();
(2)获取转发对象
    RequestDispatcher rd  = Context.getRequestDispatcher("/index.html“);
    RequestDispatcher rd  =request.getRequestDispatcher("/index.html“);
(3)执行转发
(4) 字符编码集
response.setHead("context-type","text/html",charset=utf-8);
request.setCharacterEncoading("utf-8");
 
 
实现过程:
1.通过配置文件获取到完整类名
2.通过完整的类名创建字节码对象
3.通过反射创建servlet对象(构造方法)
Object  obj = clazz.newInstance( );
4.获取init方法
Mothod m = object.getDeclareMethod("init",ServletConfig.class) 实例化servlet对象
5.调用init方法 
m.invoke(obj.config)
6.获取service方法
 
 
 
原文地址:https://www.cnblogs.com/liyang6/p/10497146.html