掘金 后端 ( ) • 2024-06-28 00:00

InternalResourceViewResolver用于解析内部资源(如 Servlet 容器中的 JSP 页面)的视图解析器。以下是使用 InternalResourceViewResolver 的一个真实案例,包括业务场景、核心代码讲解以及配置。

类结构设计

image.png

场景案例:

一个在线书店的 Web 应用程序,该应用程序需要展示书籍列表、书籍详情和购物车等功能。你决定使用 JSP 页面作为视图技术来呈现这些信息。

1. 定义 JSP 页面:

创建 JSP 页面来展示书籍列表和详情。

/WEB-INF/views/bookList.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Book List</title>
</head>
<body>
    <h1>Books</h1>
    <ul>
        <c:forEach var="book" items="${books}">
            <li>${book.title} by ${book.author}</li>
        </c:forEach>
    </ul>
</body>
</html>

/WEB-INF/views/bookDetails.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Book Details</title>
</head>
<body>
    <h1>${book.title}</h1>
    <p>Author: ${book.author}</p>
    <p>Price: ${book.price}</p>
    <!-- 其他书籍详情 -->
</body>
</html>

2. 配置 InternalResourceViewResolver

在 Spring 配置中设置 InternalResourceViewResolver

Java 配置:

import org.springframework.context.annotation.Bean;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Bean
    public InternalResourceViewResolver viewResolver() {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setPrefix("/WEB-INF/views/");
        viewResolver.setSuffix(".jsp");
        return viewResolver;
    }
}

XML 配置:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <mvc:view-resolvers>
        <mvc:internal-resource-view-resolver prefix="/WEB-INF/views/" suffix=".jsp"/>
    </mvc:view-resolvers>

    <!-- 其他Spring MVC配置 -->
</beans>

3. 控制器:

创建控制器来处理书籍列表和详情的请求,并返回相应的视图名称。

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.ui.Model;
import java.util.Arrays;

@Controller
public class BookController {

    @GetMapping("/books")
    public String listBooks(Model model) {
        model.addAttribute("books", Arrays.asList(new Book("Java Basics", "Author A", 29.99),
                                                      new Book("Spring Framework", "Author B", 39.99)));
        return "bookList";
    }

    @GetMapping("/books/{title}")
    public String getBookDetails(@PathVariable String title, Model model) {
        Book book = findBookByTitle(title); // 假设这个方法查找书籍
        model.addAttribute("book", book);
        return "bookDetails";
    }
    
    private Book findBookByTitle(String title) {
        // 实现根据标题查找书籍的逻辑
        return new Book(title, "Author", 12.99);
    }
}

4. 模型对象(Book.java):

public class Book {
    private String title;
    private String author;
    private double price;

    public Book(String title, String author, double price) {
        this.title = title;
        this.author = author;
        this.price = price;
    }

    // 标准的 getter 和 setter
}

总结:

  • InternalResourceViewResolver 允许开发者将控制器的返回值解析为内部资源,如 JSP 页面。
  • 它简化了视图解析过程,使得开发者可以轻松地使用 JSP 页面作为视图。
  • 结合 JSP 页面和模型数据,可以生成动态的 HTML 内容。