最新消息:欢迎访问Android开发中文站!商务联系微信:loading_in

教你Servlet入门

Java基础 loading 4177浏览 0评论

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的理解了,如有问题或者好的建议欢迎大家不吝赐教!

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

您必须 登录 才能发表评论!