HttpServletRequest核心方法以及获取请求参数

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: HttpServletRequest核心方法以及获取请求参数

一. 展示HttpServletRequest中一些重要方法



当Tomcat 通过 Socket API 读取 HTTP 请求(字符串), 并且按照 HTTP 协议的格式把字符串解析成HttpServletRequest 对象.


创建一个ShowRequest类

@WebServlet("/ShowRequest")
public class ShowRequest extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        StringBuilder stringBuilder = new StringBuilder();
        // 返回请求协议的名称和版本号
        stringBuilder.append(req.getProtocol()); // 协议名称: HTTP  版本号: 1.1
        stringBuilder.append("\n");
//        stringBuilder.append("<br>");
        // 放回请求的HTTP方法名称
        stringBuilder.append(req.getMethod()); // GET
        stringBuilder.append("\n");
//        stringBuilder.append("<br>");
        // 从协议名称知道HTTP请求的第一行的查询字符串中, 返回该请求的URL的一部分
        stringBuilder.append(req.getRequestURI()); // /3010/ShowRequest
        stringBuilder.append("\n");
//        stringBuilder.append("<br>");
        stringBuilder.append(req.getRequestURL()); // 返回整个地址 http://127.0.0.1:8080/0310/ShowRequest
//        stringBuilder.append("<br>");
        stringBuilder.append("\n");
        // 返回指示请求上下文的请求URI部分
        stringBuilder.append(req.getContextPath()); // /3010 -
        stringBuilder.append("\n");
//        stringBuilder.append("<br>");
        // 返回包含路径后的请求URL中的查询字符串
        stringBuilder.append(req.getQueryString()); // null 没有QueryString
        stringBuilder.append("\n");
//        stringBuilder.append("<br>");
        // 把请求的header 拼接
        // 获取到所有的headerNames
        // 枚举
        Enumeration<String> headerNames = req.getHeaderNames();
        // has XXX 判断是否有下一个
        while(headerNames.hasMoreElements()) {
            // 遍历获取到每一个header的name值
            String name = headerNames.nextElement(); // next XXX获取下一个
            // 查询header中name对应的值
            String value = req.getHeader(name);
            stringBuilder.append(name + ", " + value);
            stringBuilder.append("\n");
        }
        resp.getWriter().write(stringBuilder.toString());
    }
}


通过 smart Tomcat 部署程序并在浏览器中通过URL http://127.0.0.1:8080/0310/ShowRequest访问, 可以看到如下结果:

ec5758ec86434cf7b5b9166eb4441e5d.png


由于 QueryString在传入请求时, 并没有设置, 因此此处获取到的QueryString 为 null


另外需要注意的是, 此处我们设置的换行符 “\n” 并非一直都是正确生效的. 此时由于我们并没有设置准确的相应格式, 因此浏览器会在加载时"猜测"此时响应的文本是什么类型, 此处恰好认为是text/plain 可以正确读取换行.


若当设置响应格式为 text/html时, 此时 “\n” 换行符将无法正常解析

851de75afb2144e89d17c67409927ae3.png


![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/6f60b9e0e02046858abc7ff58945531c.png

换成html对应的换行标签

时, 即可以正常识别换行标签


dfcbeb3a68594452ac666036ebf6e50a.png


因此, 在通过浏览器访问时, 应当主动设置setCOntentType(“类型”, charset=“utf8”), 告诉浏览器按照什么类型, 什么编码方式解析


二. 获取GET请求中的参数



创建一个GetParameterServlet类, 假设浏览器请求如下

?studentID=10&studentName=张三

@WebServlet("/getParameter")
public class GetParameterServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    String studentId = req.getParameter("studentId");
        // getparameter会自动针对urlencode 的结果进行处理
        String studentName = req.getParameter("studentName");
        System.out.println(studentId);
        System.out.println(studentName);
        resp.getWriter().write(studentId + ", " + studentName);
}


运行smart Tomcat 通过网页访问URL路径为http://127.0.0.1:8080/0310/getParameter?studentId=10&studentName=张三

af2ddcd1c8e4475fbb94925be766506b.png


在idea窗口中, “张三” 却没有乱码

2a2bdf208b5f490eb9df0082ba6d492e.png


说明此时浏览器对于 QueryString的解析出现了问题, 浏览器对于urlencode解析不正确, 需要手动设置响应格式告诉浏览器如何去解析

e4a4fa254d74423788ff115cf79917c7.png

9b72387c83d2444aa8b0eff9800b653d.png


当设置响应格式后, 浏览器便能正确识别了


三. 获取post请求中的参数



在刚刚创建的 GetParameter 类中, 重写 dopost 方法, 并构建请求

@Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 通过 body 获取, 发送一个post请求
        // 预期请求的 body 里为 studentId = 10&studentName = 张三
        // 请求设置请求字符集 告诉 servlet(Tomcat)  该如何解析
        req.setCharacterEncoding("utf8");
        String studentId = req.getParameter("studentId");
        String studentName = req.getParameter("studentName");
        System.out.println(studentId);
        System.out.println(studentName);
        // 设置浏览器响应格式 告诉浏览器该如何解析
        resp.setContentType("text/html; charset=utf8");
        resp.getWriter().write(studentId + "," + studentName);
    }


通过 postman 发送一个 post 请求观察结果

84d6e8070d4244c3aae3c7e01aca6296.png


在idea上 返回了 结果

85ac473a49ad4b6fb0cf1d6593ed728d.png


采用 fiddler 观察抓包结果

38ae223729624ddfad626f59bea8e257.png


四. 获取post请求中 body 为 json 格式传递的



创建一个新类 JacksonServlet 重写 dopost 方法

在中央仓库中(中央仓库地址)引入 Jackson 依赖

07d333347cd5444bacd0e20904b3cfed.png


将 maven 下的内容复制到 pom.xml 文件中

<!--      引入 jackson 依赖   -->
        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.13.4.1</version>
        </dependency>


编写代码

class Student {
    // 这个类里的属性必须是public 或者带有 public 的getter / setter 否则json无法访问
    public int studentId;
    public String studentName;
    // 所构造的对象必须是 body 里构造的相同(名字与类型都应相同)
    // 里面的构造方法不写即为无参版本构造器 且必须为无参版本
}
@WebServlet("/json")
public class JacksonServlet extends HolleServlet{
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 从请求 body 里面获取一些参数
        // 例如格式为 {"studentId": 10 , "studentName" : 张三 }
        // 一个重要类
        ObjectMapper objectMapper = new ObjectMapper();
        // 第一个参数可以使字符串 也可以是输入流 第二个参数是一个类对象即为要解析的结果的类对象
        Student s = objectMapper.readValue(req.getInputStream(), Student.class);
                                                                 // 类对象可以解析到类里的属性
        // 1.读取输入流, 获取到需要解析的字符串
        // 2. 把字符串按照json格式解析, 得到一组键值对
        // 3. 根据类对象创建一个实例
        // 4. 遍历类对象中的属性的名字, 拿着名字去键值对中查询, 查到的value就赋值到对应的对象属性中
        // 5. 返回这个构造完成的对象
        System.out.println(s.studentId);
        System.out.println(s.studentName);
        // 两个重要方法 readValue方法, 把 json 格式数据转成 java 的对象
        // writerValueAsString方法, 把 java 对象转为 json 格式的字符串
        // 设置 响应时, 浏览器按照 json 格式解析
        resp.setContentType("application/json; charset=utf8");
        // 先把s对象转为json格式字符串在转为流对象
        resp.getWriter().write(objectMapper.writeValueAsString(s));
    }
}


使用 postman 构建 body 为 json 的 post 请求

image.png


idea 中接受到的 响应

4a7b687be6564d79a5ce2071660c2340.png


利用 fiddler 抓包如下

2660a4e729f94eb5962271e2621a6317.png


相关文章
|
7月前
HttpServletRequest类
HttpServletRequest类
45 0
|
6月前
|
JSON Java Maven
使用`MockMvc`来测试带有单个和多个请求参数的`GET`和`POST`接口
使用`MockMvc`来测试带有单个和多个请求参数的`GET`和`POST`接口
267 3
|
6月前
|
Java 应用服务中间件
Request继承体系,获取请求数据,Request通用方式获取请求参数
Request继承体系,获取请求数据,Request通用方式获取请求参数
|
XML 数据格式
HttpServletRequest的介绍和方法以及代码实战
HttpServletRequest的介绍和方法以及代码实战
339 0
|
7月前
SpringMVC之获取请求参数和域对象共享数据
【1月更文挑战第18天】 一、SpringMVC获取请求参数 1、通过ServletAPI获取 2、通过控制器方法的形参获取请求参数 3、@RequestParam 4、@RequestHeader 5、@CookieValue 6、通过POJO获取请求参数 7、解决获取请求参数的乱码问题 二、域对象共享数据 1、使用ServletAPI向request域对象共享数据 2、使用ModelAndView向request域对象共享数据 3、使用Model向request域对象共享数据 4、使用map向request域对象共享数据 5、使用ModelMap向request域对象共享数据
113 0
|
7月前
Request通用方式获取请求参数及Servlet模板创建
Request通用方式获取请求参数及Servlet模板创建
55 0
|
7月前
【SpringMVC】获取 -请求参数- 的多种方式
【SpringMVC】获取 -请求参数- 的多种方式
71 0
|
Java Spring
深入解析 Java @RequestParam 注解:处理请求参数的高效利用
在Java Web应用开发中,获取客户端传递的请求参数是非常常见的操作。Spring框架为我们提供了多种方式来处理请求参数,其中 @RequestParam 注解是一种常用且灵活的方式。本文将带您深入了解 @RequestParam 注解,探讨其特点、用法、实现方式以及在实际应用中的优势。
|
API
SpringMVC 获取请求参数 的几种方式
SpringMVC 获取请求参数 的几种方式
81 2
HttpServletRequest概述、相关方法、获取请求行信息、获取请求头信息相关方法及获取请求参数相关方法
HttpServletRequest概述、相关方法、获取请求行信息、获取请求头信息相关方法及获取请求参数相关方法
372 0