ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
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的工作方式。 ![](https://box.kancloud.cn/2016-03-10_56e132d708e34.jpg) 从图中可以看出,真正管理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 工作原理解析](http://www.ibm.com/developerworks/cn/java/j-lo-servlet/)) ![](https://box.kancloud.cn/2016-03-10_56e132d7261f2.jpg) ♣ 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的实例 ~~~ <span style="font-family:FangSong_GB2312;font-size:18px;">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()方法进行处理      } }</span> ~~~ ♣ Cookie和Session Session 与 Cookie 的作用都是为了保持访问用户与后端服务器的交互状态。它们有各自的优点也有各自的缺陷。然而具有讽刺意味的是它们优点和它们的使用场景又是矛盾的,例如使用 Cookie 来传递信息时,随着 Cookie 个数的增多和访问量的增加,它占用的网络带宽也很大,试想假如 Cookie 占用 200 个字节,如果一天的 PV 有几亿的时候,它要占用多少带宽。所以大访问量的时候希望用 Session,但是 Session 的致命弱点是不容易在多台服务器之间共享,所以这也限制了 Session 的使用。 cookie建立在客户端,默认在指定路径下生成txt文件,cookie分为两种,一种是属于窗口(或子窗口)放在内存中;另一种属于文本(有生命周期)。当cookie被设置生命周期后,在生命周期的范围内,该cookie文件会被保留,一旦超出便会自动删除,释放空间资源。浏览器可以阻止服务器写入信息,也就是“选项”中“禁用cookies”. session : 是一个会话,下面是一张图: ![](https://box.kancloud.cn/2016-03-10_56e132d7449ba.jpg) 图中是张三和李四访问服务器的情况,首次访问该服务器时系统会自动为张三和李四分配一个session区域,且该区域具有一个唯一的sessionId。当浏览器关闭后,会断开与服务器的连接,当用户第二次访问该浏览器,会通过自身携带的sessionId来搜索对应的session区域。进而实现相应信息的判断,读写等操作。和cookie一样,都有一个生命周期,session超时后,该session资源会自动释放。 但是一旦cookie被浏览器禁用后,session将无法使用。这就需要使用“重写URL”的方法: ![](https://box.kancloud.cn/2016-03-10_56e132d75ebba.jpg) 以上就是这段时间我对Servlet的理解了,如有问题或者好的建议欢迎大家不吝赐教!