JavaWeb-16-SpringMVC的请求参数获取和乱码

Table of Contents

 

一:SpringMVC获取参数

1:RequestParam

1:SpringMVC如何获取请求带来的各种信息 默认方式获取请求参数: 直接给方法入参上写一个和请求参数名相同的变量。这个变量就来接收请求参数的值; 带:有值,没带:null;

2:@RequestParam:获取请求参数的;参数默认是必须带的;

3:@RequestParam("user")和 @PathVariable("user")的区别

4:RequestParam的属性

2:RequestHeader

3:CookieValue

4:请求参数是一个POJO(简单对象)

5: SpringMVC可以直接在参数上写原生API;

二:解决SpringMVC乱码问题

1:请求乱码

1.1:get:现在tomcat已经做了设置,get乱码没问题

1.2:post乱码:在web.xml中增加拦截器,设置request.setCharacterEncoding("UTF-8");

2:响应乱码


一:SpringMVC获取参数

1:RequestParam

1:SpringMVC如何获取请求带来的各种信息 默认方式获取请求参数: 直接给方法入参上写一个和请求参数名相同的变量。这个变量就来接收请求参数的值; 带:有值,没带:null;

2:@RequestParam:获取请求参数的;参数默认是必须带的;

如:@RequestParam("user") ---String username username =request.getParameter("user")

@Controller
public class ParamsController {

    @RequestMapping("/hello")
    public String handle01(String name) {
        System.out.println("handle01..."+name);
        return "success";
    }


    @RequestMapping("/hello02")
    public String handle02(@RequestParam("name1")String str) {
        System.out.println("handle02..."+str);
        return "success";
    }

}

3:@RequestParam("user")和 @PathVariable("user")的区别

RequestParam----从请求参数中获取user,xxx?user=123

PathVariable---是从请求路径中获取user,xxx/{user}

4:RequestParam的属性

  • value()     :取的参数名
  • required()  :是否为必填
  • defaultValue()   :如果没带值,那么取默认值
@RequestMapping("/hello03")
    public String handle03(@RequestParam(value = "name",required = false,defaultValue = "666")String str) {
        System.out.println("handle02..."+str);
        return "success";
    }

2:RequestHeader

@RequestHeader:获取请求头中某个key的值; request.getHeader("User-Agent");

  • value()     :取的参数名
  • required()  :是否为必填
  • defaultValue()   :如果没带值,那么取默认值

3:CookieValue

CookieValue:获取某个cookie的值; 以前的操作获取某个cookie;

Cookie[] cookies = request.getCookies(); for(Cookie c:cookies){

 if(c.getName().equals("JSESSIONID")){ String

cv = c.getValue(); } }

现在:

@RequestMapping("/handle01")
    public String handle02(
            @RequestParam(value = "user", required = false, defaultValue = "你没带") String username,
            @RequestHeader(value = "AHAHA", required = false, defaultValue = "她也没带") String userAgent,
            @CookieValue(value="JSESSIONID",required=false)String jid) {
        System.out.println("这个变量的值:" + username);
        System.out.println("请求头中浏览器的信息:" + userAgent);
        System.out.println("cookie中的jid的值"+jid);
        return "success";
    }

4:请求参数是一个POJO(简单对象)

* SpringMVC会自动的为这个POJO进行赋值

     * 1)、将POJO中的每一个属性,从request参数中尝试获取出来,并封装即可;

     * 2)、还可以级联封装;属性的属性,只需要name=a.b即可;

     * 3)、请求参数的参数名和对象中的属性名一一对应就行

 实体类:

public class Book {
    private String name;
    private String author;
    private Integer price;

    public Book(String name, String author, Integer price) {
        this.name = name;
        this.author = author;
        this.price = price;
    }

    public Book() {

    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public Integer getPrice() {
        return price;
    }

    public void setPrice(Integer price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                '}';
    }
}

前端提交参数:

<form action="books" method="post">
        姓名:<input name="name" type="text"><br/>
        作者:<input name="author" type="text"><br/>
        价格:<input name="price" type="text"><br/>
       <input type="submit">
   </form>

 

后端接口接受: 

@RequestMapping(value = "/books")
    public String addBook(Book book) {
        System.out.println("handle02..."+book);
        return "success";
    }

5: SpringMVC可以直接在参数上写原生API;

/**

     * SpringMVC可以直接在参数上写原生API;

     *

     * HttpServletRequest

     * HttpServletResponse

     * HttpSession

     *

     * java.security.Principal

     * Locale:国际化有关的区域信息对象

     * InputStream:        ServletInputStream inputStream = request.getInputStream();

     * OutputStream:      ServletOutputStream outputStream = response.getOutputStream();

     * Reader:        BufferedReader reader = request.getReader();

     * Writer:         PrintWriter writer = response.getWriter();

 */

@RequestMapping("/handle03")
    public String handle03(HttpSession session,
            HttpServletRequest request,HttpServletResponse response) throws IOException {
        request.setAttribute("reqParam", "我是请求域中的");
        session.setAttribute("sessionParam", "额我是Session域中的");

        return "success";
    }

 

二:解决SpringMVC乱码问题

1:请求乱码

1.1:get:现在tomcat已经做了设置,get乱码没问题

1.2:post乱码:在web.xml中增加拦截器,设置request.setCharacterEncoding("UTF-8");

注:这个filter必须在最前边,不能在Restfilter之后,否则都取了参数了,再更改就没有意义了

<!--设置拦截器,将请求的编码改为utf-8-->
  <filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <!--eNCODEING是请求编码-->
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
    <!--forceRequestEncoding是否对请求编码-->
    <init-param>
      <param-name>forceRequestEncoding</param-name>
      <param-value>true</param-value>
    </init-param>
    <!--forceResponseEncoding是否对响应编码-->
    <init-param>
      <param-name>forceResponseEncoding</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

源码参考:

2:响应乱码

 response.setContentType("text/html;charset=utf-8")

或者像上边一样,用web.xml将响应编码改为UTF-8

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Java Web开发中,如果使用`HttpServletRequest`处理PUT请求并遇到参数中文乱码的问题,通常可以通过设置字符编码来解决。以下是一些步骤: 1. **检查请求头**:首先确认HTTP请求头中的`Content-Type`是否设置了正确的字符编码。对于POST、PUT等包含数据的请求,它应该类似于 `application/x-www-form-urlencoded; charset=UTF-8` 或 `multipart/form-data; charset=utf-8`。 ```java String contentType = request.getContentType(); if (contentType != null && contentType.contains("charset")) { String encoding = contentType.substring(contentType.indexOf(";") + 1).trim().split("=")[1]; // 确认编码为UTF-8或其他支持的编码,如GBK } ``` 2. **设置响应编码**:在`doPut()`方法中,你需要设置响应头的`Content-Type`为指定的编码,以便客户端接收响应时知道预期的字符集。 ```java response.setContentType("text/html;charset=UTF-8"); ``` 3. **读取请求参数**:当从`request.getParameter()`等方法获取参数时,可以指定字符编码为UTF-8来解析。 ```java String paramValue = request.getParameter("yourParam", new String(StandardCharsets.UTF_8)); ``` 4. **统一处理**:在整个应用层面上,确保所有的输入输出流,如`InputStream`和`OutputStream`,都设置正确的编码。 如果你已经尝试了上述步骤还是遇到问题,可能是服务器端或客户端的其他配置导致的,需要检查应用程序的配置文件、浏览器设置,甚至中间件代理的设置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苍煜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值