Servlet系列(二) Servlet和HTTP request

2022-10-30 14:44:29 浏览数 (1)

Servlet 和 HTTP request

  • 一、Servlet回顾
    • 1. Servlet继承关系
      • GenericServlet
      • HttpServlet
    • 2. Servlet访问路径配置
  • 二、HTTP协议
    • 1. HTTP简介
      • a. 定义
      • b. HTTP版本
    • 2. HTTP报文格式
      • a. HTTP请求报文
      • b. HTTP响应报文
    • 3. HTTP请求
      • a. 请求行
        • GET
        • POST
      • b. 请求头
      • c. 请求空行
      • d. 请求体(正文)
    • 4. 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访问路径配置

  1. 一个Servlet可以定义多个访问路径:
代码语言:javascript复制
@WebServlet({"/d4","/dd4","/ddd4"})
public class ServletDemo extends HttpServlet {
	......
  1. 路径定义规则 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

  1. 获取请求方式(GET)——getMethod()
  2. 获取虚拟目录(/servlets)——getContextPath()
  3. 获取Servlet路径(/demo1)——getServletPath()
  4. 获取get方式请求参数字符串(name=zhangsan)——getQueryString()
  5. 获取请求URI、URL
    • getRequestURI()(/servlets/demo1)
    • getRequestURL()(http://localhost/servlets/demo1)
  6. 获取协议及版本(HTTP/1.1)——getProtocol()
  7. 获取客户机的IP地址——getRemoteAddr()

3.2 获取请求头数据

  1. 获取请求头的名称获取请求头的值——getHeader(String name)
  2. 获取所有请求头名称——Enumeration getHeaderNames()

3.3 获取请求体数据

只有POST方式才有请求体,在请求体中封装了POST请求的请求参数。

  1. 获取流对象
    • BufferedReader getReader()获取字符输入流,只能操作字符数据。
    • ServletInputStream getInputStream()获取字节输入流,可以操作所有类型数据(可以用于文件上传)。
  2. 从流对象中取数据

3.4 获取请求参数(GET、POST方式)的通用方法

  1. 根据参数名称获取参数值——String getParameter(String name)
  2. 根据参数名称获取参数值数组——String[] getParameterValues(String name)
  3. 获取所有请求的参数名称——numeration getParameterNames()
  4. 获取所有参数的map集合——Map<String,String[]> getParameterMap()
中文乱码问题
  • get方式:Tomcat 8已经将乱码问题解决
  • post方式:会乱码
    • 获取参数前,将Request的编码设置为UTF-8 request.setCharacterEncoding(“utf-8”)

3.5 请求转发

一种在服务器内部的资源跳转方式。

使用方法
  1. 通过Request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
  2. 使用RequestDispatcher对象来进行转发:forward(ServletRequest, ServletResponse response)
特点
  1. 浏览器路径不变(从始至终一次请求)
  2. 只能转发到服务器内部资源中。
  3. 无论转发多少次,只有一次请求

3.6 共享数据

  • 域对象:一个有作用范围的对象,可以在范围内共享数据(JavaWeb有四大域对象)
  • request域:代表一次请求的范围,一般用于在请求转发的多个资源中共享数据
  • 方法
    • void setAttribute(String name, Object obj)
    • Object getAttribute(String name)
    • void removeAttribute(String name)

3.7 获取ServletContext

用于在整个web应用中共享数据 getServletContext()

0 人点赞