前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Servlet系列(二) Servlet和HTTP request

Servlet系列(二) Servlet和HTTP request

作者头像
地鼠窝里有个Gopher
发布2022-10-30 14:44:29
3440
发布2022-10-30 14:44:29
举报

Servlet 和 HTTP request

一、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()

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-10-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 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. 请求行
        • 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
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档