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

这篇具有很好参考价值的文章主要介绍了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访问, 可以看到如下结果:

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

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

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

httpservletrequest 获取请求参数,tomcat,servlet,java

httpservletrequest 获取请求参数,tomcat,servlet,java

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

httpservletrequest 获取请求参数,tomcat,servlet,java
因此, 在通过浏览器访问时, 应当主动设置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=张三

httpservletrequest 获取请求参数,tomcat,servlet,java
在idea窗口中, “张三” 却没有乱码

httpservletrequest 获取请求参数,tomcat,servlet,java

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

httpservletrequest 获取请求参数,tomcat,servlet,java
httpservletrequest 获取请求参数,tomcat,servlet,java当设置响应格式后, 浏览器便能正确识别了

三. 获取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 请求观察结果
httpservletrequest 获取请求参数,tomcat,servlet,java
在idea上 返回了 结果

httpservletrequest 获取请求参数,tomcat,servlet,java

采用 fiddler 观察抓包结果

httpservletrequest 获取请求参数,tomcat,servlet,java

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

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

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

httpservletrequest 获取请求参数,tomcat,servlet,java

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

httpservletrequest 获取请求参数,tomcat,servlet,java
idea 中接受到的 响应

httpservletrequest 获取请求参数,tomcat,servlet,java

利用 fiddler 抓包如下

httpservletrequest 获取请求参数,tomcat,servlet,java文章来源地址https://www.toymoban.com/news/detail-594972.html

到了这里,关于HttpServletRequest核心方法以及获取请求参数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot异步任务获取HttpServletRequest

    在使用框架日常开发中需要在controller中进行一些异步操作减少请求时间,但是发现在使用@Anysc注解后会出现Request对象无法获取的情况,本文就此情况给出完整的解决方案 @Anysc注解会开启一个新的线程,主线程的Request和子线程是不共享的,所以获取为null 在使用springboot的自定

    2024年02月21日
    浏览(39)
  • HttpServletRequest和HttpServletResponse的获取与使用

    相关笔记:【JavaWeb之Servlet】 Servlet是JavaWeb的三大组件之一: Servlet Filter 过滤器 Listener 监听器 Servlet是运行在服务器上的一个Java小程序,它可以接收客户端发送过来的请求,并响应数据给客户端。 Servlet接口的实现和继承关系如下,日常开发中直接继承HttpSerlvet类就好: 每次

    2024年02月14日
    浏览(32)
  • 【SpringBoot】获取HttpServletRequest的三种方式

    线程安全 缺点: 每个方法都需要写一遍 线程安全 在 Spring 中, DemoRequestController 的 scope 是 singleton (单例),也就是说在整个 web 系统中,只有一个 DemoRequestController ;但是其中注入的 request 却是线程安全的,原因在于:使用这种方式,当 Bean (本例的 DemoRequestController )初始化

    2024年02月12日
    浏览(35)
  • SpringBoot获取HttpServletRequest、HttpServletResponse的三种方式

    仅仅适用在controller方法上。当Spring接收到HTTP请求时,会寻找一个合适的方法来处理该请求。如果该方法参数上标注了@RequestMapping或@Get、@Post等注解,Spring就会将HttpServletRequest对象注入到该参数中。 适用于所有的bean 通过调试可以看到,注入的Reques是一个代理类,而这个被代

    2024年02月19日
    浏览(34)
  • 有关使用HttpServletRequest的Cookie的设置和获取

    介绍了如何在HttpServletRequest中对Cookie的进行设置和获取。 在服务器端的HttpServletRequest中对Cookie的进行设置后,客户端在接下来的请求中会携带此设置好的Cookie,所以可以在服务器端接收请求时提取这个Cookie的值。 服务器端设置Cookie值 : 服务器端提取Cookie值 : Stackoverflow:

    2024年02月09日
    浏览(38)
  • Springboot3.2.0使用RequestContextHolder获取HttpServletRequest为NULL

    在之前的版本中一般为了能在任意地方都能获取到HttpServletRequest我们一般都会自己封装工具类从 RequestContextHolder 中获取到 但是在新版的SpringBoot3.2.0版本中这种方式获取到的 ServletRequestAttributes 是null,点击进去RequestContextHolder查看源代码发现少了依赖 即使我在pom中加入的响应

    2024年04月13日
    浏览(31)
  • 【仿写tomcat】四、解析http请求信息,响应给前端,HttpServletRequest、HttpServletResponse的简单实现

    在解析请求之前我们要思考一个问题,我们解析的是其中的哪些内容? 对于最基本的实现,当然是 请求类型 , 请求的url 以及 请求参数 ,我们可以根据请求的类型作出对应的处理,通过url在我们的mapstore中找到servlet, 那么请求的参数我们是不是还没有储存的地方呢? 所以

    2024年02月12日
    浏览(29)
  • import javax.servlet.http.HttpServletRequest;HttpServletRequest request多处标红报错,如何解决?

    在做动态网页开发是,一不留神 javax.servlet.http.HttpServletRequest;HttpServletRequest request满屏标红报错。看下图   这是因为项目缺少两个jar依赖,分别是jsp-api.jar和servlet-api.jar ,我们按照如下操作导入即可快速解决。 右键项目--》Properties--》Java Build Path--》Libraries--》Add External JAR

    2024年02月12日
    浏览(33)
  • 关于降版本Tomcat10降到Tomcat9或者Tomcat8,提示找不到jakarta.servlet.http.HttpServletRequest包的解决方法

    Tomcat10相较于Tomcat9和8,在Servlet方面,对于javax.servlet包名改为了jakarta.servlet。 当你目前的项目是使用Tomcat10进行部署的,然后页面提示没有找到javax.servlet.http.HttpServletRequest包时,只有两种方法: 1、就是在Tomcat10的包下找到lib下的servlet-api.jar包 ,详情请看我上一篇文章:关于

    2024年01月25日
    浏览(32)
  • 【Servlet】HttpServletRequest、HttpServletResponse

    目录 🎁1 HttpServletRequest  💥1.1 通过 query string 来进行传递 🐷1.2 通过 body (form) 来进行传递 🛸1.3 通过 body(json) 来进行传递 🍘2. HttpServletResponse 👶2.1 为响应设置状态码 200 🍝2.2 header 实现自动刷新效果 🌏2.3 跳转到 搜狗页面 🚑3. 表白墙 🏳‍🌈3.2 小结 前端给后端传递

    2024年02月11日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包