SpringMVC-04-参数传递
5、关于参数传递问题
5.1、参数传递
对比学习:我们之前是通过 request的getParameter()来获取,现在我们可以直接通过形参进行接收
并且Spring还对对象类参数做了加功
1、RequestParam注解
-
@RequestParam(“重命名”)
如果参数传的不一致会直接报错,保证了参数传递的安全性
@RequestMapping("/t1")
public String test01(@RequestParam("username") String name, Model model) {
System.out.println(name);
return "redirect:/test";
}
我们这里就必须传username
- 联想:MyBatis在参数多的时候也要写@Param
MyBatis要求在多个参数的时候用让@Param,在单个参数时可以不用但是也建议使用,对象参数时不用
1.5、传递参数为对象时,Spring会通过set方法自动DL
2、MVC实现转发和重定向
转发:默认就是转发,返回值不写就是转发
@RequestMapping("/post")
public String test01(@RequestParam("username") String name, Model model) {
System.out.println(name);
//默认就是转发
model.addAttribute("msg", name);
return "test";
}
- 重定向,在返回值前面加上:redirect:不要加多余的空格!
@RequestMapping("/t2")
public String test02(@RequestParam("username") String name, Model model) {
System.out.println(name);
model.addAttribute("msg", name);
//路径问题,不要瞎加空格
return "redirect:/index.jsp";
}
5.2、乱码问题
我们主要学习这个分析过程
- 看请求:看携带的信息是否出现乱
- 如何是乱码则说明前端走请求时传递数据就出现乱码
- 此时我们拿到这个参数进行设置是无法解决问题的,因为拿到的就是乱码
- 怎么解决? 在请求的时候处理:就是加过滤器
- 如果请求携带的不是乱码
- 则是后端处理参数的问题
- 还有一种是我们设置的都很完美,但是前端浏览器编码出现的问题
Spring已经帮我们写好了一个过滤器,我们可以直接拿来用
<!-- Ending过滤器-->
<filter>
<filter-name>encoding</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>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
足够解决大部分乱码,如果还有就去网上搜索大佬写的解决乱码的问题。
处理方式
1、修改tomcat配置文件 :设置编码!
<Connector URIEncoding="utf-8" port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
2、自定义过滤器
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!
3、Json乱码问题
<!-- 乱码问题统一解决-->
<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg value="UTF-8"/>
</bean>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper">
<bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
<property name="failOnEmptyBeans" value="false"/>
</bean>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>