0


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

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

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

创建一个ShowRequest类

@WebServlet("/ShowRequest")publicclassShowRequestextendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequest req,HttpServletResponse resp)throwsServletException,IOException{StringBuilder stringBuilder =newStringBuilder();// 返回请求协议的名称和版本号
        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访问, 可以看到如下结果:

在这里插入图片描述
由于 QueryString在传入请求时, 并没有设置, 因此此处获取到的QueryString 为 null

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

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

在这里插入图片描述

![在这里插入图片描述](https://img-blog.csdnimg.cn/6f60b9e0e02046858abc7ff58945531c.png

换成html对应的换行标签
时, 即可以正常识别换行标签

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

二. 获取GET请求中的参数

创建一个GetParameterServlet类, 假设浏览器请求如下
?studentID=10&studentName=张三

@WebServlet("/getParameter")publicclassGetParameterServletextendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequest req,HttpServletResponse resp)throwsServletException,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=张三

在这里插入图片描述
在idea窗口中, “张三” 却没有乱码

在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述当设置响应格式后, 浏览器便能正确识别了

三. 获取post请求中的参数

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

@OverrideprotectedvoiddoPost(HttpServletRequest req,HttpServletResponse resp)throwsServletException,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 请求观察结果
在这里插入图片描述
在idea上 返回了 结果

在这里插入图片描述

采用 fiddler 观察抓包结果

在这里插入图片描述

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

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

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

在这里插入图片描述

将 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>

编写代码

classStudent{// 这个类里的属性必须是public 或者带有 public 的getter / setter 否则json无法访问publicint studentId;publicString studentName;// 所构造的对象必须是 body 里构造的相同(名字与类型都应相同)// 里面的构造方法不写即为无参版本构造器 且必须为无参版本}@WebServlet("/json")publicclassJacksonServletextendsHolleServlet{@OverrideprotectedvoiddoPost(HttpServletRequest req,HttpServletResponse resp)throwsServletException,IOException{// 从请求 body 里面获取一些参数// 例如格式为 {"studentId": 10 , "studentName" : 张三 }// 一个重要类ObjectMapper objectMapper =newObjectMapper();// 第一个参数可以使字符串 也可以是输入流 第二个参数是一个类对象即为要解析的结果的类对象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 请求

在这里插入图片描述
idea 中接受到的 响应

在这里插入图片描述

利用 fiddler 抓包如下

在这里插入图片描述

标签: tomcat servlet java

本文转载自: https://blog.csdn.net/qq_68288689/article/details/129485052
版权归原作者 别时须清欢 所有, 如有侵权,请联系我们删除。

“HttpServletRequest核心方法以及获取请求参数”的评论:

还没有评论