【Java 高阶】一文精通 Spring MVC - 视图解析(三)

news2024/7/6 21:18:01

在这里插入图片描述

👉博主介绍: 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO 专家博主

⛪️ 个人社区:个人社区
💞 个人主页:个人主页
🙉 专栏地址: ✅ Java 高阶
🙉八股文专题:剑指大厂,手撕 Java 八股文

文章目录

      • 1. 视图解析器 ViewResolver
      • 2. 视图控制器 <view-controller>
      • 3. Model、Map、ModelMap
      • 4. ModelAndView
      • 5. Spring MVC 操作 Session
        • 5.1. @SessionAttribute
        • 5.2. @SessionAttributes
        • 5.3. @HttpSession
      • 6. ModelAttribute

1. 视图解析器 ViewResolver

视图解析器(ViewResolver)是 Spring MVC 中用于解析逻辑视图名并将其映射到实际视图对象的组件。它负责将处理器方法返回的逻辑视图名解析为具体的视图对象,以便渲染响应内容并返回给客户端。

视图解析器的作用是将逻辑视图名转换为实际的视图对象,使得开发人员可以使用简洁的逻辑视图名来表示视图,而无需关心具体的视图实现细节。

Spring MVC 提供了多种视图解析器的实现,常见的视图解析器包括:

  1. InternalResourceViewResolver:用于解析 JSP 视图。它将逻辑视图名解析为 InternalResourceView 对象,该对象将会通过 RequestDispatcher 进行转发到对应的 JSP 文件进行渲染。
  2. UrlBasedViewResolver:用于根据逻辑视图名解析为 URL 形式的视图。它可以将逻辑视图名直接映射为 URL,或者通过添加前缀和后缀来构建 URL。
  3. FreeMarkerViewResolver:用于解析 FreeMarker 模板引擎的视图。它将逻辑视图名解析为 FreeMarkerView 对象,该对象将会使用 FreeMarker 引擎来渲染模板并生成响应内容。
  4. ThymeleafViewResolver:用于解析 Thymeleaf 模板引擎的视图。它将逻辑视图名解析为 ThymeleafView 对象,该对象将会使用 Thymeleaf 引擎来渲染模板并生成响应内容。
    视图解析器的配置通常需要在 Spring MVC 的配置文件中进行。例如,使用 InternalResourceViewResolver 配置 JSP 视图解析器的示例:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/views/" />
    <property name="suffix" value=".jsp" />
</bean>

在上述示例中,配置了一个 InternalResourceViewResolver 对象,将逻辑视图名解析为 JSP 视图。通过设置 prefix 属性为 “/WEB-INF/views/” 和 suffix 属性为 “.jsp”,可以将逻辑视图名 “hello” 解析为 “/WEB-INF/views/hello.jsp”。

通过视图解析器,开发人员可以使用简洁的逻辑视图名来表示视图,而无需关心具体的视图实现细节。这样可以提高开发效率和可维护性,并使视图的切换和更改更加灵活方便。

2. 视图控制器

视图控制器(View Controller)是 Spring MVC 中用于处理静态视图的组件。它可以简化配置,将请求直接映射到静态视图,无需编写额外的控制器方法。

视图控制器的作用是将请求的 URL 直接映射到指定的视图,通常用于处理简单的静态页面请求。它可以将请求的 URL 映射到 JSP、HTML、Thymeleaf 模板等静态视图资源。

在 Spring MVC 中,可以通过配置 mvc:view-controller 元素来定义视图控制器。以下是一个示例:

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

在上述示例中,mvc:view-controller 元素定义了一个视图控制器,将请求的 “/hello” 路径映射到名为 “hello” 的视图。当请求 “/hello” 时,将直接返回名为 “hello” 的视图,无需额外的控制器方法处理。
视图控制器的配置通常需要在 Spring MVC 的配置文件中进行。例如,在 Spring MVC 的配置文件中添加以下配置:

<mvc:annotation-driven />
<mvc:view-controller path="/hello" view-name="hello" />

通过以上配置,当访问 “/hello” 路径时,将直接返回名为 “hello” 的视图。

视图控制器适用于处理简单的静态页面请求,可以简化配置并提高性能。但需要注意,视图控制器只适用于静态视图,无法处理复杂的业务逻辑。对于需要处理业务逻辑的请求,仍需使用控制器方法来处理。

3. Model、Map、ModelMap

Model、Map 和 ModelMap 都是 Spring MVC 中用于传递数据给视图的对象。它们在功能上非常相似,用于在控制器方法中存储和传递数据给视图。

  1. Model:Model 是一个接口,用于存储和传递数据给视图。它定义了一些方法来操作数据,如添加属性、获取属性等。在控制器方法中,可以将数据存储在 Model 对象中,然后返回视图名称,视图可以通过访问 Model 对象来获取数据。例如:
@GetMapping("/hello")
public String hello(Model model) {
    model.addAttribute("message", "Hello, World!");
    return "hello";
}

在上述示例中,使用 Model 的 addAttribute() 方法将名为 “message” 的属性添加到 Model 对象中,然后返回视图名称 “hello”。

  1. Map:Map 是一个接口,它继承了 Java 的 java.util.Map 接口。在控制器方法中,可以将数据存储在 Map 对象中,然后返回视图名称,视图可以通过访问 Map 对象来获取数据。例如:
@GetMapping("/hello")
public String hello(Map<String, Object> map) {
    map.put("message", "Hello, World!");
    return "hello";
}

在上述示例中,使用 Map 的 put() 方法将名为 “message” 的属性添加到 Map 对象中,然后返回视图名称 “hello”。

  1. ModelMap:ModelMap 是一个实现了 Model 接口的类,它继承了 LinkedHashMap。它提供了一些额外的方法来操作数据,如添加属性、获取属性等。在控制器方法中,可以将数据存储在 ModelMap 对象中,然后返回视图名称,视图可以通过访问 ModelMap 对象来获取数据。例如:
@GetMapping("/hello")
public String hello(ModelMap modelMap) {
    modelMap.addAttribute("message", "Hello, World!");
    return "hello";
}

在上述示例中,使用 ModelMap 的 addAttribute() 方法将名为 “message” 的属性添加到 ModelMap 对象中,然后返回视图名称 “hello”。

Model、Map 和 ModelMap 都用于在控制器方法中存储和传递数据给视图。它们提供了类似的功能,可以根据个人喜好选择使用。在实际开发中,通常使用 Model 或 ModelMap 来传递数据给视图。

4. ModelAndView

ModelAndView 是 Spring MVC 中用于同时存储数据和指定视图的对象。它可以将数据和视图名称一起传递给视图解析器,从而渲染视图并返回给客户端。

ModelAndView 对象包含以下两个主要部分:

  1. Model:用于存储数据的模型对象,可以通过 addAttribute() 方法添加数据。数据存储在一个 Map 中,键值对表示属性名和属性值。
  2. ViewName:视图名称,指定要渲染的视图的名称。可以是逻辑视图名(如 “hello”)或具体的视图路径(如 “/WEB-INF/views/hello.jsp”)。

以下是使用 ModelAndView 的示例:

@GetMapping("/hello")
public ModelAndView hello() {
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.addObject("message", "Hello, World!");
    modelAndView.setViewName("hello");
    return modelAndView;
}

在上述示例中,创建了一个 ModelAndView 对象,并使用 addObject() 方法将名为 “message” 的属性添加到 Model 中。然后,使用 setViewName() 方法设置视图名称为 “hello”。最后,将 ModelAndView 对象返回给 Spring MVC,它将根据视图解析器的配置,渲染名为 “hello” 的视图,并将 Model 中的数据传递给视图。

ModelAndView 提供了更灵活的方式来同时传递数据和指定视图。它可以在控制器方法中使用,并返回 ModelAndView 对象,以便将数据和视图一起传递给视图解析器进行处理。

5. Spring MVC 操作 Session

5.1. @SessionAttribute

@SessionAttribute 是 Spring MVC 中用于绑定会话属性的注解。它可以用于将特定的会话属性值绑定到方法的参数上,从而在多个请求之间共享数据。

@SessionAttribute 注解有以下常用属性:

  • value 或 name:用于指定会话属性的名称。例如,@SessionAttribute(“user”) 表示将名为 “user” 的会话属性值绑定到方法参数上。
  • types:用于指定会话属性的类型。可以是一个或多个类型,例如,@SessionAttribute(value = “user”, types = User.class) 表示将类型为 User 的会话属性值绑定到方法参数上。
  • required:指定该会话属性是否为必需的,默认为 true。如果设置为 true,但会话中没有该属性,将会抛出异常;如果设置为 false,但会话中没有该属性,方法参数将被设置为 null。

下面是一个使用 @SessionAttribute 的示例:

@GetMapping("/hello")
public String hello(@SessionAttribute("user") User user) {
    // 处理会话属性值
    return "hello";
}

在上述示例中,名为 “user” 的会话属性值将会绑定到方法参数 user 上。

@SessionAttribute 注解可以用于获取特定会话属性的值,并将其传递给控制器方法。它适用于需要在多个请求之间共享数据的场景,例如用户登录信息、购物车内容等。

需要注意的是,@SessionAttribute 注解需要与 @ModelAttribute 注解一起使用。在控制器中,首先使用 @ModelAttribute 注解初始化会话属性,然后使用 @SessionAttribute 注解获取会话属性的值。

@SessionAttribute 注解是 Spring MVC 中用于绑定会话属性的注解,通过指定会话属性的名称、类型和是否必需等属性,可以灵活地处理会话属性值。

5.2. @SessionAttributes

@SessionAttributes 是 Spring MVC 中用于将模型数据存储到会话中的注解。它可以用于在多个请求之间共享模型数据,从而实现会话级别的数据共享。
@SessionAttributes 注解有以下常用属性:

  • value 或 types:用于指定要存储在会话中的模型属性。可以是一个或多个属性名称或类型。例如,@SessionAttributes(“user”) 表示将名为 “user” 的模型属性存储到会话中。
  • types:用于指定要存储在会话中的模型属性的类型。可以是一个或多个类型。例如,@SessionAttributes(types = {User.class, Order.class}) 表示将类型为 User 和 Order 的模型属性存储到会话中。

value 和 types 属性可以同时使用,以指定多个模型属性。

除了 value 和 types 属性外,还可以使用 exclude 和 excludeName 属性来指定不需要存储到会话中的模型属性。

下面是一个使用 @SessionAttributes 的示例:

@Controller
@SessionAttributes("user")
public class UserController {
    
    @GetMapping("/login")
    public String login(Model model) {
        User user = new User();
        model.addAttribute("user", user);
        return "login";
    }
    
    @PostMapping("/save")
    public String save(@ModelAttribute("user") User user) {
        // 保存用户信息
        return "redirect:/dashboard";
    }
}

在上述示例中,@SessionAttributes(“user”) 注解将名为 “user” 的模型属性存储到会话中。在 login 方法中,将创建一个 User 对象,并将其添加到模型中。在 save 方法中,通过 @ModelAttribute 注解将存储在会话中的 “user” 属性绑定到方法参数 user 上。

@SessionAttributes 注解适用于需要在多个请求之间共享模型数据的场景,例如用户登录信息、购物车内容等。需要注意的是,@SessionAttributes 注解只适用于使用基于注解的控制器(如 @Controller 注解)。

@SessionAttributes 注解是 Spring MVC 中用于将模型数据存储到会话中的注解,通过指定要存储的模型属性的名称或类型,可以在多个请求之间共享模型数据。

5.3. @HttpSession

@HttpSession 是 Java Servlet API 中的一个接口,它用于在服务器端存储和管理用户会话数据。Spring MVC 中也可以使用 @HttpSession 注解来直接访问和操作 HttpSession 对象。

@HttpSession 注解没有特定的属性,它可以直接应用在方法参数上。当使用 @HttpSession 注解时,Spring MVC 将会自动将 HttpSession 对象传递给被注解的方法参数。

下面是一个使用 @HttpSession 注解的示例:

@GetMapping("/cart")
public String viewCart(@HttpSession HttpSession session, Model model) {
    Cart cart = (Cart) session.getAttribute("cart");
    model.addAttribute("cart", cart);
    return "cart";
}

@PostMapping("/cart/add")
public String addToCart(@HttpSession HttpSession session, @RequestParam("item") String item) {
    Cart cart = (Cart) session.getAttribute("cart");
    // 添加商品到购物车
    return "redirect:/cart";
}

在上述示例中,通过在方法参数中使用 @HttpSession 注解,可以直接访问 HttpSession 对象。在 viewCart 方法中,获取存储在会话中的购物车对象,并将其添加到模型中进行展示。在 addToCart 方法中,从会话中获取购物车对象,并向购物车中添加商品。

使用 @HttpSession 注解可以方便地访问和操作 HttpSession 对象,从而实现在会话中存储和管理用户数据。需要注意的是,@HttpSession 注解只适用于使用基于注解的控制器(如 @Controller 注解)。

@HttpSession 注解是 Spring MVC 中用于访问和操作 HttpSession 对象的注解,通过将 HttpSession 对象作为方法参数,可以方便地存储和管理用户会话数据。

6. ModelAttribute

@ModelAttribute 是 Spring MVC 中的一个注解,用于将方法返回值或方法参数绑定到模型中。它可以用于在请求处理方法中添加模型属性,也可以用于将表单数据绑定到方法参数上。

  1. 在请求处理方法中添加模型属性
@GetMapping("/hello")
public String hello(Model model) {
    model.addAttribute("message", "Hello, World!");
    return "hello";
}

在上述示例中,使用 @ModelAttribute 注解将 “message” 属性添加到模型中。在视图中,可以通过 ${message} 来获取该属性的值。

  1. 将表单数据绑定到方法参数上
@PostMapping("/save")
public String saveData(@ModelAttribute User user) {
    // 处理表单数据
    return "redirect:/success";
}

使用 @ModelAttribute 注解将表单数据绑定到 User 对象上。Spring MVC 将会自动根据表单字段的名称和 User 对象的属性进行匹配,并将表单数据设置到 User 对象中。

@ModelAttribute 注解还可以用于其他场景,如在控制器方法中返回一个对象,该对象将自动添加到模型中,并在视图中使用。

当使用 @ModelAttribute 注解时,如果未指定名称,则默认使用对象的类名(首字母小写)作为模型属性的名称。可以通过在 @ModelAttribute 注解中指定 value 属性来自定义模型属性的名称。

@ModelAttribute 是 Spring MVC 中用于将方法返回值或方法参数绑定到模型中的注解。它可以用于添加模型属性、将表单数据绑定到对象上,并提供了灵活的配置选项。

精彩专栏推荐订阅:在下方专栏👇🏻
✅ 2023年华为OD机试真题(A卷&B卷)+ 面试指导
✅ 精选100套 Java 项目案例
✅ 面试需要避开的坑(活动)
✅ 你找不到的核心代码
✅ 带你手撕 Spring
✅ Java 初阶

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/911199.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端轻松实现文件预览(pdf、excel、word、图片)

需求&#xff1a;实现一个在线预览pdf、excel、word、图片等文件的功能。 介绍&#xff1a;支持pdf、xlsx、docx、jpg、png、jpeg。 以下使用Vue3代码实现所有功能&#xff0c;建议以下的预览文件标签可以在外层包裹一层弹窗。 图片预览 iframe标签能够将另一个HTML页面嵌入到…

【第16例】IPD开发流程:横向管理工具之袖珍卡

目录 前言 袖珍卡 作者介绍 相关课程 前言 IPD 本身是一个非常庞杂的体系&#xff0c;几乎涵盖了企业的方方面面。 不仅仅是华为&#xff0c;包括一些引入 IPD 的新星科技企业。 他们对 IPD 的引入也是走了先僵化再优化的一个过程。 比如说开始的阶段全盘照抄走流程&…

Android设置顶部状态栏颜色

Android设置顶部状态栏颜色_wx637304bacd051的技术博客_51CTO博客

[C++]笔记-重要知识点合集

一.静态库的创建 在项目属性c/c里面,选用无预编译头,创建头文件与cpp文件,需要注意release模式下还是debug模式,在用库时候要与该模式相匹配,库的函数实现是外界无法看到的,最后在要使用的项目里面导入.h文件和.lib文件 二.使用一个循环给二维数组赋值 行数 : 第几个元素 / …

Android Studio 中flutter配置,VSCODE 中flutter配置

一、Android Studio 环境配置 1)确保已经下载了ANdroid SDK,可以点开Android Studio点开setting在这个地方查看 2)打开环境配置变量 新增环境变量ANDROID_HOME 3)将以下添加到环境变量Path中 4&#xff09;命令行里面输入adb,出现以下信息代表android 环境已经配置好了。 …

皮克全景图

公司门头照 办公场所 生产环境 仓储区域 样品展厅 样品展厅 样品展厅 样品展厅

C#-Tolewer和ToUpper的使用

目录 简介: 好处:​ 过程: 总结&#xff1a; 简介: 字符串是不可变的&#xff0c;所以这些函数都不会直接改变字符串的内容&#xff0c;而是把修改后的字符串的值通过函数返回值的形式返回。 ToLower和ToUpper是字符串处理函数&#xff0c;用于将字符中的英文字母转换为小…

【ES6】—函数的参数

一、参数的默认值 1. ES5 设置默认值 function foo (x, y) {y y || worldconsole.log(x, y) } foo(hello, xiaoxiao) foo(hello, 0) // hello xiaoxiao // hello worldPS&#xff1a; 使用 || 的方式设置默认值不严谨&#xff0c; 0、undefined、‘’ 这些参数都会被判定为f…

k8s service (三)

K8s service (三) LoadBalancer类型的Service LoadBalancer和NodePort其实是同一种方式&#xff0c;目的都是向外暴露一个端口&#xff0c;区别在于LoadBalancer会在集群的外部再来做一个负载均衡设备&#xff0c;而这个设备需要外部环境支持的&#xff0c;外部服务发送到这…

企业使用CRM系统的三大理由

CRM系统是一种管理企业与客户关系的软件&#xff0c;它可以帮助企业提高客户满意度、增加销售收入、优化营销策略。可以说&#xff0c;CRM系统是企业数字化转型&#xff0c;实现可持续发展的重要工具。下面我们来说说&#xff0c;推荐企业使用CRM的原因。 1、了解客户需求 客…

细谈Vue中插槽Slots

细谈Vue中插槽Slots 浅谈Vue中插槽Slots1、默认插槽2、后备内容3、具名插槽4、作用域插槽5、代码实践 浅谈Vue中插槽Slots <slot> 元素是一个插槽出口 (slot outlet)&#xff0c;标示了父元素提供的插槽内容 (slot content) 将在哪里被渲染。Vue 组件的插槽机制是受原生…

冠达管理:迎政策利好,数据要素概念爆发,卓创资讯、三维天地等涨停

数据要素概念22日盘中强势拉升&#xff0c;截至发稿&#xff0c;卓创资讯、三维六合“20cm”涨停&#xff0c;深圳瑞捷涨超15%&#xff0c;世纪恒通涨超13%&#xff0c;新炬网络、生意宝亦涨停&#xff0c;中富通涨超8%。值得注意的是&#xff0c;新炬网络已连续两个买卖日涨停…

冠达管理:央行降息是什么意思?央行降息利好什么股票?

为了顺应和刺激经济的发展&#xff0c;央行有时会通过上升和下降利息来平衡。一般降息是在经济不景气的时分调控。那么央行降息是什么意思&#xff1f;央行降息利好什么股票&#xff1f;下面就由冠达管理为我们分析&#xff1a; 央行降息是什么意思&#xff1f; 降息的意思便是…

〔015〕Stable Diffusion 之 模型管理和信息管理插件 篇

✨ 目录 &#x1f388; 模型管理&#x1f388; 添加预览图&#x1f388; 添加详细描述&#x1f388; 模型分组&#x1f388; 下载 Civitai Helper 插件&#x1f388; 插件 Civitai Helper 使用方法 &#x1f388; 模型管理 点击生成按钮下的 显示/隐藏扩展模型 Show/hide extr…

【Terraform学习】使用 Terraform 托管 S3 静态网站(Terraform-AWS最佳实战学习)

使用 Terraform 托管 S3 静态网站 实验步骤 前提条件 安装 Terraform&#xff1a; 地址 下载仓库代码模版 本实验代码位于 task_s3 文件夹中。 变量文件 variables.tf 在上面的代码中&#xff0c;您将声明&#xff0c;aws_access_key&#xff0c;aws_secret_key和区域变量…

人工智能的螺旋式发展历程

人工智能的螺旋式发展历程 人工智能的历史自1956年开始至今&#xff0c;已经有66年的历史。世界人工智能历史可分为三个阶段&#xff0c;从1956年至1976年是人工智能的第一个发展阶段&#xff0c;1976年至2006年是第二个发展阶段&#xff0c;而2006年至今则是人工智能的第三个发…

Spring Boot系统之高可用限流实现解决方案

1.什么是限流 限流是对某一时间窗口内的请求数进行限制&#xff0c;保持系统的可用性和稳定性&#xff0c;防止因流量暴增而导致的系统运行缓慢或宕机。 为什么需要限流 其实限流思想在生活中随处可见&#xff0c;例如景区限流&#xff0c;防止人满为患。热门餐饮需要排队就…

3.Trunc截断函数用法

TRUNC函数用于对值进行截断 用法有两种&#xff1a;TRUNC&#xff08;NUMBER&#xff09;表示截断数字&#xff0c;TRUNC&#xff08;date&#xff09;表示截断日期 (1)截断数字 格式&#xff1a;TRUNC&#xff08;n1,n2&#xff09;&#xff0c;n1表示被截断的数字&#xf…

【LeetCode】买卖股票的最佳时机之k天

买卖股票的最佳时机之k天 题目描述算法描述编程代码 链接: 买卖股票的最佳时机之k天 题目描述 算法描述 编程代码 class Solution { public:int maxProfit(int k, vector<int>& prices) {int n prices.size();k min(k,n/2);vector<vector<int>> f(n,…

【中危】PowerJob 未授权访问漏洞 (CVE-2023-36106)

漏洞描述 PowerJob 是一款开源的分布式任务调度框架。 在 PowerJob 受影响版本中存在错误的访问控制漏洞。由于没有对/container/list接口做鉴权&#xff0c;未授权的攻击者可以构造 appId 参数访问 /container/list接口获取应用容器的标识、运行状态、日志等敏感信息。 漏洞…