默认方式获取请求参数:
<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);
}
}