Spring MVC学习随笔-控制器(Controller)开发详解:控制器跳转与作用域(二)视图模板、静态资源访问

这篇具有很好参考价值的文章主要介绍了Spring MVC学习随笔-控制器(Controller)开发详解:控制器跳转与作用域(二)视图模板、静态资源访问。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

学习视频:孙哥说SpringMVC:结合Thymeleaf,重塑你的MVC世界!|前所未有的Web开发探索之旅

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

  • SpingMVC中request作用域的处理

    • 代码

      # 基于Model的方式 
      @RequestMapping("view2")
      public String view2(Model model) {
      		// 等同于 request.addAttribute();
          model.addAttribute("name", "suns");
          return "result1";
      }
      # 基于ModelMap的方式 同上
      @RequestMapping("view3")
      public String view3(ModelMap modelMap) {
          modelMap.addAttribute("name", "suns2");
          return "result1";
      }
      
    • Model、ModelMap相关细节分析

      1. 通过Model、ModelMap进行作用域处理,可以解决视图模板技术耦合的问题

        因为SpringMVC通过视图解析器区别JSP、FreeMaker,再将Model、ModelMap的数据放到request或root里面运行。

        Spring MVC学习随笔-控制器(Controller)开发详解:控制器跳转与作用域(二)视图模板、静态资源访问

      2. SpringMVC中提供Model和ModelMap两种方式处理request作用域,他们的区别是什么

        虽然两者表现形式以及声明的形参类型都不同,但是在运行时,SpringMVC会动态提供对应的实现类型,名字是BindingAwareModelMap。所以本质上两者相同。

      3. 为什么不直接使用BindingAwareModelMap?

        在源码中,Model接口会根据开发者使用SpringMVC或Spring WebFlux进行自动适配,使用MVC开发时会使用BindingAwareModelMap,而WebFlux开发时使用的是ConcurrentModel。

        Spring MVC学习随笔-控制器(Controller)开发详解:控制器跳转与作用域(二)视图模板、静态资源访问

        Spring MVC学习随笔-控制器(Controller)开发详解:控制器跳转与作用域(二)视图模板、静态资源访问

      4. SpringMVC为什么会提供两种开发方式?Model、ModelMap这两种开发方式,更推荐哪种使用?

        推荐使用Model,ModelMap是老系统使用的,为了兼容老系统所以留着。Model可以兼容传统MVC也可以在WebFlux中使用,更有利于项目维护。

      5. 如果redirect跳转,数据如何跳转

        SpringMVC会自动把Model或ModelMap中的数据,通过?的形式在url上进行拼接,从而传递数据

  • SpringMVC中Session作用域的处理

    • 基本使用方式及其存在的问题

      session.setAttribute("name","value");
      
      @RequestMapping("view")
      public String view1(HttpSession session){
      		session.setAttribute("name","value");
      		return "result";
      }
      存在问题:与ServletAPI耦合,在SpringMVC中不建议使用。
      
    • @SessionAttributes注解

      • 存储数据

        @Controller
        @RequestMapping("view3")
        **@SessionAttributes(value = "name")  // 声明name存在session作用域**
        public class View3Controller {
        
            @RequestMapping("view1")
            public String view1(Model model) {
                model.addAttribute("name", "xiaojr");
        				model.addAttribute("age", 10);
                return "result1";
            }
        }
        // jsp中取值
        <html>
        <body>
            <h1>session attribute is ${sessionScope.name}</h1>
            <h1>request attribute is ${requestScope.age}</h1>
        </body>
        </html>
        
      • 注意

        1. Model、ModelMap把name的数据通过@SessionAttributes存储在Session作用域中的同时在Request作用域中也会存储。
        2. 此时Request作用域、Session作用域存储的是一个对象的引用。
    • 删除Session作用域中的数据

      Spring MVC学习随笔-控制器(Controller)开发详解:控制器跳转与作用域(二)视图模板、静态资源访问

  • SpringMVC中application作用域的处理

    Spring MVC学习随笔-控制器(Controller)开发详解:控制器跳转与作用域(二)视图模板、静态资源访问

  • 为什么SpringMVC没有提供application作用域

    因为application这个作用域是全局唯一,在开发中多用于存储全局唯一的对象,被框架底层封装,在开发时,程序员基本不会使用其用于业务操作。

  • @ModelAttribute注解

    1. SpringMVC通过@ModelAttribute注解:接受请求参数的同时,把数据存储到request作用域中。

      @RequestMapping("view1")
      public String view1(@ModelAttribute("name") String name) {
          System.out.println("View4Controller.view1");
          return "result2";
      }
      
    • 使用场景

      Spring MVC学习随笔-控制器(Controller)开发详解:控制器跳转与作用域(二)视图模板、静态资源访问
      传递页码时可以使用。

    • 注意细节

      • 细节一

        如果传递的是简单变量参数:则value属性必须与超级链接或表单的key名称保持一致。

        如果传递的是POJO类型的请求参数:则没有上述要求,但是value属性会作为request作用域的名称。

      • 细节二

        1. @ModelAttribute中value的值不能与@SessionAttributes中value的值一致,如果一致则会产生异常
        2. 如果要把请求参数的数据也存在session作用域中,需要将request作用域存储改为使用传统做法:model.addAttribute(”name”,name);
  • 什么是ModelAndView【了解】

    • 什么是ModelAndView

      ModelAndView这个类型,实际上是一个复合类型,起到了2个方面的作用。

      注意:ModelAndView里面只能使用ModelMap,这也是它的劣势之一。

      1. Model 代表作用域的操作,就是前面的ModelMap。
      2. View 代表跳转路径(页面),对应前面的四种跳转。

      最终这两方面的工作统一被ModelAndView进行封装,做为控制器方法的返回值使用。

      Spring MVC学习随笔-控制器(Controller)开发详解:控制器跳转与作用域(二)视图模板、静态资源访问

    • 总结目前控制器方法返回值

      1. public String controller();
      2. public ModelAndView controller();
      注意:SpringMVC处理跳转页面和作用域时,把相应的内容都会封装到ModelAndView中,
      所以ModelAndView返回值的这种处理更加底层,而返回值String的处理仅是简化开发。
      

5.5 视图控制器

5.5.1 什么是视图控制器

  1. 视图控制器可以通过配置的方式,访问受保护的视图模板,简化开发。

  2. 什么是视图模板?

    JSP Thymeleaf FreeMarker Velocity

  3. 为什么需要保护视图模板?

    目前的开发方式都没有对视图模板进行保护,有可能导致程序在被用户访问时产生非预期效果(Bug)

  4. 如何保护视图模板

    将所有视图模板放置在WEB-INF下,这样用户就无法通过地址直接访问视图模板了。

    Spring MVC学习随笔-控制器(Controller)开发详解:控制器跳转与作用域(二)视图模板、静态资源访问

5.5.1 受保护的视图模板如何访问?

  1. 所有的视图模板,只能通过控制器forward访问:return "result"; return "forward:/WEB-INF/jsp/result.jsp";

    记得同时修改viewResolver

    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" **value="/WEB-INF/jsp/"/>**
        <property name="suffix" value=".jsp"/>
    </bean>
    

5.5.2 视图控制器

虽然可以通过控制器forward访问视图模板,但是直接访问页面也需要控制器,因此会变得繁琐,所以有了视图控制器的存在:通过在配置文件(dispatcher.xml)可以直接访问

<mvc:view-controller path="/result3" view-name="result3"/>
注意:path不能和@RequestMapping的路径冲突

Spring MVC学习随笔-控制器(Controller)开发详解:控制器跳转与作用域(二)视图模板、静态资源访问

5.5.3 视图控制器的Redirect跳转

@RequestMapping("view1")
public String view1() {
    System.out.println("View6Controller.view1");
    return "redirect:/result4";
}

<mvc:view-controller path="/result4" view-name="result4"/>

5.6 静态资源处理

5.5.1 什么是静态资源

  1. 所谓静态资源,指的是项目中非java代码部分的内容,如 图片、js文件、css文件。

Spring MVC学习随笔-控制器(Controller)开发详解:控制器跳转与作用域(二)视图模板、静态资源访问

  1. 目前SpringMVC的开发中,按照现有的配置内容,是无法访问静态资源的。

Spring MVC学习随笔-控制器(Controller)开发详解:控制器跳转与作用域(二)视图模板、静态资源访问
g)

在SpringMVC底层,资源请求访问DispatcherServlet后,会将其请求当成控制器并调用对应的控制器方法创建对象,但是在静态资源访问,第一步就走不通了,所以就报错404。

5.5.3 解决方式

  • 方式一【DefaultServlet】

    Tomcat提供了能够访问静态资源的DefaultServlet(web.xml)

    Spring MVC学习随笔-控制器(Controller)开发详解:控制器跳转与作用域(二)视图模板、静态资源访问

    在web.xml添加DefaultServlet后的代码:

    Spring MVC学习随笔-控制器(Controller)开发详解:控制器跳转与作用域(二)视图模板、静态资源访问

  • 方式二【default-servlet-handler】推荐

    • 第一种开发方式的问题

      Spring MVC学习随笔-控制器(Controller)开发详解:控制器跳转与作用域(二)视图模板、静态资源访问

  • default-servlet-handler开发方式

    1. 在SpringMVC的配置文件(dispatcher.xml)中,配置<mvc:default-servlet-handler/>即可
  • 实现原理

    1. <mvc:default-servlet-handler/>标签的底层也是调用了defaultServlet进行的静态资源处理。

    2. <mvc:default-servlet-handler/>标签他是如何调用defaultServlet进行静态资源处理的?

      他的底层是通过DefaultServletHttpRequestHandler,以forward的形式调用的DefaultServlet。

      Spring MVC学习随笔-控制器(Controller)开发详解:控制器跳转与作用域(二)视图模板、静态资源访问

    mvc:default-servlet-handler/完整运行流程:用户如果发起控制器的请求,首先会到DispatcherServlet,然后DispatcherServlet会通过RequestMappingHandlerMapiping查找控制器上@RequestMapping注解并进行相应的匹配,进而查找,如果查找到则会通过HandlerAdapter进行处理。对于静态资源的操作,也就是使用了<mvc:default-servlet-handler/>的处理,它的请求也一样会访问DispatcherServlet,没查找到则会通过SimpleUrlHandlerMapping调用DefaultServletHttpRequestHandler进而调用DefaultServlet进行静态资源的处理。

下一章:Spring MVC学习随笔-文件下载和上传(配置文件上传解析器multipartResolver)文章来源地址https://www.toymoban.com/news/detail-747853.html

到了这里,关于Spring MVC学习随笔-控制器(Controller)开发详解:控制器跳转与作用域(二)视图模板、静态资源访问的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 什么是域控制器Domain Controller?

    一个域描述了一组用户、系统、应用程序、网络、数据库服务器和其他任何资源,这些资源都受到一组共同的管理规则的控制。通常,一个域还包括一个物理空间,比如一个办公室或多个办公室。如果你在域内,你就处于一个理论上安全和可信的空间。如果在外面,你就是不

    2024年02月07日
    浏览(68)
  • 5、Kubernetes核心技术 - Controller控制器工作负载

    目录 一、Deployments - 控制器应用 二、Deployment升级回滚和弹性收缩 2.1、创建一个 1.14 版本的 pod 2.2、应用升级 2.3、查看升级状态 2.4、查看历史版本 2.5、应用回滚 2.6、弹性伸缩  三、StatefulSet - 有状态应用 四、DaemonSet - 守护进程 五、Job - 单次任务 六、Cronjob - 定时任务 Deplo

    2024年02月15日
    浏览(38)
  • beego的控制器Controller篇 — 数据处理

    1.1 获取参数 通过如下方式获取数据: GetString(key string) string GetStrings(key string) []string GetInt(key string) (int64, error) GetBool(key string) (bool, error) GetFloat(key string) (float64, error) 例如: 如果需要的数据是其他类型的,例如是 int 类型而不是 int64,那么你需要这样处理: 1.2 获取表单中的

    2024年01月17日
    浏览(54)
  • 【P31】JMeter 循环控制器(Loop Controller)

    可以对部分逻辑按常量进行循环迭代 选择线程组右键 添加 逻辑控制器 循环控制器(Loop Controller) Loop Count:设置运行次数,Infinite 勾选为永久运行 2.1、设置循环次数 (1)、测试计划右键 添加 线程(用户) 线程组 参数默认即可 (2)、线程组右键 添加 取样器 调试取样器

    2024年02月07日
    浏览(50)
  • 【P30】JMeter 事务控制器(Transaction Controller)

    可以生成一个额外的样本,这样能够将它的所有子元素作为一个计量单元进行监听;事务控制器本身不包含任何业务逻辑,只是组合出一个新的计量单元 选择线程组右键 添加 逻辑控制器 事务控制器(Transaction Controller) Generate parent sample:选中,事务控制器将作为其他取样器

    2024年02月06日
    浏览(87)
  • 第三十章 Unity角色控制器 Character Controller

    在我们之前的章节中,我们已经了解了碰撞体和刚体。但是,对于刚体这个组件来讲,有两种使用方式。其一就是用它来模拟现实世界的移动或碰撞效果(例如,门的开关);其二就是使用代码来控制物体移动或碰撞(例如,角色的行走)。两种方式使用场景不同而已。 本章

    2024年02月08日
    浏览(57)
  • 【P38】JMeter 随机控制器(Random Controller)

    可以让控制器内部的逻辑随机执行一个,一般用来模拟业务的不确定性;随机控制器在线程迭代或者控制器循环的时候均会触发 选择线程组右键 添加 逻辑控制器 随机控制器(Random Controller) 忽略子控制器块(Ignore sub-controller blocks):子控制器功能失效,由交替控制器代替

    2024年02月07日
    浏览(42)
  • 【P34】JMeter ForEach控制器(ForEach Controller)

    可以对一个组变量进行循环迭代;该组件通常与后置处理器中的 JSON 提取器、正则提取器、边界提取器等进行联合使用 选择线程组右键 添加 逻辑控制器 ForEach控制器(ForEach Controller) 输入变量前缀(Input variable prefix):默认为一个空字符串作为前缀 开始循环字段(不包含)

    2024年02月06日
    浏览(46)
  • Kubernetes技术--k8s核心技术Controller控制器

    1.Controller概述    Controller是在集群上管理和运行容器的对象。是一个实际存在的对象。 2.pod和Controller之间的关系 pod通过controller实现应用的运维,包括伸缩、滚动升级等操作。 这里pod和controller通过label标签来建立关系。如下所示: 3.Deployment控制器应用场景 -1:部署无状态的应

    2024年02月10日
    浏览(44)
  • 【P33】JMeter 临界部分控制器(Critical Section Controller)

    可以对指定代码块增加同步锁,确保此代码块由单线程执行;通过 Java synchronized 实现 选择线程组右键 添加 逻辑控制器 临界部分控制器(Critical Section Controller) 锁名称(Lock name):锁名为空,认为每个锁为不同的锁;锁名相同,多个锁认为是同一个锁,同一个时间点

    2024年02月07日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包