SpringMVC-04 数据处理及跳转

结果跳转方式

1.ModelAndView

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

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

  1. <!-- 视图解析器 -->
  2. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
  3. id="internalResourceViewResolver">
  4. <!-- 前缀 WEB-INF中的页面不能直接访问,比较安全 -->
  5. <property name="prefix" value="/WEB-INF/jsp/" />
  6. <!-- 后缀 -->
  7. <property name="suffix" value=".jsp" />

一、对应的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. }

二、对应的controller类(注解版)

  1. @Controller
  2. public class ControllerTest1 {
  3. @RequestMapping("/hello")
  4. public String index2(Model model){
  5. model.addAttribute("msg", "ControllerTest1");
  6. return "test";
  7. }
  8. }

上面的: mv.setViewName("test"); 和 return "test";

访问的网址为:/WEB-INF/jsp/test.jsp

重定向和转发

1.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) throws IOException { //直接输出信息
  5. rsp.getWriter().println("Hello,Spring BY servlet API");
  6. }
  7. @RequestMapping("/result/t2")
  8. public void test2(HttpServletRequest req, HttpServletResponse rsp) throws IOException { //重定向
  9. rsp.sendRedirect("/index.jsp");
  10. }
  11. @RequestMapping("/result/t3")
  12. public void test3(HttpServletRequest req, HttpServletResponse rsp) throws Exception
  13. { //转发
  14. req.getRequestDispatcher("/WEB-INF/jsp/test.jsp").forward(req,rsp);
  15. }
  16. }

2.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:rsm2/t1"; //请求rsm2/t1 即访问上一个方法
  13. }
  14. }

数据处理

1.处理提交数据

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

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

处理方法 :

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

因为提交数据中,网址中的name和定义的name参数名相同,所以后台输出 : zc

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

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

处理方法 :

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

因为提交的域名称和处理方法的参数名不一致,可以使用@RequestParam,所以后台依然输出 : zc

  • 提交的是一个对象

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

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/user?id=1&name=zc&age=20

3、处理方法 :

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

idnameage和对象User中定义属性名相同,所以后台输出 : User { id=1, name='zc', age=20 }

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

例如:提交数据 : http://localhost:8080/user?id=1&username=zc&age=20

则:后台输出 : User { id=1, name=null, age=20 }

2.数据显示到前端

前端调用方式:${xxx}

第一种 : 通过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

  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. }

3.对比

使用区别就是:

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

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

乱码问题

测试步骤:

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. <init-param>
  9. <param-name>forceEncoding</param-name>
  10. <param-value>true</param-value>
  11. </init-param>
  12. </filter>
  13. <filter-mapping>
  14. <filter-name>encoding</filter-name>
  15. <url-pattern>/*</url-pattern>
  16. </filter-mapping>

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

处理方法 :

修改tomcat配置文件 :

​ 文件位置:tomcat文件夹---conf---server.xml

​ 加入:URIEncoding="utf-8"

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

一般情况下,SpringMVC默认的乱码处理就已经能够很好的解决了!

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

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

个人博客为:

MoYu's Github Blog

MoYu's Gitee Blog

SpringMVC-04 数据处理及跳转的更多相关文章

  1. SpringMVC学习04(数据处理及跳转)

    4.数据处理及跳转 4.1结果跳转方式 4.1.1 ModelAndView 设置ModelAndView对象 , 根据view的名称 , 和视图解析器跳到指定的页面 . 页面 : {视图解析器前缀} ...

  2. SpringMVC 04: SpringMVC中4种页面跳转方式

    转发和重定向的页面跳转方式 页面跳转方式,本质上只有2种方式:转发 + 重定向 但在SpringMVC的具体实现上,转发可以细分为:普通的页面转发 + 经由action方法的页面转发 重定向可以细分为 ...

  3. SpringMVC中遇到页面跳转出现404错误的问题

    今天遇到了一个问题: 使用SpringMVC时,出现页面无法跳转的情况(404错误), 出现这个异常的原因在于SpringMVC的配置文件中控制器的配置书写错误: 原代码: <context:c ...

  4. Swift游戏实战-跑酷熊猫 04 熊猫的跳和滚的动作

    这节内容,我们利用上一节学过的内容,给熊猫添加跳和滚动的动作.同时通过重载touchBegan方法来响应动作.切换跑,跳,滚. 要点: 通过序列帧纹理产生动画: SKAction.animatWith ...

  5. 模拟springmvc 内部登陆,跳过spring filter

    说明,因为我们的一个项目B使用spring mvc配置的登陆框架,所以对登陆控制全部交给了spring,导致我们如果想通过另一个项目A登陆到项目B就不太容易,具体是项目A登陆了,我们通过一个连接直接跳 ...

  6. springMvc <form action="">提交跳转路径问题

    表单提交后,action的URL写的是, login/login.do,每次跳转后都变成login/ login/login.do,很显然是相对路径没有搞清楚. 应该弄清楚相对路径,并在JSP代码中加 ...

  7. springMVC 几种页面跳转方式

    今天主要写一下响应界面跳转的几种方式 1.在注解的方式中 1.1通过HttpServletResponse的API直接输出(不需要配置渲染器) controller类的主要代码 @Controller ...

  8. SpringMVC中controller的跳转

    controller中的重定向 (1)不需要传递参数重定向 方式一:使用ModelAndView        return new ModelAndView("redirect:/toLi ...

  9. SpringMVC从一个controller跳转到另一个controller

    return "redirect:……路径……"; @RequestMapping(value = "/index", method = RequestMeth ...

随机推荐

  1. Detect the Virus ZOJ - 3430 AC自动机

    One day, Nobita found that his computer is extremely slow. After several hours' work, he finally fou ...

  2. 字典树 && 例题 Xor Sum HDU - 4825 (板子)

    一.字典树描述:Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优 ...

  3. PowerShell多任务

    代码 foreach ($server in $servers) { $running = @(Get-Job | Where-Object { $_.State -eq 'Running' }) i ...

  4. Spring Boot @Enable*注解源码解析及自定义@Enable*

      Spring Boot 一个重要的特点就是自动配置,约定大于配置,几乎所有组件使用其本身约定好的默认配置就可以使用,大大减轻配置的麻烦.其实现自动配置一个方式就是使用@Enable*注解,见其名知 ...

  5. docker的网络-单主机(三种原生网络)none、host、bridge

    docker的网络分为:单主机.跨主机 这篇先说:单主机 我们先说一下docker的原生网络模式 网络模式 简介 优点 使用场景 none 空网络,没有网络 此网络与外界隔离,安全度非常高 适合公司内 ...

  6. javascript和XML

    一,浏览器对XML DOM的支持1,DOM2级核心 var xmldom = document.implementation.createDocument("","roo ...

  7. Linux 驱动框架---linux 设备

    Linux 设备 Linux驱动中的三大主要基础成员主要是设备,总线和驱动.今天先来从设备开始分析先把设备相关的数据结构放到这里方便后面看到来查,其中有些进行了简单的注释. struct device ...

  8. Android 神奇的SpannableStringBuilder

    一 无图言屌 先看看神奇的效果 仅用一个TextView实现 二 SpannableStringBuilder Google官方介绍 This is the class for text whose ...

  9. Vue & Sentry

    Vue & Sentry config.errorHandler https://cn.vuejs.org/v2/api/#errorHandler Vue.config.errorHandl ...

  10. javascript module system all in one

    javascript module system all in one AMD & CMD https://github.com/amdjs/amdjs-api/wiki/AMD http:/ ...