Web 技术成为当今主流的互联网 Web 应用技术之一,而 Servlet 是 Java Web 技术的核心基础。这篇博客主要帮助大家了解一个 Web 工程在 Servlet 容器中是如何启动的? S用户的请求是如何被分配给指定的 Servlet 的? Servlet 容器如何管理 Servlet 生命周期?cookie和session是如何应用的?

♣什么是Servlet?

    1)Servlet是Java类

     2)Servlet是一个继承httpServlet类的类

     3)这个在服务器端进行,用来处理客户端的请求

♣Servlet容器

   要介绍Servlet要先从Servlet容器说起,Servlet与Servlet容器的关系就像枪和子弹的关系,枪为子弹而生,子弹让枪有了很大的杀伤力。它们彼此依存、又相互独立发展。而从技术层面来讲,它们为了解耦,通过标准化接口来相互协作。

   在Tomcat的容器等级中Context容器直接影响Servlet的工作方式。

   

    从图中可以看出,真正管理Servlet的容器是Context容器,一个Context容器对应一个web工程。

♣ 初始化Servlet

      初始化 Servlet 在 StandardWrapper 的 initServlet 方法中,这个方法很简单就是调用 Servlet 的 init 的方法,同时把包装了 StandardWrapper 对象的 StandardWrapperFacade 作为 ServletConfig 传给 Servlet。Tomcat 容器为何StandardWrapperFacade 给 Servlet 对象将在后面做详细解析。

      如果该 Servlet 关联的是一个 jsp 文件,那么前面初始化的就是 JspServlet,接下去会模拟一次简单请求,请求调用这个 jsp 文件,以便编译这个 jsp 文件为 class,并初始化这个 class。

       这样 Servlet 对象就初始化完成了,事实上 Servlet 从被 web.xml 中解析到完成初始化,这个过程非常复杂,中间有很多过程,包括各种容器状态的转化引起的监听事件的触发、各种访问权限的控制和一些不可预料的错误发生的判断行为等等。但是我们只需要先抓住框架,对Servlet有一个基本的了解。

        下面是一幅关于初始化Servlet的时序图(选自Servlet 工作原理解析

♣ Servlet的生命周期

     Servlet生命周期就是指创建Servlet实例后,存在的时间以及何时销毁的整个过程.  

--Servlet生命周期有三个方法 init()方法: service()方法:Dispatches client requests to the protected service method destroy()方法:Called by the servlet container to indicate to a servlet that the servlet is being taken out of service.

--Servlet生命周期的各个阶段 ----实例化:Servlet容器创建Servlet实例 ----初始化:调用init()方法 ----服务:如果有请求,调用service()方法 ----销毁:销毁实例前调用destroy()方法 ----垃圾收集:销毁实例

♣ 关于Servlet的实例

package cn.dragon.servlet;
//导入相应的Jar包
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServletExample extends HttpServlet {   
  //用于获取请求  
  public void doGet(HttpServletRequest request, HttpServletResponse response)   
    throws ServletException, IOException {   
     response.setContentType("text/html;charset=GB2312"); //这条语句指明了向客户端发送的内容格式和采用的字符编码,当程序出现汉字的乱码,可以通过修改此处的字符编码来解决问题。  
     PrintWriter out = response.getWriter();    
     out.println(" 您好!"); //利用PrintWriter对象的方法将数据发送给客户端   
     out.close();   
  }   
  //用于处理客户端发送的POST请求   
  public void doPost(HttpServletRequest request, HttpServletResponse response)   
    throws ServletException, IOException {   
    doGet(request, response); //这条语句的作用是,当客户端发送POST请求时,调用doGet()方法进行处理   
  }
}

♣ Cookie和Session

         Session 与 Cookie 的作用都是为了保持访问用户与后端服务器的交互状态。它们有各自的优点也有各自的缺陷。然而具有讽刺意味的是它们优点和它们的使用场景又是矛盾的,例如使用 Cookie 来传递信息时,随着 Cookie 个数的增多和访问量的增加,它占用的网络带宽也很大,试想假如 Cookie 占用 200 个字节,如果一天的 PV 有几亿的时候,它要占用多少带宽。所以大访问量的时候希望用 Session,但是 Session 的致命弱点是不容易在多台服务器之间共享,所以这也限制了 Session 的使用。

        cookie建立在客户端,默认在指定路径下生成txt文件,cookie分为两种,一种是属于窗口(或子窗口)放在内存中;另一种属于文本(有生命周期)。当cookie被设置生命周期后,在生命周期的范围内,该cookie文件会被保留,一旦超出便会自动删除,释放空间资源。浏览器可以阻止服务器写入信息,也就是“选项”中“禁用cookies”.

        session : 是一个会话,下面是一张图:

        

        图中是张三和李四访问服务器的情况,首次访问该服务器时系统会自动为张三和李四分配一个session区域,且该区域具有一个唯一的sessionId。当浏览器关闭后,会断开与服务器的连接,当用户第二次访问该浏览器,会通过自身携带的sessionId来搜索对应的session区域。进而实现相应信息的判断,读写等操作。和cookie一样,都有一个生命周期,session超时后,该session资源会自动释放。

       但是一旦cookie被浏览器禁用后,session将无法使用。这就需要使用“重写URL”的方法:

      以上就是这段时间我对Servlet的理解了,如有问题或者好的建议欢迎大家不吝赐教!

你可能感兴趣的内容
0条评论

dexcoder

这家伙太懒了 <( ̄ ﹌  ̄)>
Owner