SpringMVC入门学习-04-获取请求参数

默认方式获取请求参数:

<a href="hello?username=">hello</a>
@RequsetMapping("/hello")
public String handle(String username){
    System.out.println("username="+username);
    return "success";
} 

不填为null

@RequestParam
@RequsetMapping("/hello")
public String handle(@RequsetParam("user")String username){
    System.out.println("username="+username);
    return "success";
} 
@RequsetParam(“user”)表示:

username = requset.getParameter(“user”);
标记了RequsetParam后默认请求必须带上该参数

@RequsetParam的参数:

value:值
required:该参数是否是必须的
defaultValue:默认值,默认为null

@RequestParam和@pathVairable区别:

前者获取请求URL问号后的值,后者获取路径上占位符的值

@RequestHeader

获取请求头中某个key的值
属性与RequsetParam相同

@RequsetMapping("/hello")
public String handle(@RequsetParam(value="user",required=false)String username,
@RequsetHeader("User-Agent")String userAgent){
    System.out.println("username="+username);
    System.out.println("userAgent="+userAgent);
    return "success";
} 
@CookieValue使用方法与RequesrHeader相同

当页面的请求参数是一个自定义类型,有较多参数属性时,
我们可以建立一个对应的POJO实体类(有参+无参+toString),
SpringMVC会自动地为这个POJO实体类进行赋值,
将POJO中的每一个属性,从request参数中尝试获取出来并封装
(request.parameter(“实体类属性名”),有则赋值,无则为null)
还可进行级联操作

<form action="book" method="post">
    书名:<input type="text" name="bookname"><br>
    作者:<input type="text" name="author"><br>
    价格:<input type="text" name="price"><br>
    销量: <input type="text" name="sales"><br>
    //级联的属性
    省:<input type="text" name="address.province"/><br>
    市:<input type="text" name="address.city"/><br>
    <input type="submit">
</form>
//图书实体类
public class Book{
    private String bookname;
    ...
    public Address address;
    ...
    构造方法...
    toString...
}
//地址实体类
public class Address{
    private String province;
    private String city;
    ...
    构造方法...
    toString...
}

addBook的参数是自定义类型Book,所以SpringMVC会尝试从request域中对实体类的属性依次进行getParameter并封装

@RequestMapping("/book")
public String addBook(Book book){
    System.out.println("图书信息"+book);
    return "success";
}

解决中文乱码问题:
在xml中添加(配置在最前端)

<filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    //定义编码
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    //是否强制用encoding的编码方式来解析请求和响应
    <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

CharacterEncodingFilter源码:
package org.springframework.web.filter;

import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.lang.Nullable;
import org.springframework.util.Assert;


public class CharacterEncodingFilter extends OncePerRequestFilter {

//filter中被定义为UTF-8
   @Nullable
   private String encoding;
//是否要强制用encoding编码方式来解析请求内容,默认为false
   private boolean forceRequestEncoding = false;
//是否要强制用encoding编码方式来解析响应内容,默认为false
   private boolean forceResponseEncoding = false;


   public CharacterEncodingFilter() {
   }

   public CharacterEncodingFilter(String encoding) {
      this(encoding, false);
   }

   public CharacterEncodingFilter(String encoding, boolean forceEncoding) {
      this(encoding, forceEncoding, forceEncoding);
   }

   public CharacterEncodingFilter(String encoding, boolean forceRequestEncoding, boolean forceResponseEncoding) {
      Assert.hasLength(encoding, "Encoding must not be empty");
      this.encoding = encoding;
      this.forceRequestEncoding = forceRequestEncoding;
      this.forceResponseEncoding = forceResponseEncoding;
   }

   public void setEncoding(@Nullable String encoding) {
      this.encoding = encoding;
   }

   @Nullable
   public String getEncoding() {
      return this.encoding;
   }
//接收filter传入的forceEncoding,将forceRequestEncoding和forceResponseEncoding设置为true
   public void setForceEncoding(boolean forceEncoding) {
      this.forceRequestEncoding = forceEncoding;
      this.forceResponseEncoding = forceEncoding;
   }

   public void setForceRequestEncoding(boolean forceRequestEncoding) {
      this.forceRequestEncoding = forceRequestEncoding;
   }

   public boolean isForceRequestEncoding() {
      return this.forceRequestEncoding;
   }

   public void setForceResponseEncoding(boolean forceResponseEncoding) {
      this.forceResponseEncoding = forceResponseEncoding;
   }
//filter中已经forceEncoding设置为true,所以isForceResponseEncoding的值为true
   public boolean isForceResponseEncoding() {
      return this.forceResponseEncoding;
   }


   @Override
   protected void doFilterInternal(
         HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
         throws ServletException, IOException {

      String encoding = getEncoding();
      if (encoding != null) {
          //因为isForceResponseEncoding为true,所以if中的语句一定会被执行
         if (isForceRequestEncoding() || request.getCharacterEncoding() == null) {
             //设置请求编码方式
            request.setCharacterEncoding(encoding);
         }
         //也会被执行
         if (isForceResponseEncoding()) {
            response.setCharacterEncoding(encoding);
         }
      }
      filterChain.doFilter(request, response);
   }

}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值