保持热爱、奔赴山河
在控制器方法的形参位置设置HttpServletRequest类型的形参,就可以在控制器方法中使用request对象获取请求参数。
<form th:action="@{/testParam}" method="post">
用户名<input type="text" name="username">
密码<input type="password" name="password">
<input type="submit">
form>
@RequestMapping("/testParam")
public String testParam(HttpServletRequest request) {
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println("username:" + username + ",password:" + password);
return "success";
}
在控制器方法的形参位置,设置和请求参数同名的形参,当浏览器发送请求,匹配到请求映射时,在DispatcherServlet中就会将请求参数赋值给相应的形参。
<a th:href="@{/test/param(username='admin',password=123456)}">测试获取请求参数--
>/testParama><br>
@RequestMapping("/test/param")
public String testParam(String username, String password) {
System.out.println("username:" + username + ",password:" + password);
return "success";
}
若请求所传输的请求参数中有多个同名的请求参数,此时可以在控制器方法的形参中设置字符串数组或者字符串类型的形参接收此请求参数。
若使用字符串数组类型的形参,此参数的数组中包含了每一个数据。
若使用字符串类型的形参,此参数的值为每个数据中间使用逗号拼接的结果。
@RequestParam:当请求参数与控制器方法的形参名称不一致,通过自定义名称来创建映射关系。
@RequestParam注解一共有三个属性:
value:
required:
defaultValue:
@RequestMapping("/test/param")
public String testParam(@RequestParam("username") String username, @RequestParam("password") String password) {
System.out.println("username:" + username + ",password:" + password);
return "success";
}
@RequestHeader:将请求头信息与控制器方法的形参绑定。
@RequestHeader注解的三个属性:value、required、defaultValue,用法同@RequestParam。
@RequestMapping("/test/param")
public String testParam(@RequestParam("username") String username, @RequestParam("password") String password, @RequestHeader("referer") String referer) {
System.out.println("referer:" + referer);
System.out.println("username:" + username + ",password:" + password);
return "success";
}
@CookieValue:将cookie数据和控制器方法的形参绑定。
@CookieValue注解的三个属性:value、required、defaultValue,用法同@RequestParam。
先通过session向浏览器发送一个名为JSESSIONID的cookie。
@RequestMapping("/test/servletapi")
public String testServletAPI(HttpServletRequest request) {
// 向浏览器响应一个JSESSIONID的Cookie
HttpSession session = request.getSession();
return "success";
}
@RequestMapping("/test/param")
public String testParam(@RequestParam("username") String username, @RequestParam("password") String password, @CookieValue("JSESSIONID") String jsessionId) {
System.out.println("JSESSIONID:" + jsessionId);
System.out.println("username:" + username + ",password:" + password);
return "success";
}
在控制器方法的形参位置设置一个实体类类型的形参,实体类中的属性名与请求参数的参数名一致,就可以通过实体类类型的形参获取请求参数。
<form th:action="@{/testpojo}" method="post">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
性别:<input type="radio" name="sex" value="男">男<input type="radio"
name="sex" value="女">女<br>
年龄:<input type="text" name="age"><br>
邮箱:<input type="text" name="email"><br>
<input type="submit">
form>
@RequestMapping("/testpojo")
public String testPOJO(User user){
System.out.println(user);
return "success";
}
// 最终结果-->User{id=null, username='张三', password='123', age=23, sex='男',
// email='123@qq.com'}
解决获取请求参数的乱码问题,可以使用SpringMVC提供的编码过滤器CharacterEncodingFilter,但是必须在web.xml中进行注册。
如果使用控制器方法传参的方式获取request,在设置字符集编码是无效的,因为request设置字符集编码必须写在所有代码前面。
Tomcat 7 中GET有乱码问题,Tomcat 8.5中GET没有乱码问题。
Tomcat 7和Tomcat 8.5中POST都有乱码问题。
是在Tomcat目录下—>conf—>server.xml文件,在Connector标签中添加URIEncoding=“UTF-8”。
使用Servlet的解决方法。
// servlet中解决方法,这个方法在SpringMVC中不能用,设置
// 编码之前不能获取任何参数
request.setCharacterEncoding("UTF-8");
使用SpringMVC提供的过滤器解决Tomcat中POST乱码问题。
<filter>
<filter-name>CharacterEncodingFilterfilter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
<init-param>
<param-name>encodingparam-name>
<param-value>UTF-8param-value>
init-param>
<init-param>
<param-name>forceEncodingparam-name>
<param-value>trueparam-value>
init-param>
filter>
<filter-mapping>
<filter-name>CharacterEncodingFilterfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
SpringMVC的编码过滤器传入的两个参数
查看CharacterEncodingFilter类
构造方法(“UTF-8”,“true”)
自动调用三个参数构造方法
forceRequestEncoding = “true”;
forceResponseEncoding = “true”;
返回这两个变量
解决乱码的具体实现
当encoding不等于空,没有设置request,并且这两个变量true,设置request字符集,设置response字符集。
SpringMVC中处理编码的过滤器一定要配置到其他过滤器之前,否则无效。
package com.kuang.filter;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Map;
/**
* 解决get和post请求 全部乱码的过滤器
*/
public class GenericEncodingFilter implements Filter {
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//处理response的字符编码
HttpServletResponse myResponse=(HttpServletResponse) response;
myResponse.setContentType("text/html;charset=UTF-8");
// 转型为与协议相关对象
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
// 对request包装增强
HttpServletRequest myrequest = new MyRequest(httpServletRequest);
chain.doFilter(myrequest, response);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
}
//自定义request对象,HttpServletRequest的包装类
class MyRequest extends HttpServletRequestWrapper {
private HttpServletRequest request;
//是否编码的标记
private boolean hasEncode;
//定义一个可以传入HttpServletRequest对象的构造函数,以便对其进行装饰
public MyRequest(HttpServletRequest request) {
super(request);// super必须写
this.request = request;
}
// 对需要增强方法 进行覆盖
@Override
public Map getParameterMap() {
// 先获得请求方式
String method = request.getMethod();
if (method.equalsIgnoreCase("post")) {
// post请求
try {
// 处理post乱码
request.setCharacterEncoding("utf-8");
return request.getParameterMap();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
} else if (method.equalsIgnoreCase("get")) {
// get请求
Map<String, String[]> parameterMap = request.getParameterMap();
if (!hasEncode) { // 确保get手动编码逻辑只运行一次
for (String parameterName : parameterMap.keySet()) {
String[] values = parameterMap.get(parameterName);
if (values != null) {
for (int i = 0; i < values.length; i++) {
try {
// 处理get乱码
values[i] = new String(values[i]
.getBytes("ISO-8859-1"), "utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
}
hasEncode = true;
}
return parameterMap;
}
return super.getParameterMap();
}
//取一个值
@Override
public String getParameter(String name) {
Map<String, String[]> parameterMap = getParameterMap();
String[] values = parameterMap.get(name);
if (values == null) {
return null;
}
return values[0]; // 取回参数的第一个值
}
//取所有值
@Override
public String[] getParameterValues(String name) {
Map<String, String[]> parameterMap = getParameterMap();
String[] values = parameterMap.get(name);
return values;
}
}
一般情况下,SpringMVC默认的乱码处理就已经能够很好的解决了!
然后在web.xml中配置这个过滤器即可!
乱码问题,需要平时多注意,在尽可能能设置编码的地方,都设置为统一编码 UTF-8!