Servlet 和 HTTP request
- 一、Servlet回顾
- 1. Servlet继承关系
- GenericServlet
- HttpServlet
- 2. Servlet访问路径配置
- 1. Servlet继承关系
- 二、HTTP协议
- 1. HTTP简介
- a. 定义
- b. HTTP版本
- 2. HTTP报文格式
- a. HTTP请求报文
- b. HTTP响应报文
- 3. HTTP请求
- a. 请求行
- GET
- POST
- b. 请求头
- c. 请求空行
- d. 请求体(正文)
- a. 请求行
- 4. HTTP响应
- 1. HTTP简介
- 三、Request对象和Response
- 1. Request和Response对象的原理
- 2. Request对象继承体系结构
- 3. Request对象功能
- 3.1 获取请求行数据
- 3.2 获取请求头数据
- 3.3 获取请求体数据
- 3.4 获取请求参数(GET、POST方式)的通用方法
- 中文乱码问题
- 3.5 请求转发
- 使用方法
- 特点
- 3.6 共享数据
- 3.7 获取ServletContext
一、Servlet回顾
1. Servlet继承关系
Servlet – 接口 | GenericServlet – 抽象类 | HttpServlet – 抽象类(专用于服务HTTP协议的请求)
GenericServlet
GenericServlet
:将Servlet接口中其他的方法做了默认空实现,只将service()作为抽象方法。- 将来定义Servlet类时,可以继承
GenericServlet
,实现service()方法即可。
HttpServlet
HttpServlet
:对HTTP协议做了封装,聚焦于业务代码。- 用法:重写doGet() / doPost()方法。
2. Servlet访问路径配置
- 一个Servlet可以定义多个访问路径:
@WebServlet({"/d4","/dd4","/ddd4"})
public class ServletDemo extends HttpServlet {
......
- 路径定义规则
i.
/xxx
—— 单层路径。 ii./xxx/yyy
—— 多层路径。 iii.*.do
、*.action
—— 扩展名匹配。注意没有/
,这个是Struct(2)发明的,通常使用少。 iv. 通配符:*
可以作为通配符使用。例如/*
、/njupt/*
。
二、HTTP协议
1. HTTP简介
a. 定义
Hyper Text Transfer Protocol 超文本传输协议
- 应用层协议,基于TCP/IP,默认端口号80
- 定义了浏览器与服务器通信时,交互的约定方式
- 基于请求/响应模型,一次请求,一次响应
- 无状态的:每次请求之间都相互独立,无论什么人、无论访问顺序,服务器都做出无差别对待的反应,因为服务器不记得服务过什么人。
b. HTTP版本
- 1.0:每次请求重新建立TCP连接,传输结束后即断开连接
- 1.1:在一定时间内,复用TCP连接,目的是继续传输HTML中携带的其他图片等资源的请求。
2. HTTP报文格式
a. HTTP请求报文
例如:
代码语言:javascript复制GET /dir/index.htm HTTP/1.1
Host: www.xyz.edu.cn
Connection: keep-alive
User-Agent: Mozilla/5.0
Accept-Language: cn
代码语言:javascript复制POST /login.html HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Firefox/60.0
Accept: text/html,application/xhtml xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate
Referer: http://localhost/login.html
Connection: keep-alive
Upgrade-Insecure-Requests: 1
username=zhangsan&pwd=xxxxxx
b. HTTP响应报文
例如:
代码语言:javascript复制HTTP/1.1 202 Accepted // 接受请求
HTTP/1.1 400 Bad Request // 请求格式或语法有误,服务器不会处理
HTTP/1.1 404 Not Found // 找不到该资源
HTTP/1.1 301 Moved Permanently // 永久转移了
Location: http://www.xyz.edu/ee/index.html
3. HTTP请求
HTTP请求方式有7种,常用的有2种:
- GET
- POST
a. 请求行
GET
- 请求参数在请求行中,紧跟在URL后
- 请求的URL长度有限(RFC没有明确指出,不同浏览器支持的最长长度不同)
- 不安全(显式参数传递)
POST
- 请求参数在请求体中
- 可以在请求体中传递无限长参数
- 相对安全(隐式参数传递)
b. 请求头
- 浏览器需要告诉服务器一些信息
- 格式:
请求头名称: 请求头值
常见的请求头:
Host: 139.196.189.189:8080
—— 服务器主机名称。有了它,就可以在请求行中使用相对url。
Connection: keep-alive
—— 是否保持TCP连接以便继续请求其他资源
User-Agent: Mozilla/5.0
—— 客户端的浏览器版本信息,提高服务器兼容性
Accept-Language: cn
—— 表示希望优先得到中文文档
Referer: http://www.xxx.com/docs/developers.html
—— 表示通过哪个HTML的超链接访问该网页的(防止盗链,统计流量来源)。
c. 请求空行
用于分割POST请求的请求头和请求体
d. 请求体(正文)
封装POST请求消息的请求参数。
4. HTTP响应
三、Request对象和Response
1. Request和Response对象的原理
Request对象由服务器软件对报文进行解析,封装成java对象。Response对象由服务器软件将Java对象填充至响应报文中。
2. Request对象继承体系结构
ServletRequest - - 接口 | HttpServletRequest - - 抽象类 | org.apache.catalina.connector.RequestFacade - - 类 (专用于服务HTTP协议的请求)(Tomcat提供的实现类)
3. Request对象功能
3.1 获取请求行数据
GET /servlets/demo1?name=zhangsan HTTP/1.1
- 获取请求方式(GET)——
getMethod()
- 获取虚拟目录(/servlets)——
getContextPath()
- 获取Servlet路径(/demo1)——
getServletPath()
- 获取get方式请求参数字符串(name=zhangsan)——
getQueryString()
- 获取请求URI、URL
getRequestURI()
(/servlets/demo1)getRequestURL()
(http://localhost/servlets/demo1)
- 获取协议及版本(HTTP/1.1)——
getProtocol()
- 获取客户机的IP地址——
getRemoteAddr()
3.2 获取请求头数据
- 获取请求头的名称获取请求头的值——
getHeader(String name)
- 获取所有请求头名称——
Enumeration getHeaderNames()
3.3 获取请求体数据
只有POST方式才有请求体,在请求体中封装了POST请求的请求参数。
- 获取流对象
BufferedReader getReader()
获取字符输入流,只能操作字符数据。ServletInputStream getInputStream()
获取字节输入流,可以操作所有类型数据(可以用于文件上传)。
- 从流对象中取数据
3.4 获取请求参数(GET、POST方式)的通用方法
- 根据参数名称获取参数值——
String getParameter(String name)
- 根据参数名称获取参数值数组——
String[] getParameterValues(String name)
- 获取所有请求的参数名称——
numeration getParameterNames()
- 获取所有参数的map集合——
Map<String,String[]> getParameterMap()
中文乱码问题
- get方式:Tomcat 8已经将乱码问题解决
- post方式:会乱码
- 获取参数前,将Request的编码设置为UTF-8
request.setCharacterEncoding(“utf-8”)
- 获取参数前,将Request的编码设置为UTF-8
3.5 请求转发
一种在服务器内部的资源跳转方式。
使用方法
- 通过Request对象获取请求转发器对象:
RequestDispatcher getRequestDispatcher(String path)
- 使用RequestDispatcher对象来进行转发:
forward(ServletRequest, ServletResponse response)
特点
- 浏览器路径不变(从始至终一次请求)
- 只能转发到服务器内部资源中。
- 无论转发多少次,只有一次请求
3.6 共享数据
- 域对象:一个有作用范围的对象,可以在范围内共享数据(JavaWeb有四大域对象)
- request域:代表一次请求的范围,一般用于在请求转发的多个资源中共享数据
- 方法
void setAttribute(String name, Object obj)
Object getAttribute(String name)
void removeAttribute(String name)
3.7 获取ServletContext
用于在整个web应用中共享数据
getServletContext()