Spring MVC学习随笔-控制器(Controller)开发详解:控制器跳转与作用域(一 ...

打印 上一主题 下一主题

主题 917|帖子 917|积分 2751

学习视频:孙哥说SpringMVC:结合Thymeleaf,重塑你的MVC世界!|前所未有的Web开发探索之旅
第五章、SpringMVC控制器开发详解 三

5.1 核心要点

3.流程跳转
5.2 JavaWeb中流程跳转的核心回顾

5.2.1 JavaWeb中流程跳转的核心代码


5.2.2 JavaWeb页面跳转方式回顾



5.2.3测试


在web.xml里添加Servlet然后执行

可以看到通过url拼接可以获取传递的数据
5.3 Spring MVC的四种跳转形式


  • 四种跳转指的是:在SpringMVC中控制器与JSP或者控制器与控制器之间的跳转。

    • Controller - - forward —> JSP
    • Controller - - redirect—> JSP
    • Controller - - forward —> Controller
    • Controller - - redirect—> Controller

  • SpringMVC的四种跳转,底层上就是对Servlet跳转的封装。
  • 默认情况下SpringMVC中控制器通过视图解析器跳转到JSP页面,通过的是forward形式。
5.3.1 控制器forward页面


  • 编码
    1. // 方式1 结合ViewResolver进行拼接成完整页面,并进行forward跳转
    2. @RequestMapping("view1")
    3. public String view1() {
    4.     System.out.println("ViewController.view1");
    5.     **return "result";**
    6. }
    7. // 方式2 使用forward关键字,视图解析器的拼接会失效,必须写完整路径
    8. @RequestMapping("view1")
    9. public String view1() {
    10.     System.out.println("ViewController.view1");
    11.     **return "forward:/result1.jsp";**
    12. }
    复制代码
5.3.2 控制器redirect页面


  • 编码
    1. // 使用了redirect关键字,视图解析器的拼接会失效,也要写完整路径
    2. @RequestMapping("view3")
    3. public String view3() {
    4.     System.out.println("ViewController.view1");
    5.     **return "redirect:/result.jsp";**
    6. }
    复制代码
5.3.3 forward控制器相互跳转


  • 是否存在控制器间相互跳转的需求
    是的,例如下图逻辑,登录后进入展示信息的页面,登录逻辑和展示信息逻辑属于两个不同的Controller,所以控制器间需要相互跳转

  • 编码
    1. @Controller
    2. @RequestMapping("forwardController")
    3. public class ForwardController {
    4.     @RequestMapping("forward1")
    5.     public String forward1() {
    6.         System.out.println("ForwardController.forward1");
    7.         return "forward:/forwardController/forward2";
    8.     }
    9.     @RequestMapping("/forward2")
    10.     public String forward2() {
    11.         System.out.println("ForwardController.forward2");
    12.         return "result";
    13.     }
    14. }
    15. // 执行后控制台输出结果与预期一致
    复制代码
5.3.4 redirect控制器相互跳转


  • 编码
    1. @Controller
    2. @RequestMapping("redirectController")
    3. public class RedirectController {
    4.     @RequestMapping("redirect1")
    5.     public String redirect1() {
    6.         System.out.println("RedirectController.redirect1");
    7.         return "redirect:/redirectController/redirect2";
    8.     }
    9.     @RequestMapping("/redirect2")
    10.     public String redirect2() {
    11.         System.out.println("RedirectController.redirect2");
    12.         return "result";
    13.     }
    14. }
    15. // 执行后控制台输出结果与预期一致
    复制代码
5.4 Web作用域处理

5.4.1 JavaWeb中作用域回顾


  • 三种作用域及其使用场景回顾


5.4.2 SpringMVC中作用域处理


  • 基本使用方式及其存在的问题
    1. @RequestMapping("view1")
    2. public String view1(HttpServletRequest request) {
    3.     System.out.println("View2Controller.view2");
    4.     request.setAttribute("name","xiaojr");
    5.     return "result1";
    6. }
    7. // 在result1.jsp中通过${name}获取
    8. //存在问题:与ServletAPI耦合,同时与视图模板技术(jsp、ftl)耦合,在SpringMVC中不建议使用
    复制代码

  • SpingMVC中request作用域的处理

    • 代码
      1. # 基于Model的方式
      2. @RequestMapping("view2")
      3. public String view2(Model model) {
      4.                 // 等同于 request.addAttribute();
      5.     model.addAttribute("name", "suns");
      6.     return "result1";
      7. }
      8. # 基于ModelMap的方式 同上
      9. @RequestMapping("view3")
      10. public String view3(ModelMap modelMap) {
      11.     modelMap.addAttribute("name", "suns2");
      12.     return "result1";
      13. }
      复制代码
    • Model、ModelMap相关细节分析

      • 通过Model、ModelMap进行作用域处理,可以解决视图模板技术耦合的问题
        因为SpringMVC通过视图解析器区别JSP、FreeMaker,再将Model、ModelMap的数据放到request或root里面运行。

      • SpringMVC中提供Model和ModelMap两种方式处理request作用域,他们的区别是什么
        虽然两者表现形式以及声明的形参类型都不同,但是在运行时,SpringMVC会动态提供对应的实现类型,名字是BindingAwareModelMap。所以本质上两者相同。



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

北冰洋以北

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表