教你Servlet入门
最后更新于:2022-04-01 19:49:25
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://docs.gechiui.com/gc-content/uploads/sites/kancloud/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://docs.gechiui.com/gc-content/uploads/sites/kancloud/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的实例
~~~
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 : 是一个会话,下面是一张图:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-10_56e132d7449ba.jpg)
图中是张三和李四访问服务器的情况,首次访问该服务器时系统会自动为张三和李四分配一个session区域,且该区域具有一个唯一的sessionId。当浏览器关闭后,会断开与服务器的连接,当用户第二次访问该浏览器,会通过自身携带的sessionId来搜索对应的session区域。进而实现相应信息的判断,读写等操作。和cookie一样,都有一个生命周期,session超时后,该session资源会自动释放。
但是一旦cookie被浏览器禁用后,session将无法使用。这就需要使用“重写URL”的方法:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-10_56e132d75ebba.jpg)
以上就是这段时间我对Servlet的理解了,如有问题或者好的建议欢迎大家不吝赐教!
';