这一阵子在学 java 三大框架. 却在学习过程中发现前面的知识已经忘记了. 所以决定写一篇博客来总结回顾之前的学习.
1.Servlet 是什么?
servlet 是一个运行在服务器端的小应用程序. 通过 HTTP 协议接受和相应来自 web 客户端的请求.
提到 Web 客户端的请求和对 Web 客户端的响应, 必须了解 HTTP 协议.
2.HTTP 协议
HTTP 协议用于定义 Web 浏览器 (客户端) 和 Web 服务器 (服务器端) 之间交换数据的过程以及交换的数据的格式.
(1)请求部分
请求部分包括请求消息行, 请求消息头以及消息正文.
请求消息行:
请求方式 URI 协议 / 版本
[GET|POST] uri http/1.1
请求消息头
Accept-[Charset|Encoding|Language]: 告诉服务器浏览器可接受的 MIME 类型(即客户端能接受什么类型的文件).
Accept-Charset: 客户端浏览器支持哪种字符集
Accept-Encoding: 客户端浏览器能进进行解码的数据编码方式. eg.gzip
Accept-Language: 客户端浏览器希望接受的语言种类.
Host: 初始 URL 中的主机和端口号
Referer: 包含一个 url, 用户从该 url 代表的页面出发访问当前请求的页面.
Content-Type: 内容类型. 告诉服务器, 客户端浏览器传输数据的 MIME 类型(文件传输类型).eg.application/x-www-form-urlencoded;
User-Agent: 浏览器类型; IE,Chrome
Content-Length: 请求消息正文的长度
Connection: 表示是否需要持久连接. 默认为 Keep-Alive(持久连接).
Cookie: 设置服务器使用 Set-Cookie 发送的 http cookie.
Date: 请求时间
消息正文:
当请求方式是 POST 时, 才能看到消息正文
(2)响应部分
响应部分包括响应消息行, 响应消息头和响应正文
响应消息行:
协议 / 版本 响应状态码 对响应状态码的描述
HTTP/1.1 200 OK
响应状态码包括:
200 正常
302/307 重定向
304 未修改(表示当前客户端缓存的版本是最新版)
404 服务器上不存在客户端请求的资源
500 服务器内部错误
响应消息头:(常用)
Location: 指示新的资源的位置. 通常和 302/307 一起使用完成请求重定向
Server:apache tomcat 指示服务器的类型
Content-Encoding:gzip 服务器发送的数据采用的编码类型
Content-Length:80 告知客户端浏览器响应正文的长度
Content-Language:zh-cn 服务器发送的文本的语言
Content-Type:text/html;charset=GB2312 服务器发送的内容的 MIME 类型(文件的传输类型)
Refresh:1;url=http://www.xxx.com 指示客户端刷新的频率, 单位为秒. 可用于还剩几秒跳转页面.
Content-Dispositation:attachment;filename=aaa.zip 告诉客户端这是要下载的文件
Set-Cookie:xx=xx 服务器端发送的 Cookie
响应正文:
在网页右键查看源码即可查看
3.Servlet 生命周期
实例化 -》初始化 -》服务 -》销毁
出生:(实例化 new-》初始化 init)第一次访问 servlet 时出生
活着:(服务 service)应用活着, servlet 就活着
死亡:(销毁)应用卸载了, servlet 就销毁.
注: 可通过在注解 @WebServlet 中配置 load-on-startup, 使 servlet 在服务器启动时就创建
4.Servlet 的三种创建方式
(1)实现 javax.servlet.Servlet 接口
(2)继承 javax.servlet.GenericServlet 类 (适配器模式) 重写 service 方法
适配器模式, GenericSelvlet 是个抽象类, 只有 service 方法是抽象方法, 其余的都已经实现了 servlet 的方法
(3)继承 javax.servlet.http.HttpServlet 类 (模板方法设计模式) 常用. 但注意不要重写 servic() 方法. 只重写 doGet()和 doPost()即可. 因为 HttpServlet 的 service 方法中使用的是 doget 和 dopost 方法
5.Serlvet 配置 url-pattern
匹配规则:
优先级: 绝对匹配> / 开头匹配> 扩展名方式匹配
绝对匹配是指没有使用通配符 *,* 代表任意字符串.
- /* 任意字符都能识别
- *. 字符串 以 *. 字符串结尾的请求都可以访问.
- /action/* 以 / action 开头的请求都可以访问
- 如果 url-pattern 的值是 /, 表示执行默认映射. 所有的资源都可以访问.
- 6.Servlet 的线程安全
- Servlet 只创建一次, 销毁一次. 每次访问都是多线程. 所以有线程安全问题. 所以不要写全局变量, 只写局部变量, 用户不共用变量.
- 7.ServletConfig 的使用
- 作用 1: 获取 Servlet 的配置信息.
- 作用 2: 获得 ServletContext 对象
- 第一种方式获得配置信息, 其实就是获得 Web.xml 里面 servlet 标签下的 init-param 标签内的 param-value
- private ServletConfig config;
- @Override
- public void init(ServletConfig config) throws ServletException {
- this.config = config;
- }
- 第二种方式获得 config 配置信息 */
- String encoding = this.getServletConfig().getInitParameter("encoding");
第三种方式获得配置信息
- String encoding = this.getInitParameter("encoding");// 为什么能使用 this.get... 是因为该类是继承了 httpservlet,httpservlet 继承了 GenericServlet
- // 然后 GenericServlet 的 getIniParameter()返回 servletconfig 内的 getinitParameter 方法, 所以
- // 就可以直接调用.
1 获取 ServletContext 对象 2 String name = (String) this.getServletContext().getAttribute("name");
8.ServletContext
ServletContext 代表的是整个应用. 一个应用只有一个 ServletContext 对象. 单实例. ServletContext 对象实际上就是一个 Map(setAttribute 和 getAttribute).
常用方法:
域对象: setAttribute(sString , Object ) ,getAttribute(String ) ,rmoveAttribute(String)
获取全局配置信息: getInitParameter(String ) 根据配置文件中 < context-param > 标签下的 name 得到 value
获取资源路径: getRealPath(String path) 根据资源名称得到资源的绝对路径. 可以得到当前应用任何位置的任何资源.
实现 servlet 的转发: getRequestDispatcher(String path); 参数表示要跳转到那里去. 其实质就是请求转发. 注意不是重定向.
来源: https://www.cnblogs.com/sy-deku/p/9726578.html