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访问, 可以看到如下结果:

在这里插入图片描述
由于 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")
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=张三

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

在这里插入图片描述

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

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

三. 获取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 请求观察结果
在这里插入图片描述
在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>

编写代码

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

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

在这里插入图片描述

利用 fiddler 抓包如下

在这里插入图片描述

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: HttpServletRequestJava Servlet API中的一个接口,用于获取HTTP请求的信息。可以通过HttpServletRequest对象获取请求参数获取请求参数方法: 1. getParameter(String name):获取单个请求参数的值。 2. getParameterValues(String name):获取多个请求参数的值,返回一个字符串数组。 3. getParameterMap():获取所有请求参数的键值对,返回一个Map对象。 4. getQueryString():获取请求参数的原始字符串。 例如,以下代码可以获取名为“username”的请求参数的值: String username = request.getParameter("username"); 如果有多个名为“hobby”的请求参数,可以使用以下代码获取它们的值: String[] hobbies = request.getParameterValues("hobby"); 如果要获取所有请求参数的键值对,可以使用以下代码: Map<String, String[]> paramMap = request.getParameterMap(); 如果要获取请求参数的原始字符串,可以使用以下代码: String queryString = request.getQueryString(); ### 回答2: HTTP协议中,客户端(浏览器)发送请求时,会携带请求参数,用于向服务端(Web应用)传递数据。而在Java Web开发中,我们可以使用HttpServletRequest对象获取请求参数HttpServletRequest接口是Java Servlet规范中的一个接口,它代表了客户端发送的HTTP请求。该接口中提供了获取请求参数方法,主要有以下几种方式: 1.通过getParameter方法获取请求参数。该方法参数是一个String类型的key,用于指定需要获取参数名,该方法返回一个String类型的值,代表该参数名所对应的值。 例如,在如下的HTTP请求中,如果需要获取参数名为“username”的值,可通过如下方式进行: GET /test.jsp?username=zhangsan HTTP/1.1 Host: localhost:8080 //Java代码 String username = request.getParameter("username"); 2.通过getParameterValues方法获取请求参数。该方法用于获取一个参数名对应的多个值,返回值类型是一个String类型的数组。 例如,在如下的HTTP请求中,如果需要获取参数名为“hobby”的多个值,可通过如下方式进行: GET /test.jsp?hobby=sports&hobby=music HTTP/1.1 Host: localhost:8080 //Java代码 String[] hobbies = request.getParameterValues("hobby"); 3.通过getParameterMap方法获取所有请求参数。该方法返回一个Map对象,其中key为参数名,value为该参数名对应的值(数组类型)。 例如,在如下的HTTP请求中,如果需要获取所有参数,可通过如下方式进行: GET /test.jsp?username=zhangsan&age=20&hobby=sports&hobby=music HTTP/1.1 Host: localhost:8080 //Java代码 Map<String, String[]> parameterMap = request.getParameterMap(); 需要注意的是,在获取请求参数时,需要注意编码问题。因为HTTP请求中的参数值都是以URL编码(URL Encode)后的形式传递的,所以需要通过request.setCharacterEncoding方法进行解码,以避免出现中文乱码等问题。例如: //设置请求参数编码格式,一般为"UTF-8"或"GBK" request.setCharacterEncoding("UTF-8"); 综上所述,获取请求参数Java Web开发中非常常见的一个需求,我们可以通过HttpServletRequest接口提供的一系列方法来实现。在实际开发中,需根据具体情况选择合适的方法进行使用。 ### 回答3: 在Web开发中,HttpServletRequest是一个很重要的接口,它是代表客户端发出的HTTP请求的接口,其中我们可以通过HttpServletRequest获取请求参数。 我们一般在Java Servlet开发中使用HttpServletRequest对象得到HTTP请求方法参数,其中包括GET、POST方式的请求数据。HttpServletRequest对象内部有一个Map对象,它是由请求参数(request parameter)所组成,我们可以通过调用request.getParameter(name)方法得到请求参数的值。 获取请求参数的第一步,我们需要先获取HttpServletRequest对象。在Java Servlet中,我们可以使用request对象来获取HttpServletRequest对象,代码如下: HttpServletRequest request = (HttpServletRequest) req; 获取请求参数的第二步,我们需要获取请求参数的名称和值,代码如下: String name = request.getParameter("name"); String age = request.getParameter("age"); 在获取参数时,需要根据具体的参数类型进行转换,例如将字符串类型的参数转换成数字等。 HttpServletRequest也提供了许多其他的方法,可以更方便地进行参数获取、属性的设置等操作。例如,我们还可以用代码request.getAttribute("name")获取请求属性的值。 总之,通过HttpServletRequest对象获取请求参数Java Servlet开发中的一个重要环节,它可以为我们更方便地处理用户请求提供帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值