当前位置: 首页 > news >正文

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里面运行。

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

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

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

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

      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作用域中的数据

  • SpringMVC中application作用域的处理

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

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

  • @ModelAttribute注解

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

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


      传递页码时可以使用。

    • 注意细节

      • 细节一

        如果传递的是简单变量参数:则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进行封装,做为控制器方法的返回值使用。

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

      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下,这样用户就无法通过地址直接访问视图模板了。

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的路径冲突

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文件。

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


g)

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

5.5.3 解决方式

  • 方式一【DefaultServlet】

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

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

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

    • 第一种开发方式的问题

  • 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。

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

下一章:Spring MVC学习随笔-文件下载和上传(配置文件上传解析器multipartResolver)

相关文章:

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

学习视频&#xff1a;孙哥说SpringMVC&#xff1a;结合Thymeleaf&#xff0c;重塑你的MVC世界&#xff01;&#xff5c;前所未有的Web开发探索之旅 衔接上文Spring MVC学习随笔-控制器(Controller)开发详解&#xff1a;控制器跳转与作用域&#xff08;一&#xff09; SpingMVC中…...

原型模式(Prototype Pattern)

1 基本概念 1.1 大佬文章 设计模式是什么鬼&#xff08;原型&#xff09; 详解设计模式&#xff1a;原型模式-腾讯云开发者社区-腾讯云 1.2 知识汇总 &#xff08;1&#xff09;原型模式&#xff1a;先 new 一个实例&#xff0c;该实例符合需求&#xff0c;之后再根据这个实…...

IM通信技术快速入门:短轮询、长轮询、SSE、WebSocket

文章目录 1. 引言2. 短轮询&#xff08;Short Polling&#xff09;2.1 原理2.2 代码示例2.2.1 服务器端&#xff08;Node.js&#xff09;2.2.2 客户端&#xff08;HTML JavaScript&#xff09; 3. 长轮询&#xff08;Long Polling&#xff09;3.1 原理3.2 代码示例3.2.1 服务器…...

04_W5500_TCP_Server

上一节我们完成了TCP_Client实验&#xff0c;这节使用W5500作为服务端与TCP客户端进行通信。 目录 1.W5500服务端要做的&#xff1a; 2.代码分析&#xff1a; 3.测试&#xff1a; 1.W5500服务端要做的&#xff1a; 服务端只需要打开socket&#xff0c;然后监听端口即可。 2…...

入门Redis学习总结

记录之前刚学习Redis 的笔记&#xff0c; 主要包括Redis的基本数据结构、Redis 发布订阅机制、Redis 事务、Redis 服务器相关及采用Spring Boot 集成Redis 实现增删改查基本功能 一&#xff1a;常用命令及数据结构 1.Redis 键(key) # 设置key和value 127.0.0.1:6379> set …...

SpringSecurity6 | 自定义登录页面

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; Java从入门到精通 ✨特色专栏&#xf…...

从单向链表中删除指定值的节点

输入一个单向链表和一个节点的值&#xff0c;从单向链表中删除等于该值的节点&#xff0c;删除后如果链表中无节点则返回空指针。 链表的值不能重复。构造过程&#xff0c;例如输入一行数据为:6 2 1 2 3 2 5 1 4 5 7 2 2则第一个参数6表示输入总共6个节点&#xff0c;第二个参数…...

Vue2与Vue3的语法对比

Vue2与Vue3的语法对比 Vue.js是一款流行的JavaScript框架&#xff0c;通过它可以更加轻松地构建Web用户界面。随着Vue.js的不断发展&#xff0c;Vue2的语法已经在很多应用中得到了广泛应用。而Vue3于2020年正式发布&#xff0c;带来了许多新的特性和改进&#xff0c;同时也带来…...

实时动作识别学习笔记

目录 yowo v2 yowof 判断是在干什么,不能获取细节信息 yowo v2 https://github.com/yjh0410/YOWOv2/blob/master/README_CN.md ModelClipmAPFPSweightYOWOv2-Nano1612.640ckptYOWOv2-Tiny...

5G常用简称

名称缩写全称非周期 信道状态信息参考信号aperidoc CSIAperidoc Channel State Information缓冲区状态报告BSRBuffer Status Report小区特定无线网络标识CS-RNTICell-Specific Radio Network Temporary Identifier主小区组MCGMaster Cell groupMCG的节点MNMasternode主小区PCel…...

自动化测试框架性能测试报告模板

一、项目概述 1.1 编写目的 本次测试报告&#xff0c;为自动化测试框架性能测试总结报告。目的在于总结我们课程所压测的目标系统的性能点、优化历史和可优化方向。 1.2 项目背景 我们公开课的性能测试目标系统。主要是用于我们课程自动化测试框架功能的实现&#xff0c;以及…...

【SpringBoot】解析Springboot事件机制,事件发布和监听

解析Springboot事件机制&#xff0c;事件发布和监听 一、Spring的事件是什么二、使用步骤2.1 依赖处理2.2 定义事件实体类2.3 定义事件监听类2.4 事件发布 三、异步调用3.1 启用异步调用3.2 监听器方法上添加 Async 注解 一、Spring的事件是什么 Spring的事件监听&#xff08;…...

华为ensp实验——基于全局地址池的DHCP组网实验

目录 前言实验目的实验内容实验结果 前言 该实验基于华为ensp&#xff0c;版本号是1.3.00.100 V100R003C00SPC100&#xff0c;只供学习和参考&#xff0c;不作任何商业用途。 具体的DHCP命令可以看系列文章链接&#xff0c;计算机网络实验&#xff08;华为eNSP模拟器&#xff…...

如何选择一款安全可靠的跨网安全数据交换系统?

随着网络和数据安全的重视程度增加&#xff0c;为了有效地保护内部的核心数据资产&#xff0c;普遍会采用内外网隔离的策略。像国内的政府机构、金融、能源电力、航空航天、医院等关乎国计民生的行业和领域均已进行了网络的隔离&#xff0c;将内部划分成不同的网段&#xff0c;…...

基于c++版本的数据结构改-python栈和队列思维总结

##栈部分-&#xff08;叠猫猫&#xff09; ##抽象数据类型栈的定义&#xff1a;是一种遵循先入后出的逻辑的线性数据结构。 换种方式去理解这种数据结构如果我们在一摞盘子中取到下面的盘子&#xff0c;我们首先要把最上面的盘子依次拿走&#xff0c;才可以继续拿下面的盘子&…...

算法通关村第七关—迭代实现二叉树的遍历(黄金)

迭代实现二叉树的遍历 迭代法实现前序遍历 前序遍历是中左右&#xff0c;如果还有左子树就一直向下找。完了之后再返回从最底层逐步向上向右找。不难写出如下代码&#xff1a;&#xff08;注意代码中&#xff0c;空节点不入栈&#xff09; public List<Integer>preorde…...

Java期末复习题之封装

点击返回标题->23年Java期末复习-CSDN博客 第1题. 定义一个类Person,定义name和age私有属性&#xff0c;定义有参的构造方法对name和age进行初始化。在测试类中创建该类的2个对象&#xff0c;姓名、年龄分别为lili、19和lucy、20&#xff0c;在屏幕打印出2个对象的姓名和年龄…...

湖科大计网:计算机网络概述

一、计算机网络的性能指标 一、速率 有时候数据量也认为是以10为底的&#xff0c;看怎么好算。&#xff08;具体吉大考试用什么待商榷&#xff09; 二、带宽 在模拟信号系统中带宽的含义&#xff0c;本课程中用到的地方是&#xff1a;香农定理和奈奎斯特定理公式的应用之中。 …...

每日一道c语言

任务描述 题目描述:输入10个互不相同的整数并保存在数组中&#xff0c;找到该最大元素并删除它&#xff0c;输出删除后的数组 相关知识&#xff08;略&#xff09; 编程要求 请仔细阅读右侧代码&#xff0c;结合相关知识&#xff0c;在Begin-End区域内进行代码补充&#xf…...

(C)一些题11

1. #include<stdio.h> #include<string.h> void main() { char *s1"ABCDEF"&#xff0c;*s2"aB"&#xff1b; s1; s2; puts(s1)&#xff1b; puts(s2)&#xff1b; printf("%d\n",strcmp(s1,s2))&#xff1b; } 答案&#xff1…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

AI语音助手的Python实现

引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...

vue3 daterange正则踩坑

<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...

图解JavaScript原型:原型链及其分析 | JavaScript图解

​​ 忽略该图的细节&#xff08;如内存地址值没有用二进制&#xff09; 以下是对该图进一步的理解和总结 1. JS 对象概念的辨析 对象是什么&#xff1a;保存在堆中一块区域&#xff0c;同时在栈中有一块区域保存其在堆中的地址&#xff08;也就是我们通常说的该变量指向谁&…...