4、数据处理及跳转

4.1结果跳转方式

4.1.1 ModelAndView

设置ModelAndView对象 , 根据view的名称 , 和视图解析器跳到指定的页面 .

页面 : {视图解析器前缀} + viewName +{视图解析器后缀}

  1. <!-- 视图解析器 -->
  2. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
  3. id="internalResourceViewResolver">
  4. <!-- 前缀 -->
  5. <property name="prefix" value="/WEB-INF/jsp/" />
  6. <!-- 后缀 -->
  7. <property name="suffix" value=".jsp" />
  8. </bean>

对应的controller类

  1. public class ControllerTest1 implements Controller {
  2. public ModelAndView handleRequest(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse) throws Exception {
  3. //返回一个模型视图对象
  4. ModelAndView mv = new ModelAndView();
  5. mv.addObject("msg","ControllerTest1");
  6. mv.setViewName("test");
  7. return mv;
  8. }
  9. }

4.1.2 ServletAPI

通过设置ServletAPI , 不需要视图解析器 .

1、通过HttpServletResponse进行输出

2、通过HttpServletResponse实现重定向

3、通过HttpServletResponse实现转发

  1. @Controller
  2. public class ResultGo {
  3. @RequestMapping("/result/t1")
  4. public void test1(HttpServletRequest req, HttpServletResponse rsp) throwsIOException {
  5. rsp.getWriter().println("Hello,Spring BY servlet API");
  6. }
  7. @RequestMapping("/result/t2")
  8. public void test2(HttpServletRequest req, HttpServletResponse rsp) throwsIOException {
  9. rsp.sendRedirect("/index.jsp");
  10. }
  11. @RequestMapping("/result/t3")
  12. public void test3(HttpServletRequest req, HttpServletResponse rsp) throwsException {
  13. //转发
  14. req.setAttribute("msg","/result/t3");
  15. req.getRequestDispatcher("/WEB-INF/jsp/test.jsp").forward(req,rsp);
  16. }
  17. }

4.1.3 SpringMVC

通过SpringMVC来实现转发和重定向 - 无需视图解析器;

测试前,需要将视图解析器注释掉

  1. @Controller
  2. public class ResultSpringMVC {
  3. @RequestMapping("/rsm/t1")
  4. public String test1(){
  5. //转发
  6. return "/index.jsp";
  7. }
  8. @RequestMapping("/rsm/t2")
  9. public String test2(){
  10. //转发二
  11. return "forward:/index.jsp";
  12. }
  13. @RequestMapping("/rsm/t3")
  14. public String test3(){
  15. //重定向
  16. return "redirect:/index.jsp";
  17. }
  18. }

通过SpringMVC来实现转发和重定向 - 有视图解析器;

重定向 , 不需要视图解析器 , 本质就是重新请求一个新地方嘛 , 所以注意路径问题.

可以重定向到另外一个请求实现 .

  1. @Controller
  2. public class ResultSpringMVC2 {
  3. @RequestMapping("/rsm2/t1")
  4. public String test1(){
  5. //转发
  6. return "test";
  7. }
  8. @RequestMapping("/rsm2/t2")
  9. public String test2(){
  10. //重定向
  11. return "redirect:/index.jsp";
  12. //return "redirect:hello.do"; //hello.do为另一个请求/
  13. }
  14. }

4.2 数据处理

4.2.1 处理提交数据

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

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

处理方法 :

  1. @RequestMapping("/hello")
  2. public String hello(String name){
  3. System.out.println(name);
  4. return "hello";
  5. }

后台输出 : chenshen

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

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

处理方法 :

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

后台输出 : chenshen

3、提交的是一个对象

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

1、实体类

  1. public class User {
  2. private int id;
  3. private String name;
  4. private int age;
  5. //构造
  6. //get/set
  7. //tostring()
  8. }

2、提交数据 : http://localhost:8080/mvc04/user?name=chenshen&id=1&age=15

3、处理方法 :

  1. @RequestMapping("/user")
  2. public String user(User user){
  3. System.out.println(user);
  4. return "hello";
  5. }

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

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

4.2.2 数据显示到前端

第一种 : 通过ModelAndView

我们前面一直都是如此 . 就不过多解释

  1. public class ControllerTest1 implements Controller {
  2. public ModelAndView handleRequest(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse) throws Exception {
  3. //返回一个模型视图对象
  4. ModelAndView mv = new ModelAndView();
  5. mv.addObject("msg","ControllerTest1");
  6. mv.setViewName("test");
  7. return mv;
  8. }
  9. }

第二种 : 通过ModelMap

ModelMap

  1. @RequestMapping("/hello")
  2. public String hello(@RequestParam("username") String name, ModelMap model){
  3. //封装要显示到视图中的数据
  4. //相当于req.setAttribute("name",name);
  5. model.addAttribute("name",name);
  6. System.out.println(name);
  7. return "hello";
  8. }

第三种 : 通过Model

Model

  1. @RequestMapping("/ct2/hello")
  2. public String hello(@RequestParam("username") String name, Model model){
  3. //封装要显示到视图中的数据
  4. //相当于req.setAttribute("name",name);
  5. model.addAttribute("msg",name);
  6. System.out.println(name);
  7. return "test";
  8. }

对比

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

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

当然更多的以后开发考虑的更多的是性能和优化,就不能单单仅限于此的了解。

请使用80%的时间打好扎实的基础,剩下18%的时间研究框架,2%的时间去学点英文,框架的官方文档永远是最好的教程。

4.2.3 乱码问题

测试步骤:

1、我们可以在首页编写一个提交的表单

  1. <form action="/e/t" method="post">
  2. <input type="text" name="name">
  3. <input type="submit">
  4. </form>

2、后台编写对应的处理类

  1. @Controller
  2. public class Encoding {
  3. @RequestMapping("/e/t")
  4. public String test(Model model,String name){
  5. model.addAttribute("msg",name); //获取表单提交的值
  6. return "test"; //跳转到test页面显示输入的值
  7. }
  8. }

3、输入中文测试,发现乱码

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

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

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

  1. <filter>
  2. <filter-name>encoding</filter-name>
  3. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  4. <init-param>
  5. <param-name>encoding</param-name>
  6. <param-value>utf-8</param-value>
  7. </init-param>
  8. </filter>
  9. <filter-mapping>
  10. <filter-name>encoding</filter-name>
  11. <url-pattern>/*</url-pattern>
  12. </filter-mapping>

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

处理方法 :

1、修改tomcat配置文件 :设置编码!

  1. <Connector URIEncoding="utf-8" port="8080" protocol="HTTP/1.1"
  2. connectionTimeout="20000"
  3. redirectPort="8443" />

2、自定义过滤器

  1. package com.chen.filter;
  2. import javax.servlet.*;
  3. import javax.servlet.http.HttpServletRequest;
  4. import javax.servlet.http.HttpServletRequestWrapper;
  5. import javax.servlet.http.HttpServletResponse;
  6. import java.io.IOException;
  7. import java.io.UnsupportedEncodingException;
  8. import java.util.Map;
  9. /**
  10. * 解决get和post请求 全部乱码的过滤器
  11. */
  12. public class GenericEncodingFilter implements Filter {
  13. @Override
  14. public void destroy() {
  15. }
  16. @Override
  17. public void doFilter(ServletRequest request, ServletResponse response, FilterChainchain) throws IOException, ServletException {
  18. //处理response的字符编码
  19. HttpServletResponse myResponse=(HttpServletResponse) response;
  20. myResponse.setContentType("text/html;charset=UTF-8");
  21. // 转型为与协议相关对象
  22. HttpServletRequest httpServletRequest = (HttpServletRequest) request;
  23. // 对request包装增强
  24. HttpServletRequest myrequest = new MyRequest(httpServletRequest);
  25. chain.doFilter(myrequest, response);
  26. }
  27. @Override
  28. public void init(FilterConfig filterConfig) throws ServletException {
  29. }
  30. }
  31. //自定义request对象,HttpServletRequest的包装类
  32. class MyRequest extends HttpServletRequestWrapper {
  33. private HttpServletRequest request;
  34. //是否编码的标记
  35. private boolean hasEncode;
  36. //定义一个可以传入HttpServletRequest对象的构造函数,以便对其进行装饰
  37. public MyRequest(HttpServletRequest request) {
  38. super(request);// super必须写
  39. this.request = request;
  40. }
  41. // 对需要增强方法 进行覆盖
  42. @Override
  43. public Map getParameterMap() {
  44. // 先获得请求方式
  45. String method = request.getMethod();
  46. if (method.equalsIgnoreCase("post")) {
  47. // post请求
  48. try {
  49. // 处理post乱码
  50. request.setCharacterEncoding("utf-8");
  51. return request.getParameterMap();
  52. } catch (UnsupportedEncodingException e) {
  53. e.printStackTrace();
  54. }
  55. } else if (method.equalsIgnoreCase("get")) {
  56. // get请求
  57. Map<String, String[]> parameterMap = request.getParameterMap();
  58. if (!hasEncode) { // 确保get手动编码逻辑只运行一次
  59. for (String parameterName : parameterMap.keySet()) {
  60. String[] values = parameterMap.get(parameterName);
  61. if (values != null) {
  62. for (int i = 0; i < values.length; i++) {
  63. try {
  64. // 处理get乱码
  65. values[i] = new String(values[i]
  66. .getBytes("ISO-8859-1"), "utf-8");
  67. } catch (UnsupportedEncodingException e) {
  68. e.printStackTrace();
  69. }
  70. }
  71. }
  72. }
  73. hasEncode = true;
  74. }
  75. return parameterMap;
  76. }
  77. return super.getParameterMap();
  78. }
  79. //取一个值
  80. @Override
  81. public String getParameter(String name) {
  82. Map<String, String[]> parameterMap = getParameterMap();
  83. String[] values = parameterMap.get(name);
  84. if (values == null) {
  85. return null;
  86. }
  87. return values[0]; // 取回参数的第一个值
  88. }
  89. //取所有值
  90. @Override
  91. public String[] getParameterValues(String name) {
  92. Map<String, String[]> parameterMap = getParameterMap();
  93. String[] values = parameterMap.get(name);
  94. return values;
  95. }
  96. }

这个也是我在网上找的一些大神写的,一般情况下,SpringMVC默认的乱码处理就已经能够很好的解决了!

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

乱码问题,需要平时多注意,在尽可能能设置编码的地方,都设置为统一编码 UTF-8!

SpringMVC学习04(数据处理及跳转)的更多相关文章

  1. 【SpringMVC学习04】Spring、MyBatis和SpringMVC的整合

    前两篇springmvc的文章中都没有和mybatis整合,都是使用静态数据来模拟的,但是springmvc开发不可能不整合mybatis,另外mybatis和spring的整合我之前学习mybati ...

  2. springmvc学习笔记(常用注解)

    springmvc学习笔记(常用注解) 1. @Controller @Controller注解用于表示一个类的实例是页面控制器(后面都将称为控制器). 使用@Controller注解定义的控制器有如 ...

  3. springMVC学习总结(三)数据绑定

    springMVC学习总结(三)数据绑定 一.springMVC的数据绑定,常用绑定类型有: 1.servlet三大域对象: HttpServletRequest HttpServletRespons ...

  4. SpringMVC学习笔记之二(SpringMVC高级参数绑定)

    一.高级参数绑定 1.1 绑定数组 需求:在商品列表页面选中多个商品,然后删除. 需求分析:功能要求商品列表页面中的每个商品前有一个checkbok,选中多个商品后点击删除按钮把商品id传递给Cont ...

  5. (转)SpringMVC学习(五)——SpringMVC的参数绑定

    http://blog.csdn.net/yerenyuan_pku/article/details/72511611 SpringMVC中的参数绑定还是蛮重要的,所以单独开一篇文章来讲解.本文所有案 ...

  6. (转)SpringMVC学习(十二)——SpringMVC中的拦截器

    http://blog.csdn.net/yerenyuan_pku/article/details/72567761 SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter, ...

  7. (转)SpringMVC学习(七)——Controller类的方法返回值

    http://blog.csdn.net/yerenyuan_pku/article/details/72511844 本文所有案例代码的编写均建立在前文SpringMVC学习(六)——SpringM ...

  8. SpringMVC-04 数据处理及跳转

    SpringMVC-04 数据处理及跳转 结果跳转方式 1.ModelAndView 设置ModelAndView对象 , 根据view的名称 , 和视图解析器跳到指定的页面 . 页面 : {视图解析 ...

  9. springMVC学习总结(三) --springMVC重定向

    根据springMVC学习总结(一) --springMVC搭建搭建项目 在com.myl.controller包下创建一个java类WebController. 在jsp子文件夹下创建一个视图文件i ...

随机推荐

  1. 如何使用原生的Feign

    什么是Feign Feign 是由 Netflix 团队开发的一款基于 Java 实现的 HTTP client,借鉴了 Retrofi. JAXRS-2.0.WebSocket 等类库.通过 Fei ...

  2. Vue 两个字段联合校验典型例子--修改密码

    1.前言   本文是前文<Vue Element-ui表单校验规则,你掌握了哪些?>针对多字段联合校验的典型应用.   在修改密码时,一般需要确认两次密码一致,涉及2个属性字段.类似的涉及 ...

  3. Linux系统inodes资源耗尽时的查找及删除

    for i in {1..10}; do echo $i; ls > $i.log; done for i in $(seq 1 10); do echo $i; done 以上为for循环的使 ...

  4. (转发)forward与(重定向)redirect的区别

    (转发)forward与(重定向)redirect的区别 forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服 ...

  5. 『无为则无心』Python函数 — 28、Python函数的简单应用

    目录 1.函数嵌套调用 2.Python函数的简单应用 (1)打印线条 (2)函数计算 (3)打印图形 3.函数的说明文档 (1)函数的说明文档的作用 (2)函数说明文档的语法 (3)查看函数的说明文 ...

  6. 认识Java中String与StringBuffer以及StringBuilder

    String(引用数据类型) String对象一经创建就不会发生变化(在常量池里),即便是赋予新的值,也不是在原来的基础上改变,而是创建一个新的字符串对象,将引用指向这个对象,会造成空间的浪费: St ...

  7. Pytorch的模型加速方法:Dataparallel (DP) 和 DataparallelDistributedparallel (DDP)

    Dataparallel 和 DataparallelDistributed 的区别 一.Dataparallel(DP) 1.1 Dartaparallel 的使用方式 Dataparallel 的 ...

  8. ES异地双活方案

    对于单机房而言,只要参考Elastic Search 官方文档,搭建一个集群即可,示意图如下: 原理类似分布式选举那一套,当一个master节点宕机时,剩下2个投票选出1个新老大,整个集群可以继续服务 ...

  9. python pyinsane应用

    import sys from PIL import Image try: import src.abstract as pyinsane except ImportError: import pyi ...

  10. C语言:const详解

    希望定义这样一种变量,它的值不能被改变,在整个作用域中都保持固定.例如,用一个变量来表示班级的最大人数,或者表示缓冲区的大小.为了满足这一要求,可以使用const关键字对变量加以限定:const in ...