一、默认方式获取请求参数
直接给方法入参写一个和请求参数名相同的变量,这个变量就可以接收请求的参数值
<a href="request1?username=张三">获取请求参数</a>
@RequestMapping(value = "/request1")
public String request1(String username){
System.out.println(username);
return "success";
}
二、@RequestParam
获取请求参数的值
@RequestParam
可以获取请求的指定参数的值,默认参数必须存在。
它有三个属性:
- value:指定要获取的参数的key
- required:指定这个参数是否是必须的
- defaultValue:默认值
@RequestMapping(value = "/request1")
public String request1(@RequestParam(value = "user", required = false, defaultValue = "null") String username){ //就相当于username=request.getParameter("user")
System.out.println(username);
return "success";
}
要注意@PathVariable
是获取路径中参数的值(/user/{id}
),@RequestParam
是获取请求的参数的值(?username=XXX
)。
三、@RequestHeader
获取请求头中的值
@RequestHeader("User-Agent")
可以获取浏览器的信息,相当于userAgent=request.getHeader("User-Agent")
。
它也有三个值:
- value:参数的值
- required:是否必须
- defaultValue:默认值
@RequestMapping(value = "/request1")
public String request1(@RequestHeader("User-Agent") String UserAgent,@RequestParam(value = "user", required = false, defaultValue = "null") String username){ //就相当于username=request.getParameter("user")
System.out.println(username);
System.out.println(UserAgent);
return "success";
}
四、@CookieValue
获取请求中某个Cookie的值
它也有三个值:
- value:参数的值
- required:是否必须
- defaultValue:默认值
@RequestMapping(value = "/request1")
public String request1(
@RequestHeader("User-Agent") String UserAgent,
@RequestParam(value = "user", required = false, defaultValue = "null") String username, //就相当于username=request.getParameter("user")
@CookieValue("JSESSIONID") String JID){
System.out.println(username);
System.out.println(UserAgent);
System.out.println(JID);
return "success";
}
五、SpringMVC自动封装POJO
创建一个表单用来提交book
信息
<form action="addBook" method="post">
<input type="text" name="bookName"/><br/>
<input type="text" name="author"/><br/>
<input type="text" name="price"/><br/>
<input type="text" name="stock"/><br/>
<input type="text" name="sales"/><br/>
</form>
SpringMVC自动封装book
对象
@RequestMapping(value = "/addBook")
public String addBook(Book book){
System.out.println("保存图书:" + book);
return "success";
}
关于中文乱码问题可以配置一个字符编码Filter
<!--配置字符编码的Filter-->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<!--encoding指定解决POST请求乱码-->
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<!--forceEncoding解决响应乱码-->
<init-param>
<param-name>forceEncoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
CharacterEncodingFilter
类源码
通过request.setCharacterEncoding(encoding)
设置字符编码方式
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
String encoding = this.getEncoding();
if (encoding != null) {
if (this.isForceRequestEncoding() || request.getCharacterEncoding() == null) {
request.setCharacterEncoding(encoding);
}
if (this.isForceResponseEncoding()) {
response.setCharacterEncoding(encoding);
}
}
filterChain.doFilter(request, response);
}
要注意的是字符编码Filter一定要在其它Filter之前配置,因为一定要在第一次获取请求参数之前配置字符编码才会有效
输出结果:
六、请求参数传入原生API
SpringMVC也可以直接在参数上写原生API,比如HttpServletRequest
、HttpSession
。
只可以接受这几个原生API
1)HttpServletRequest
2)HttpServletResponse
3)HttpSession
4)java.security.Principal
5)Locale
6)InputStream
7)OutputStream
8)Reader
9)Writer
@RequestMapping("/API")
public String requestAPI(HttpSession session, HttpServletRequest request, HttpServletResponse response){
request.setAttribute("reqParam","请求域中的参数");
session.setAttribute("sessionParam","session域中的参数");
ServletInputStream inputStream = request.getInputStream();
ServletOutputStream outputStream = response.getOutputStream();
BufferedReader reader = request.getReader();
PrintWriter writer = response.getWriter();
return "success";
}