一.SpringMVC接受参数
1.处理后台与提交数据名相同的数据
在controller函数参数中直接使用
@Controller
public class InfSever {
//注意路径前添加斜杠
@RequestMapping("/getinf")
public String getSameInf(String inf, Model model){
model.addAttribute("Inf",inf);
return "inf";
}
}
//如访问:http://localhost:8080/getinf?inf=%22hahhahah%22
2.处理后台与提交数据名不同的数据
添加@RequestParam(“name”)注释(建议名称相同也添加此注释)
@Controller
public class InfSever {
//注意路径前添加斜杠
@RequestMapping("/getinf")
public String getSameInf(@RequestParam("information") String inf, Model model){
model.addAttribute("Inf",inf);
return "inf";
}
}
//如访问:http://localhost:8080/getinf?information=Luozhiqiang
3.前端提交一个对象(的属性)
1.前提
- 接收前端用户传递的参数,判断参数的名字,假设名字直接在方法上,可以直接使用
- 假设传递的是一个对象User,匹User对象中的字段名:如果名字一致则可以匹配,否则,匹配不到,值为null
- 实体类要有getter,setter,构造函数,可以用lombok注释代替
<!--lombok依赖-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.20</version>
</dependency>
2.lombok常用注释:
- @Data
使用这个注解,就不用再去手写Getter,Setter,equals,canEqual,hasCode,toString等方法了,注解后在编译时会自动加进去。 - @AllArgsConstructor 使用后添加一个构造函数,该构造函数含有所有已声明字段属性参数
- @NoArgsConstructor 使用后创建一个无参构造函数
- @Builder
关于Builder较为复杂一些,Builder的作用之一是为了解决在某个类有很多构造函数的情况,也省去写很多构造函数的麻烦,在设计模式中的思想是:用一个内部类去实例化一个对象,避免一个类出现过多构造函数,
//实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private String name;
private int age;
private int tel;
}
//Controller类
@Controller
public class hello {
@RequestMapping("user")
public String hello(User user,Model model){
//System.out.println("RUN TO HERE");
model.addAttribute("msg",user.toString());
return "hello";
}
}
//如访问:http://localhost:8080/user?id=001&name=luo&age=18
二.SpringMVC接数据回显
1.ModelAndView
2.ModelMap
其继承LinkedHashMap
3.Model
精简版ModelMap
三.乱码问题
1.自定义过滤器解决乱码
1.编写过滤器
(pose似乎有问题。。。。)
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;
}
}
2.配置web.xml
<filter>
<filter-name>encoding</filter-name>
<filter-class>com.luo.filter.EncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3.问题
get乱码
2.Spring过滤器解决乱码
1.xml配置
(完美)
<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>
注意一定要在路径后面加:“*”
而配置severlet时不能写
2.问题
post乱码
3.终极解决方法—配置Tomcat配置
1.路径:
…\apache-tomcat-version\conf
<!-- A "Connector" represents an endpoint by which requests are received
and responses are returned. Documentation at :
Java HTTP Connector: /docs/config/http.html
Java AJP Connector: /docs/config/ajp.html
APR (HTTP/AJP) Connector: /docs/apr.html
Define a non-SSL/TLS HTTP/1.1 Connector on port 8080
-->
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
<!--添加-->
URLEncoding="UTF-8"/>