JavaWeb之servlet管理机制
一、什么是Servlet
简单的说,浏览器发出请求到tocat服务器,服务器就会初始化一个servlet实例(servlet采取生命托管的方式实现单例,不存在时才会创建实例),servlet示例会启动一个线程来处理该请求,并进行响应该请求,动态生成web内容
二、什么是Tomcat服务器
三、web.xml配置文件解析
1 <servlet>
2 <!-- servlet的内部名称,自定义 -->
3 <servlet-name>login</servlet-name>
4 <!-- servlet的类全名:包名+类名 -->
5 <servlet-class>com.TestServlet.servlet.LoginServlet</servlet-class>
6 <!-- 当servlet对象立即加载时 url?后携带的重要信息, 在加载servlet类是可以直接加载进去
7 可以通过可以在init方法内使用带ServletConfig的参数读取
8 String value = config.getInitParameter("key");//某一个key对应的value
9 Enumeration en = config.getInitParameterNames();//获取全部的key
10 String name = config.getServletName();//获取当前Servlet类名
11 ServletContext application = config.getServletContext();//获取全局上下文对象
12 -->
13 <init-param>
14 <param-name>name1</param-name>
15 <param-value>value1</param-value>
16 <param-name>name2</param-name>
17 <param-value>value2</param-value>
18 </init-param>
19 <!-- servlet对象创建优先级 -->
20 <load-on-startup>1</load-on-startup>
21 </servlet>
22 <!-- servlet的映射配置 -->
23 <servlet-mapping>
24 <!-- servlet的内部名称,和上面的自定义servlet-name对应的标签名称一致 -->
25 <servlet-name>login</servlet-name>
26 <!-- servlet的映射路径(访问serclet的名称) -->
27 <url-pattern>/index</url-pattern>
28 </servlet-mapping>
29 <!-- 整体详情解析 以 http://localhost:8080/index-->
30 <!-- 通过解析url得到 index 去标签 servlet-mapping中的url-pattern标签进行匹配,
31 若是匹配上,得到servlet-name标签中的 login定位符,在通过 login 到
32 servlet标签下的 servlet-name 进行匹配,若是匹配上获取 servlet-class标签的
33 类全名 com.TestServlet.servlet.LoginServlet, 在通过反射技术创建 LoginServlet对象实例
34 -->
四、servlet类的继承关系
1 public class LoginServlet extends HttpServlet {
2
3 @Override
4 protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
5 super.service(req, resp);
6 }
7
8 @Override
9 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
10 super.doGet(req, resp);
11 }
12
13 @Override
14 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
15 super.doPost(req, resp);
16 }
17 }
1 // HtppServlet继承类GenericServlet类
2 public abstract class HttpServlet extends GenericServlet {}
3 /* GenericServlet类,实现了三个接口,分别为
4 Servlet: servlet接口
5 ServletConfig: 封装servlet配置信息
6 Serializable: 序列化接口,在反序列化时进行版本比对
7 */
8 public abstract class GenericServlet implements Servlet, ServletConfig, Serializable {}
servlet类源码解析
1 public interface Servlet {
2 /**
3 * servlet声明周期
4 * 1、init() 初始化,仅第一次servlet时执行,同时会携带一个ServletConfig参数
5 * 2、service() 用户处理请求,每次访问servlet时都会执行一次
6 * 3、destory() 重新配置或者重新部署项目时执行,用于销毁servlet对象,销毁后的对象由gc进行回收
7 * */
8 void init(ServletConfig var1) throws ServletException;
9
10 ServletConfig getServletConfig();
11
12 void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
13
14 String getServletInfo();
15
16 void destroy();
17 }
1 public interface ServletConfig {
2 // 获取当前servlet类名
3 String getServletName();
4 // 获取servlet全局上下文
5 ServletContext getServletContext();
6 // 获取web.xml文件中<init-param>标签下某一个<param-name>标签的值
7 String getInitParameter(String var1);
8 // 获取web.xml文件中<init-param>标签下所有的<param-name>标签的值
9 Enumeration<String> getInitParameterNames();
10 }
1 // 序列化
2 private static final long serialVersionUID = 1L;
3 // ServletConfig 属性
4 private transient ServletConfig config;
5 // 无参构造方法
6 public GenericServlet() {
7 }
8 // 实现了servlet中的destroy() 方法
9 public void destroy() {
10 }
11 // 重写了并实现了ServletConfig中的getInitParameter(),便于获取web.xml配置文件中的<init-param>标签下某一个<param-name>标签的值
12 public String getInitParameter(String name) {
13 return this.getServletConfig().getInitParameter(name);
14 }
15 // 重写了并实现了ServletConfig中的getInitParameter(),便于获取web.xml配置文件中的<init-param>标签下所有的<param-name>标签的值
16 // 返回Enumeration 可以采取while循环获取所有key值
17 // hasMoreElements 判断是否还有key
18 // nextElement(); 获取key值
19 public Enumeration<String> getInitParameterNames() {
20 return this.getServletConfig().getInitParameterNames();
21 }
22
23 // 获取当前servlet对象
24 public ServletConfig getServletConfig() {
25 return this.config;
26 }
27
28 // 获取servlet全局上下文
29 //
30 public ServletContext getServletContext() {
31 return this.getServletConfig().getServletContext();
32 }
33
34 public String getServletInfo() {
35 return "";
36 }
37
38 // 实现了init初始化方法,将config对象赋值给自己的config属性中,从而达到在servlet第一此加载时,就拥有config对象
39 public void init(ServletConfig config) throws ServletException {
40 this.config = config;
41 this.init();
42 }
43
44 // 添加了一个Init无参方法,可以提供用户进行重写
45 public void init() throws ServletException {
46 }
47
48 // 增加了自己的log方法,控制台打印日志
49 public void log(String msg) {
50 this.getServletContext().log(this.getServletName() + ": " + msg);
51 }
52
53 public void log(String message, Throwable t) {
54 this.getServletContext().log(this.getServletName() + ": " + message, t);
55 }
56
57 // 该类由用户自己定以 所以没有实现接口方法
58 public abstract void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
59
60 // 获取serlet类对象名
61 public String getServletName() {
62 return this.config.getServletName();
63 }
1 // doGet方法,未进行任何处理,
2 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
3 String protocol = req.getProtocol();
4 String msg = lStrings.getString("http.method_get_not_supported");
5 if (protocol.endsWith("1.1")) {
6 resp.sendError(405, msg);
7 } else {
8 resp.sendError(400, msg);
9 }
10
11 }
12
13 // doPost方法,未进行任何处理,
14 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
15 String protocol = req.getProtocol();
16 String msg = lStrings.getString("http.method_post_not_supported");
17 if (protocol.endsWith("1.1")) {
18 resp.sendError(405, msg);
19 } else {
20 resp.sendError(400, msg);
21 }
22
23 }
24
25 // 提供了自己的受保护的service方法,便于子类访问,类中未进行具体操作,而是通过获取请求类型来定位调用方法来处理
26 protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
27 String method = req.getMethod();
28 long lastModified;
29 if (method.equals("GET")) {
30 lastModified = this.getLastModified(req);
31 if (lastModified == -1L) {
32 this.doGet(req, resp);
33 } else {
34 long ifModifiedSince;
35 try {
36 ifModifiedSince = req.getDateHeader("If-Modified-Since");
37 } catch (IllegalArgumentException var9) {
38 ifModifiedSince = -1L;
39 }
40
41 if (ifModifiedSince < lastModified / 1000L * 1000L) {
42 this.maybeSetLastModified(resp, lastModified);
43 this.doGet(req, resp);
44 } else {
45 resp.setStatus(304);
46 }
47 }
48 } else if (method.equals("HEAD")) {
49 lastModified = this.getLastModified(req);
50 this.maybeSetLastModified(resp, lastModified);
51 this.doHead(req, resp);
52 } else if (method.equals("POST")) {
53 this.doPost(req, resp);
54 } else if (method.equals("PUT")) {
55 this.doPut(req, resp);
56 } else if (method.equals("DELETE")) {
57 this.doDelete(req, resp);
58 } else if (method.equals("OPTIONS")) {
59 this.doOptions(req, resp);
60 } else if (method.equals("TRACE")) {
61 this.doTrace(req, resp);
62 } else {
63 String errMsg = lStrings.getString("http.method_not_implemented");
64 Object[] errArgs = new Object[]{method};
65 errMsg = MessageFormat.format(errMsg, errArgs);
66 resp.sendError(501, errMsg);
67 }
68
69 }
70
71 // 实现了接口servlet类中的service()方法,但没有将具体处理,仅仅将ServletRequest和ServletResponse进行
72 // 此处体现了面向对象思想,也体现了适配器模式的应用。
73 public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
74 HttpServletRequest request;
75 HttpServletResponse response;
76 try {
77 request = (HttpServletRequest)req;
78 response = (HttpServletResponse)res;
79 } catch (ClassCastException var6) {
80 throw new ServletException("non-HTTP request or response");
81 }
82
83 // 调用该类的受保护类
84 this.service(request, response);
85 }
JavaWeb之servlet管理机制的更多相关文章
- Tomcat的Session管理机制
>>Session和Cookie请求的过程 Http连接本身是无状态的,即前一次发起的连接跟后一次没有任何关系,是属于两次独立的连接请求,但是互联网访问基本上都是需要有状态的,即服务器需要 ...
- web状态管理机制
引入:b/s(浏览器/服务器模式)区别于winform的是winform中只加载一次页面构造函数,而b/s中只要点击按钮或者其他涉及后台的操作都会调用后台代码.一般情况下为了防止服务器过载,b/s不会 ...
- Tomcat中session的管理机制
1. 请求过程中的session操作: 简述:在请求过程中首先要解析请求中的sessionId信息,然后将sessionId存储到request的参数列表中.然后再从 request获取s ...
- 浅谈Linux内存管理机制
经常遇到一些刚接触Linux的新手会问内存占用怎么那么多?在Linux中经常发现空闲内存很少,似乎所有的内存都被系统占用了,表面感觉是内存不够用了,其实不然.这是Linux内存管理的一个优秀特性,在这 ...
- ARC内存管理机制详解
ARC在OC里面个人感觉又是一个高大上的牛词,在前面Objective-C中的内存管理部分提到了ARC内存管理机制,ARC是Automatic Reference Counting---自动引用计数. ...
- 深入了解C#系列:谈谈C#中垃圾回收与内存管理机制
今天抽空来讨论一下.Net的垃圾回收与内存管理机制,也算是完成上个<WCF分布式开发必备知识>系列后的一次休息吧.以前被别人面试的时候问过我GC工作原理的问题,我现在面试新人的时候偶尔也会 ...
- 【Cocos2d-x 3.x】内存管理机制与源码分析
侯捷先生说过这么一句话 : 源码之前,了无秘密. 要了解Cocos2d-x的内存管理机制,就得阅读源码. 接触Cocos2d-x时, Cocos2d-x的最新版本已经到了3.2的时代,在学习Coco ...
- Spark 1.6以后的内存管理机制
Spark 内部管理机制 Spark的内存管理自从1.6开始改变.老的内存管理实现自自staticMemoryManager类,然而现在它被称之为"legacy". " ...
- Senparc.Weixin.MP SDK 微信公众平台开发教程(十六):AccessToken自动管理机制
在<Senparc.Weixin.MP SDK 微信公众平台开发教程(八):通用接口说明>中,我介绍了获取AccessToken(通用接口)的方法. 在实际的开发过程中,所有的高级接口都需 ...
随机推荐
- CPU中的程序是怎么运行起来的
总述 最近一位朋友问我,开发的代码是怎么在芯片运行起来的,我就开始给他介绍代码的预编译.汇编.编译.链接然后到一般的文件属性,再到代码运行.但是大佬问了我一句,CPU到底是怎么执行到每一个逻辑的,就讲 ...
- Windows10与虚拟机中CentOS-7.2进行telnet通信 出现在端口23处失败【解决】
(telnet服务是由xinetd守护,所以安装和启动都要用到xinetd) 1.先检查CentOS7.0是否已经安装以下几个安装包:telnet-server.telnet.xinetd.命令如下: ...
- 母函数 <普通母函数(HDU - 1028 ) && 指数型母函数(hdu1521)>
给出我初学时看的文章:母函数(对于初学者的最容易理解的) 普通母函数--------->HDU - 1028 例题:若有1克.2克.3克.4克的砝码各一 枚,能称出哪几种重量?各有几种可能方案? ...
- js--执行上下文和作用域相关问题
前言 如果你是或者你想成为一名合格的前端开发工作者,你必须知道JavaScript代码在执行过程,知道执行上下文.作用域.变量提升等相关概念,并且熟练应用到自己的代码中.本文参考了你不知道的JavaS ...
- Linux-压缩/解压缩命令
目录 Linux系统中常见的压缩包格式 gzip 压缩命令 zip 压缩命令 tar 压缩命令(归档) Linux系统中常见的压缩包格式 格式 压缩工具 .zip zip压缩工具 .gz gzip压缩 ...
- codeforces 1045I Palindrome Pairs 【stl+构造】
题目:戳这里 题意:给1e5个字符串,问有多少对字符串组合,满足最多只有一种字符有奇数个. 解题思路:每种情况用map存一下就行了.感觉这题自己的代码思路比较清晰,所以写个题解记录一下 附ac代码: ...
- SPOJ VLATTICE Visible Lattice Points(莫比乌斯反演)题解
题意: 有一个\(n*n*n\)的三维直角坐标空间,问从\((0,0,0)\)看能看到几个点. 思路: 按题意研究一下就会发现题目所求为. \[(\sum_{i=1}^n\sum_{j=1}^n\su ...
- 关于谷歌浏览器不支持html5中audio的autoplay解决方法(js代码解决)
当我们直接写autoplay时,在chrome中浏览器并没有自动播放音频: 如果直接通过js来调用audio的play()方法也不行: 控制台还会报错 大概意思:play()调用失败,因为用户没有与文 ...
- VuePress & Markdown Slot
VuePress & Markdown Slot refs https://vuepress.vuejs.org/zh/guide/markdown-slot.html#为什么需要-markd ...
- TypeScript & WebAssembly
TypeScript & WebAssembly WASM (module (func (param $lhs i32) (param $rhs i32) (result i32) local ...