Spring MVC中是如何对数据进行处理的
创始人
2024-11-21 15:22:08
0次

一、数据处理

1.1 处理提交数据

1.1.1 提交的域名称和处理方法的参数名一致

提交数据:http://localhost:8080/hello?name=test

处理方法:

@RequestMapping("/hello")
public String hello(String name){
 System.out.println(name);
 return "hello";
}

后台输出test

Spring MVC中是如何对数据进行处理的

1.1.2 提交的域名称和处理方法的参数名不一致

提交数据:http://localhost:8080/hello?username=test

处理方法:

//@RequestParam("username") : username提交的域的名称 .
@RequestMapping("/hello")
public String hello(@RequestParam("username") String name){
 System.out.println(name);
 return "hello";
}

Spring MVC中是如何对数据进行处理的

1.1.3 提交的是一个对象

要求提交的表单域和对象的属性名一致,参数使用对象即可

1. 实体类

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class User {
 private int id;
 private String name;
 private int age;
}

2. 提交数据:

http://localhost:8080/mvc04/user?name=test&id=1&age=15

3. 处理方法

@RequestMapping("/user")
public String user(User user){
 System.out.println(user);
 return "hello";
}

后台输出 : User { id=1, name='test', age=15 }

说明:如果使用对象的话,前端传递的参数名和对象名必须一致,否则就是null。

1.2 数据显示到前端

1.2.1 通过ModelAndView
 public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
 //返回一个模型视图对象
 ModelAndView mv = new ModelAndView();
 mv.addObject("msg","ControllerTest1");
 mv.setViewName("test");
 return mv;
 }
}
1.2.2 通过ModelMap
@RequestMapping("/hello")
public String hello(@RequestParam("username") String name, ModelMap model){
 //封装要显示到视图中的数据
 //相当于req.setAttribute("name",name);
 model.addAttribute("name",name);
 System.out.println(name);
 return "hello";
}
1.2.3 通过Model
@RequestMapping("/ct2/hello")
public String hello(@RequestParam("username") String name, Model model){
 //封装要显示到视图中的数据
 //相当于req.setAttribute("name",name);
 model.addAttribute("msg",name);
 System.out.println(name);
 return "test";
}
1.2.4 对比

就对于新手而言简单来说使用区别就是:

Model 只有寥寥几个方法只适合用于储存数据,简化了新手对于Model对象的操作和理解;
ModelMap 继承了 LinkedMap ,除了实现了自身的一些方法,同样的继承 LinkedMap 的方法和特性;
ModelAndView 可以在储存数据的同时,可以进行设置返回的逻辑视图,进行控制展示层的跳转。

二、乱码问题

 2.1 新建form表单

在web目录下编写一个提交表单,注意开启视图解析器

2.2 后台编写对应的处理类

@Controller
public class EncodingController {
 
 @RequestMapping("/e/t")
 public String test1(String name, Model model) {
 System.out.println(name);
 //获取表达提交的值
 model.addAttribute("msg", name);
 //跳转到test页面显示输入的值
 return "test";
 }
}

2.3 测试

Spring MVC中是如何对数据进行处理的

Spring MVC中是如何对数据进行处理的

三、乱码问题解决

3.1 web.xml文件配置编码过滤器

不得不说,乱码问题是在我们开发中十分常见的问题,也是让我们程序猿比较头大的问题!

以前乱码问题通过过滤器解决 , 而SpringMVC给我们提供了一个过滤器 , 可以在web.xml中配置

修改了xml文件需要重启服务器!


 encoding
 org.springframework.web.filter.CharacterEncodingFilter
 
 encoding
 utf-8
 


 encoding
 /*

但是我们发现 , 有些极端情况下.这个过滤器对get的支持不好 .

处理方法 :

3.1.1 修改tomcat配置文件:

Spring MVC中是如何对数据进行处理的

Spring MVC中是如何对数据进行处理的

 
 
 encoding
 org.springframework.web.filter.CharacterEncodingFilter
 
 encoding
 utf-8
 
 
 
 encoding
 /*
 
3.1.2 自定义过滤器
/**
* 解决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 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 parameterMap = getParameterMap();
 String[] values = parameterMap.get(name);
 if (values == null) {
 return null;
 }
 return values[0]; // 取回参数的第一个值
 }
 
 //取所有值
 @Override
 public String[] getParameterValues(String name) {
 Map parameterMap = getParameterMap();
 String[] values = parameterMap.get(name);
 return values;
 }
}

然后在web.xml中配置这个过滤器即可! 

Spring MVC中是如何对数据进行处理的

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...