Servlet 2.x 规范
Servlet 2.x 规范
sun 公司制订的一种基于 Java 技术的 WEB 服务器功能的组件规范。1997 年六月,Servlet 1.0 版本发行,最新版本 Servlet 4.0 处于研发状态。
所谓的 Servlet 容器,有时候也称作为 Servlet 引擎,作为 Web 服务器或应用服务器的一部分。通过请求和响应对话,提供 Web 客户端与 Servlets 交互的能力。容器管理 Servlets 实例以及它们的生命周期。
一、Servlet 组件
Servlet 容器的组件大致可以分为以下几类:
Servlet 组件
├── 服务组件
| ├── javax.servlet.Servlet
| └── javax.servlet.Filter(since Servlet 2.3)
|
├── 上下文组件
| ├── javax.servlet.ServletContext
| ├── javax.servlet.http.HttpSession
| ├── javax.servlet.http.HttpServletRequest
| ├── javax.servlet.http.HttpServletResponse
| └── javax.servlet.http.Cookie(客户端)
|
├── 配置
| ├── javax.servlet.ServletConfig
| └── javax.servlet.FilterConfig(since Servlet 2.3 )
|
├── 输入输出
| ├── javax.servlet.ServletInputStream
| └── javax.servlet.ServletOutputStream
|
├── 异常
| └── javax.servlet.ServletException
|
├── 事件(since Servlet 2.3 )
| ├── 生命周期类型
| | ├── javax.servlet.ServletContextEvent
| | ├── javax.servlet.http.HttpSessionEvent
| | └── java.servlet.ServletRequestEvent
| ├── 属性上下文类型
| | ├── javax.servlet.ServletContextAttributeEvent
| | ├── javax.servlet.http.HttpSessionBindingEvent
| | └── javax.servlet.ServletRequestAttributeEvent
| |
├── 监听器(since Servlet 2.3)
| ├── 生命周期类型
| | ├── javax.servlet.ServletContextListener
| | ├── javax.servlet.http.HttpSessionListener
| | ├── javax.servlet.http.HttpSessionActivationListener
| | └── javax.servlet.ServletRequestListener
| |
└────└── 属性上下文类型
├── javax.servlet.ServletContextAttributeListener
├── javax.servlet.http.HttpSessionAttributeListener
├── javax.servlet.http.HttpSessionBindingListener
└── javax.servlet.ServletRequestAttributeListener

Servlet 接口:init(ServletConfig config)、service(ServletRequest req, ServletResponse res)、destroy()GenericServlet 抽象类:实现了 Servlet 接口中的 init, destroy 方法HttpServlet 抽象类:继承了 GenericServlet 抽象类,实现了 service()ServletConfig 接口:String getInitParameter(String paraName)ServletRequest 接口:HttpServletRequest 的父接口ServletResponse 接口:HttpServletResponse 的父接口
一、Servlet
1.1 Servlet 的生命周期
Servlet 的生命周期指 Servlet 容器如何去创建 Servlet 对象、如何调用 Servlet 对象的方法来处理请求、以及如何销毁 Servlet 对象的整个过程。
Servlet 生命周期的三个阶段:
(1) 初始化
当容器启动或者第一次执行时,Servlet#init(ServletConfig) 方法被执行,初始化当前 Servlet 。
(2) 处理请求
当 HTTP 请求到达容器时,Servlet#service(ServletRequest, ServletResponse) 方法被执行,来处理请求。
(3) 销毁
当容器关闭时,容器将会调用 Servlet#destroy() 方法被执行,销毁当前 Servlet。
1.2 Servlet 如何处理请求资源路径
Servlet 容器会先假设访问的是一个 Servlet ,会依据应用名(appname)找到应用所在的文件夹,然后找到 web.xml 文件。
匹配
- 精确匹配(完全匹配)
- 通配符匹配:使用 * 匹配任意长度的字符串。eg: /*
- 后缀匹配:使用 . 开头,后面可以接任意字符。eg: .do
如果都不匹配,则容器认为访问的是一个静态资源文件(html/css/js),如果找到则返回,否则返回404。
1.3 Servlet 是如何运行的?
- 浏览器依据 ip, port 建立与 Servlet 容器之间的连接。
- 浏览器将请求数据打包(即按照 http 协议的要求,将相关数据封闭成一个数据包,即请求数据包)并发送给 Servlet 容器。
- Servlet 容器解析请求数据包,并将解析后的数据放到 request 对象上。同时创建一个 response 对象。
- Servlet 容器依据请求资源路径找到 Servlet 的配置,然后创建 Servlet 对象。
- Servlet 调用 service 方法,并且会将事先创建好的 request 对象和 response 对象作为 service 方法的参数传递给 Servlet 对象。
- Servlet 通过 request 对象获得请求参数,进行相应的处理,然后将处理结果写到 response 对象上。
- Servlet 读取 response 对象上的数据,然后将处理结果打包(响应数据包)并发送给浏览器。
- 浏览器解析响应数据包,将返回的数据展现给用户。
1.4 实例
public class HelloWorldServlet extends HttpServlet {
public void service(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException {
//1. 读请求参数值
String qtyStr = req.getParameter("qty");
int qty = Integer.parseInt(qtyStr);
//2. 处理请求
String rs = "";
for (int i = 0; i < qty; i++) {
rs += "<h1>Hello World</h1>";
}
//3. 设置一个消息头 content-type,告诉浏览器返回的数据类型是一个 html 文档及编码格式
//告诉服务器使用 out 输出时使用指定的编码格式进行编码
res.setContentType("text/html;charset=utf-8");
//4、获得一个输出流
PrintWriter out = res.getWriter();
//5、调用流的方法进行输出,其实质是将处理结果写到了 res 对象上
out.println(rs);
out.close();
}
}
配置 WEB-INF/web.xml 配制文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<servlet>
<servlet-name>helloWord</servlet-name>
<!--类名要完整(包名,类名都要全)-->
<servlet-class>com.herolei.HelloWorldServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>helloWord</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
启动程序,访问 http://localhost:8080/hello?qty=30
补充:web 打包后的目录如下
appname(应用名)
└──WEB-INF
├──classes .class文件
├──lib .jar文件,lib文件夹可选
└──web.xml 部署描述文件
二、Listener
Servlet 规范当中定义的一种特殊的组件,用来监听容器产生的事件并进行处理。
容器会产生两大类事件:
- 生命周期相关的事件:容器在创建或者销毁 request, servletContext(Servlet 上下文)时产生的事件。对应的接口有 ServletRequestListener、ServletContextListener。
- 绑定相关的事件:容器调用了 request, servletContext 的 setAttribute, removeAttribute 时产生的事件。。对应的接口有 ServletContextAttributeListener、ServletRequestAttributeListener。
public interface ServletContextListener extends EventListener {
// 容器初始化
void contextInitialized(ServletContextEvent ctx);
// 容器销毁
void contextDestroyed(ServletContextEvent ctx);
}
public interface ServletContextAttributeListener extends EventListener {
void attributeAdded(ServletContextAttributeEvent event);
void attributeRemoved(ServletContextAttributeEvent event);
void attributeReplaced(ServletContextAttributeEvent event);
}
三、Filter
public interface Filter {
// 初始化 Filter
void init(FilterConfig filterConfig) throws ServletException;
// 调用,如果要继续调用下一个 Filter,需要调用 chain.doFilter(request, response)
void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException;
// 销毁
public void destroy();
}
public interface FilterChain {
void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException;
}
Filter 生命周期如下:
(1) 初始化
当容器启动时,Filter#init(FilterConfig) 方法被执行,初始化当前 Filter。
(2) 处理请求
当 HTTP 请求到达容器时,Filter#doFilter(ServletRequest,ServletResponse,FilterChain) 方法被执行,来拦截请求,在 Servlet#service(ServletRequest,ServletResponse) 方法调用前执行。
(3) 销毁
当容器关闭时,容器将会调用 Filter#destroy() 方法被执行,销毁当前 Filter。
参考:
每天用心记录一点点。内容也许不重要,但习惯很重要!
Servlet 2.x 规范的更多相关文章
- JBoss和Tomcat版本、及Servlet、JSP规范版本对应一览 【转】
原文地址:http://blog.csdn.net/hills/article/details/40896357 JBoss和Tomcat版本.及Servlet.JSP规范版本对应一览 JBossAS ...
- Spring MVC(一)Servlet 2.x 规范在 Spring MVC 中的应用
Spring MVC(一)Servlet 2.x 规范在 Spring MVC 中的应用 Spring 系列目录(https://www.cnblogs.com/binarylei/p/1019869 ...
- Servlet 3.0 规范(二)注解驱动和异步请求
Servlet 3.0 规范(二)注解驱动和异步请求 在 Servlet 3.0 时支持注解启动,不再需要 web.xml 配制文件. 一.Servlet 3.0 组件 Servlet 容器的组件大致 ...
- Servlet和JSP规范及版本对应关系
JSR 53: JavaTM Servlet 2.3 and JavaServer PagesTM 1.2 JSR 154: JavaTM Servlet 2.4 JSR 154: JavaTM Se ...
- Servlet 3.1 规范
在线版目录 Servlet3.1规范翻译——前言 Servlet3.1规范翻译——概览 Servlet3.1规范翻译——Servlet Context Servlet3.1规范翻译——Response ...
- servlet是一组规范--Servlet是JavaEE规范的一种
Java Servlet API是Servlet容器和Servlet之间的接U,它定义了Servlet的各种方法, 还定义了Servlet容器传送给Servlet的对象类,其中最重要的是请求对象Ser ...
- Servlet 2.4 规范之第一篇:概览
写在前面的话: 本系列是对<Java Servlet Specification Version 2.4>的完全翻译,力争但不保证完美表达出英文原文的思想内涵.如有疏漏之处,还 ...
- Servlet 2.3 规范
Servlet2.3规范 第一章: servlet2.3规范用到了一下的一些规范:J2EE.JSP1.1.JNDI 在14章中讲述了规范中的所有的classes类或接口(改文中不讲述).对开发者而言以 ...
- Servlet 2.4 规范之第七篇:过滤器
过滤器是一套java组件,用于在请求—>资源—>应答的这一过程中即时转换处理负载和头信息. 本章讲述了Servlet 2.4 API中一些类和方法,这些类和方法提供了一套轻量级框架用于过滤 ...
随机推荐
- 论Ubuntu下的docker多难搭建
慷慨一下: 上周四开始打算在Ubuntu系统下面熟悉操作一下docker,所以深知在本地的虚拟机上搭建一个docker非常的easy. 但是,要下载一个镜像,真是太难了.基本可以说是下载不了的.于是乎 ...
- substring 比较(c#和Java)
Java中 string str = "123456"; str .substring(5); 结果:6 Substring(A)表示从原字符串的指定索引号A开始截取直到原字符串的 ...
- angularjs 获取$scope对象
参考 https://blog.csdn.net/u011974399/article/details/77865293 angular.element("[ng-controller=xx ...
- PUDN用户名与密码
Pudn 用户名与密码 boumang8171 que2538 温馨提示:1. 95%的用户第一次登录不成功,都是因为在复制粘贴帐号和密码时,把空格也复制粘贴上了.2. 如果连续3次帐号或密 ...
- 彻底弄懂css中单位px和em,rem的区别
PX:PX实际上就是像素,用PX设置字体大小时,比较稳定和精确.但是这种方法存在一个问题,当用户在浏览器中浏览我们制作的Web页面时,如果改变了浏览器的缩放,这时会使用我们的Web页面布局被打破.这样 ...
- phpstorm添加站点
1.在界面上快捷键 ctrl+alt+s 或打开File->settings 2.找到Deployment 设置完后确定即可使用.
- ucore-lab1-练习2report
练习二实验报告 1.从CPU加电后执行的第一条指令开始,单步跟踪BIOS: 1.1默认的gdb需要进行一些额外的配置才能进行qemu的调试任务,qemu和gdb之间使用网络端口1234进行通信. la ...
- 第二章 向量(f)归并排序
- js 小结
<script type="text/javascript"> var hotalAddJs = { makeSubmitDataHandler: function ( ...
- Lua入门教程
什么是Lua Lua 是一个小巧的脚本语言.是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组,由Rober ...