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

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

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 中用于将方法返回值或方法参数绑定到模型中的注解。它可以用于添加模型属性、将表单数据绑定到对象上,并提供了灵活的配置选项。

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

08-22 23:28