1

教你Servlet入门

 2 years ago
source link: http://www.androidchina.net/2007.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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的工作方式。

Center

从图中可以看出,真正管理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 : 是一个会话,下面是一张图:

Center

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

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

Center

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

转载请注明:Android开发中文站 » 教你Servlet入门


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK