Servlet 接口笔记
Servlet 接口笔记
一、ServletConfig 接口
什么是 ServletConfig?
ServletConfig :获取 Servlet 程序的配置信息接口,封装着初始化配置信息获取的一系列方法。
Servlet 程序和 SeervletConfig 对象都是由 Tomcat 负责创建,程序员负责使用。
Servlet 程序默认是第一次访问的时候创建,ServletConfig 是每个 Servlet 程序创建时,就创建一个对应的 ServletConfig 对象(即每一个 Servlet 程序对应一个自己的 ServletConfig 对象,各 Servlet 程序之间的 ServletConfig 对象相互独立)。
ServletConfig 接口的三大作用
- 可以获取 Servlet 程序的别名 servlet-name 对应的值
- 获取初始化参数 init-parpam 对应的值
- 获取 ServletContext 对象
对应方法:
getServletName():
获取 Servlet 程序别名,即 配置文件中 servlet 标签中的 servlet-name 文本信息
getInitParameter(<"参数名">):
获取配置文件中 init-param 标签的参数名对应的值
getServletContext():
获取 ServletContext 对象
在一个 Servlert 程序中可以通过调用 getServletConfig()
来获取属于 Servlet 程序自己的 ServletConfig 对象实例。在重写 init 方法时需要注意调用 super 方法来继承父类 GenericServlet 的 init 方法,因为在父类 GenericServlet 中的 init 对 config 对象进行了赋值操作,这样才使得子类调用 getServletConfig()
方法时成功获取 ServletConfig 实例对象。
ServletContext 接口
什么是 ServletContext?
ServletContext:它表示 Servlet 上下文对象
一个 Web 工程只有一个 ServletContext 对象实例。
ServletContext 对象是一个域对象。(这里的域表示存取数据的操作范围,此时范围即为整个 Web 工程)
ServletContext 对象是在 Web 工程部署启动时创建,在 Web 工程停止时销毁。
ServetContext 的四个作用
- 获取 web.xml 中配置的上下文参数 (context-param)
- 获取当前的工程路径,格式:/工程路径
- 获取工程部署后在服务器硬盘上的绝对路径
- 像 Map 一样进行存储数据
可以通过对 ServletConfig 对象调用 getServletContext()
获取 ServletContext 对象 或直接调用 getServletContext()
函数来获取(该方法本质就是通过前者获取的 ServletContext 对象)。
对应方法:
getInitParameter(<"参数名">):
获取 web.xml 中配置的上下文参数 (context-param)
getContextPath():
获取当前工程路径(例:/test)
getRealPath("/"):
获取工程部署在服务器上的绝对路径
setAttribute(<"key">, <"value">):
向 ServletContext 对象中存入数据
getAttribute(<"key">):
获取 ServletContext 对象中 key
对应的值
HTTP 协议
HTTP 是无状态的:服务器无法判断两次请求是否来自同一个客户端,所以需要通过会话技术来解决此问题
① 请求的 HTTP 协议
GET 请求
请求行
(1) 请求的方式
(2) 请求的资源路径
(3) 请求的协议的版本号
请求体(GET
没有请求体,但是有QueryString
)请求头
由
key:value
组成不同的键值对,表示不同的涵义
POST 请求
请求行
(1) 请求的方式
(2) 请求的资源路径
(3) 请求的协议的版本号
请求头
由
key:value
组成不同的键值对,表示不同的涵义–空行–
请求体
发送给服务器的数据
常用请求头说明
Accept:
表示客户端可以接收的数据类型
Accept-Languege:
表示客户端可以接收的语言类型
User-Agent:
表示客户端浏览器的信息
Host:
表示服务器的 ip 和 端口号
区分 GET 、POST 请求使用场景
Get 请求使用场景
form 标签 method 属性值为 get
a 标签
link标签引入 css
Script 标签引入 js 文件
img 标签引入图片
iframe 引入 html 页面
在浏览器地址栏中输入地址然后回车
Post 请求使用场景
from 标签 method 属性值为 post
② 响应的 HTTP 协议
响应行
- 响应的协议和版本号
- 响应状态码
- 响应状态描述符
响应头
由
key:value
组成不同的键值对,表示不同的涵义– 空行 –
响应体
回传给客户端的数据
常用的响应码说明
200 表示请求成功
302 表示请求重定向
404 表示请求服务器已收到,但你所需要的数据不存在(请求地址不存在)
405 表示服务器不支持当前请求类型(没重写 do* 对应方法同样会导致此错误)
500 表示服务器已收到请求,但是服务器内部出现错误(大部分为代码错误)
MIME 类型说明
MIME 是HTTP 协议中数据类型。
MIME 的英文全称是 “Multipurpose Internet Mail Extensions” 多功能 Internet 邮件扩充服务。MIME 类型的格式是 “大类型/小
类型”,并与某一种文件的扩展名相对应。
HttpServletRequest 类
HttpServletRequest 类的作用
每次只要有请求进入 Tomcat 服务器,Tomcat 服务器就会把请求过来的 HTTP 协议信息解析后封装到 Request 对象中。然后传递到 service 方法(doGet 和 doPost)中给我们使用,我们可以通过 HttpServletRequest 对象,获取到所有请求信息。
该类常用方法
getRequestURI()
获取请求的资源路径
getRequestURL()
获取请求的统一资源定位符(绝对路径)
getRemoteHost()
获取客户端 ip 地址
在 IDEA 中,使用 localhost 和 127.0.0.1 访问时,得到的客户端 IP 均为:127.0.0.1
在 IDEA 中,使用 真实IP 访问时,得到的客户端 IP 即为真实的客户端 IP 地址
getHeader(key)
获取请求头中 key 对应的值
getParameter()
获取请求的参数
getParameterValues()
获取请求的参数(多值时使用)
**getParameter(), getParameterValues()
需要注意:** 当请求为 Post 请求时,一定要注意编码问题,且设置编码需要在获取请求参数之前进行设置,否则编码设置无效
设置请求体的字符集编码方法:setCharacterEncoding()
获取请求体的字符集编码方法:getCharacterEncoding()
getMethod()
获取请求的方式 Get 或 Post
setAttribute(key, value)
设置域数据
getAttribute(key)
获取域数据
getRequestDispatcher()
获取请求转发对象
请求转发
请求转发是指服务器收到请求后,从一个资源跳到同个Web工程内的另一个资源叫请求转发
请求转发的特点:
浏览器地址栏没有发生改变
他们是一次请求
他们共享 Request 域中的数据
可以转发得到 WEB-INF 目录下
不否可以访问工程以外的资源
Web 中 “/“ 的不同含义
在 web 中单斜杠 “/“ 是一种绝对路径
当 / 被浏览器解析时,得到的地址是:http://ip:port/
当 / 被服务器解析时,得到的地址是:http://ip:port/工程路径
例:
<url-pattern> /servlet1 </url-pattern>
servletContext.getRealPath("/");
request.getRequestDispatcher("/");
特殊情况: response.sendRediect("/");
将斜杠发送给浏览器解析后返回浏览器解析后的结果,即 http://ip:port/
HttpServletResponse 类
HttpServletResponse 类的作用
HttpServletResponse 类和 HttpServletRequest 类一样,每次请求进来,Tomcat 服务器都会创建一个 Response 对象传递给 Servlet 程序去使用。 HttpServletRequest 表示请求过来的信息, HttpServletResponse 表示所有响应的信息,我们如果需要设置返回给客户端的信息,都可以通过 HttpSErvletResponse 对象来进行设置。
两个输出流的说明
字节流 getOutputStream()
常用于下载(传递二进制数据)
字符流 getWriter()
常用于回传字符串
注意:两个流只能使用一个
如何往客户端回传字符串数据
1 | PrintWriter writer = resp.getWriter(); |
响应的乱码的解决方法
方式一
响应的默认字符集为: ISO-8859-1
不支持中文字符
需要重新设置服务器响应字符集:setCharacterEncoding("UTF-8");
但只设置服务器响应的字符集在浏览器上有可能还是乱码,原因是浏览器的字符集和服务器传递来的字符编码不一致导致的
所以还需要再响应头中告知浏览器解析时使用的字符集:setHeader("Content-Type", "text/html; charset=UTF-8");
方式二
调用 setContentType("text/html; charset=UTF-8")
方法
它会同时设置服务器和客户端都使用 UTF-8
字符串,同时还设置了响应头
但需要注意的是,此方法一定要在获取流对象之前调用才有效
请求重定向
请求重定向,是指客户端给服务器发送请求,然后服务器返回给客户端一个新的地址,让客户端再去访问新地址。
请求重定向的特点:
- 浏览器地址栏会发生改变
- 共发送了两次请求
- 不共享 Request 域中的数据
- 不能访问 WEB-INF 下的资源
- 可以访问工程外的资源
请求重定向方法一(不推荐使用):
1 | // 设置响应状态码 302,表示重定向 |
请求重定向方法二(推荐使用):
1 | // 重定向响应码即为 302,该方法已自动设置为 302 不需要用户设置响应状态码 |
补充
Servlet 实例 Tomcat 只会创建一个,所有的请求都是这个实例去响应的。且默认情况下,只有第一次请求时,Tomcat 才会去初始化,然后在服务。
- 优点:提高系统的启动速度,因为只需要实例一个对象提供使用
- 缺点:因为默认情况第一次请求才进行初始化,所以导致第一个用户请求发出时,服务器才开始初始化,导致速度变慢,这对第一个访问的用户很不公平
可以通过配置
web.xml
文件中servlet
标签中的<load-on-startup>
标签来使得在服务器启动时同时将servlet
程序初始化,而且可以设置servlet
启动的先后顺序,值越小,越靠前,最小值为 0- 这样设置会导致服务器启动速度变慢,但优点显而易见,提高了用户的体验感
需要注意的是
servlet
程序是:- 单例的
- 线程不安全的
因为线程不安全,所以尽量不要在
Servlet
中定义成员变量,若不得不建立成员变量,则就不要去修改成员变量的值,以及不要将成员变量拿去条件判断