👉博主介绍: 博主从事应用安全和大数据领域,有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 提供了多种视图解析器的实现,常见的视图解析器包括:
InternalResourceViewResolver
:用于解析 JSP 视图。它将逻辑视图名解析为 InternalResourceView 对象,该对象将会通过 RequestDispatcher 进行转发到对应的 JSP 文件进行渲染。UrlBasedViewResolver
:用于根据逻辑视图名解析为 URL 形式的视图。它可以将逻辑视图名直接映射为 URL,或者通过添加前缀和后缀来构建 URL。FreeMarkerViewResolver
:用于解析 FreeMarker 模板引擎的视图。它将逻辑视图名解析为 FreeMarkerView 对象,该对象将会使用 FreeMarker 引擎来渲染模板并生成响应内容。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 中用于传递数据给视图的对象。它们在功能上非常相似,用于在控制器方法中存储和传递数据给视图。
Model
:Model 是一个接口,用于存储和传递数据给视图。它定义了一些方法来操作数据,如添加属性、获取属性等。在控制器方法中,可以将数据存储在 Model 对象中,然后返回视图名称,视图可以通过访问 Model 对象来获取数据。例如:
@GetMapping("/hello")
public String hello(Model model) {
model.addAttribute("message", "Hello, World!");
return "hello";
}
在上述示例中,使用 Model 的 addAttribute() 方法将名为 “message” 的属性添加到 Model 对象中,然后返回视图名称 “hello”。
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”。
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 对象包含以下两个主要部分:
Model
:用于存储数据的模型对象,可以通过 addAttribute() 方法添加数据。数据存储在一个 Map 中,键值对表示属性名和属性值。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 中的一个注解,用于将方法返回值或方法参数绑定到模型中。它可以用于在请求处理方法中添加模型属性,也可以用于将表单数据绑定到方法参数上。
在请求处理方法中添加模型属性
:
@GetMapping("/hello")
public String hello(Model model) {
model.addAttribute("message", "Hello, World!");
return "hello";
}
在上述示例中,使用 @ModelAttribute 注解将 “message” 属性添加到模型中。在视图中,可以通过 ${message}
来获取该属性的值。
将表单数据绑定到方法参数上
:
@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 初阶