SpringBoot 返回视图

SpringBoot下的Starter-web本身是没有支持模板引擎的,返回的页面也只能是静态资源,所以如果要将后台数据和页面一起返回需要增加模板引擎。

SpringBoot MVC静态资源设置

源码分析静态

通过对源代码WebMvcAutoConfiguration的解析,发现SpringBoot MVC默认的资源目录是这四个,如果不指定静态资源就需要创建这四个目录。因为默认编译会将工程resources下的文件和目录编译到target\classes,所以classpath相当于编译后的target\classes的目录。

"classpath:/META-INF/resources/",
"classpath:/resources/", 
"classpath:/static/", 
"classpath:/public/"

SpringBoot 返回视图,静态资源报404一般是未指定资源路径。可以是使用以下两种方式解决。

1.方式1-静态资源路径

spring:
  #  表示所有的访问都经过静态资源路径
  mvc:
    static-path-pattern: /**
  #  配置静态资源根路径
  resources:
    static-locations: classpath:/,classpath:/mystatic/

2.方式2-build生成资源

修改pom文件,编译时指定资源路径。

修改pom编译时指定资源的目标路径
    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <!--使用mvc默认的目录META-INF/resources-->
                <targetPath>META-INF/resources</targetPath>
                <includes>
                    <include>**/**</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
    </build>

3.方式3-自定义目录

自定义目录就是使用方式一和方式二组合

<build>
        <resources>
            <resource>
                <!--                设置将资源生成了class目录下-->
                <directory>src/main/webapp</directory>
                <targetPath>webapp</targetPath>
                <includes>
                    <include>**/**</include>
                </includes>
                <filtering>false</filtering>
            </resource>
            <!--            设置配置文件(application.yml)的生成,如果不设置就不会编译到class目录-->
            <resource>
                <directory>src/main/resources</directory>
                <targetPath>/</targetPath>
                <includes>
                    <include>**/**</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

application.yml

spring:
  #  表示所有的访问都经过静态资源路径
  mvc:
    static-path-pattern: /**
  #  配置静态资源根路径
  resources:
    static-locations: classpath:/webapp,classpath:/webapp/mystatic/
  thymeleaf:
    prefix: classpath:/webapp/templates/

 编译生成后的目录结构:

模板引擎

除了REST Web服务之外,还可以使用Spring MVC来服务动态HTML内容。Spring MVC支持多种模板技术,包括Thymeleaf,FreeMarker,Groovy,Muslache和JSP。此外,许多其他模板引擎包括它们自己的Spring MVC集成。

1.JSP模板:

JSP限制:当运行使用嵌入的servlet容器的Spring Boot应用程序(并打包为可执行文件)时,JSP支持中存在一些限制。

  1. 有了Tomcat,如果你使用war包装,它应该可以工作。 也就是说,一个可执行的war工作,也可以部署到一个标准的容器(不限于,但包括Tomcat)。 由于Tomcat中的硬编码文件模式,可执行jar无法使用。
  2. 使用Jetty,如果您使用war包装,它应该可以工作。 也就是说,一个可执行的jar有效,并且也可以部署到任何标准容器。
  3. Undertow不支持JSP。
  4. 创建自定义error.jsp页面不会覆盖错误处理的默认视图。 应该使用自定义错误页面。

 1.添加JSP支持的依赖

   <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.5.0</version>
        </dependency>

        <!--JSP模板引擎-->
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
            <version>9.0.46</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
    </dependencies>

2.返回视图的控制器

@Controller
@Slf4j
public class ViewController {

    /**
     * 不能直接放回静态资源,返回视图报错500(ModelAndView)---返回报错
     * 通过转发返回
     *
     * @return
     */
    @GetMapping("/")
    public void index(HttpServletResponse servletResponse) throws IOException {
        servletResponse.sendRedirect("/static/test.html");
    }

    @GetMapping("/viewmodel")
    public ModelAndView viewModel() {
        log.info("viewModel Start");
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("viewmodel");
        modelAndView.addObject("message", "back end;无js");
        return modelAndView;
    }

    @GetMapping("/viewmodeljs")
    public ModelAndView viewModelJS() {
        log.info("viewmodelJS Start");
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("viewmodeljs");
        modelAndView.addObject("message", "back end;js测试");
        return modelAndView;
    }
}

3.jsp视图

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<title>viewmodel</title>
	</head>
	<body>
		<h1>hello ${message}</h1>
	</body>
</html>


###############或者#####################
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<title>viewmodel-js</title>
		<script src="../static/viewmodeljs.js" type="text/javascript"></script>
	</head>
	<body>
		<h1>hello ${message}</h1>
		<input onclick="onclickbtn()" type="button" value="button"/>
	</body>
</html>

4.修改application.yml

 指定spring.mvc匹配的资源前缀和后缀,如果不指定就需要在controller指定绝地路径和视图的后缀。

#返回的前缀,通过编译时指定资源路径
spring:
  mvc:
    view:
      prefix: /pages/
      #返回的后缀
      suffix: .jsp

5.pom文件build节点

这一步指定build将jsp资源编译到resources目录,如果不指定将会404错误。

 <build>
        <resources>
            <resource>
                <directory>src/main/mywebapp</directory>
                <!--这里必须是META-INF/resources-->
                <targetPath>META-INF/resources</targetPath>
                <includes>
                    <include>**/**</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

6.启动调试 

编译生成:

访问http://localhost:8080/viewmodeljs

2.thymeleaf模板

thymeleaf修饰的页面一般是thymeleaf默认在resources-》templates目录下作为前缀,表示被thymeleaf修饰的页面在这里作为根目录。(注意:templates 目录并不是静态资源目录,它是一个放页面模板的位置(你看到的 Thymeleaf 模板虽然后缀为 .html,其实并不是静态资源)

 1.修改pom增加依赖

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.5.0</version>
        </dependency>

        <!--        thymeleaf 模板引擎-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
            <version>2.5.0</version>
        </dependency>
    </dependencies>

2.创建页面

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>viewmodel</title>
    <script src="../mystatic/js/viewmodeljs.js"></script>
</head>
<body>
<div>
    <h1 th:text="${message}"></h1>
    <input value="button" type="button" onclick="onclickbtn()"/>
</div>
</body>
</html>

3.创建controller

@Controller
@Slf4j
public class ViewController {

    /**
     * 不能直接放回静态资源,返回视图报错500(ModelAndView)---返回报错
     * 通过转发返回
     *
     * @return
     */
    @GetMapping("/")
    public void index(HttpServletResponse servletResponse) throws IOException {
        servletResponse.sendRedirect("/test.html");
    }

    @GetMapping("/viewmodel")
    public ModelAndView viewModel() {
        log.info("viewModel Start");
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("viewmodel");
        modelAndView.addObject("message", "back end;无js");
        return modelAndView;
    }

    @GetMapping("/viewmodeljs")
    public ModelAndView viewModelJS() {
        log.info("viewmodelJS Start");
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("viewmodeljs");
        modelAndView.addObject("message", "back end;js测试");
        return modelAndView;
    }
}

4.修改自定义静态资源路径和自定义模板位置

resources:(Spring Boot 默认的)存放资源文件
static:(Spring Boot 默认的)存放静态文件,比如 css、js、image, (访问方式 http://localhost:8080/js/main.js)
public:(Spring Boot 默认的)存放公共文件

spring:
  #  表示所有的访问都经过静态资源路径
  mvc:
    static-path-pattern: /**
  #  配置静态资源根路径
  resources:
    static-locations: classpath:/,classpath:/mystatic/
  #  作为前缀,表示被thymeleaf修饰的页面在这里作为根目录(不是静态资源)
  #  默认配置只能设置一个thymeleaf模板位置,所以需要配置多个模板位置的时候就需要自行定义模板解析
  thymeleaf:
    prefix: classpath:/templates/
    #    这里表示以.html作为后缀
#    suffix: .html
#    #关闭缓存
#    cache: false

5.启动调试

访问http://localhost:8080/viewmodeljs

<think> 首先,用户的问题是关于Spring Boot如何配置视图解析器的。我需要参考提供的站内引用来构建回答。 回顾引用内容: - **引用[1]**: 解释了手动配置和Spring Boot自动配置视图解析器的区别。提到了手动配置适用于非Spring Boot项目或深度定制,而Spring Boot自动配置简化了集成。 - **引用[2]**: 展示了在Spring Boot配置类中配置InternalResourceViewResolver的代码示例。 - **引用[3]**: 展示了使用WebMvcConfigurerAdapter来配置视图控制器,控制跳转页面。 - **引用[4]**: 展示了XmlViewResolver的配置示例,但这是在XML中配置的。 - **引用[5]**: 讨论了配置视图解析器时可能导致404错误的问题,并提供了解决方法,比如注册webapp目录作为资源目录。 用户的核心问题是:"springboot如何配置视图解析器"。我需要提供一个清晰的、结构化的回答,引导用户逐步配置。 根据系统指令: - 使用中文回答。 - 回答结构清晰,帮助用户逐步解决问题。 - 引用内容时,在末尾添加引用标识,如[^1]。 - 生成相关问题(在"§§相关问题§§"部分)。 - 对于数学表达式,使用LaTeX格式,但这个问题似乎不涉及数学,所以可能不需要。 回答结构: 1. **介绍视图解析器**:简要解释视图解析器的作用。 2. **Spring Boot的自动配置**:基于引用[1],说明Spring Boot如何自动配置常见的视图解析器(如Thymeleaf、Freemarker等)。 3. **手动配置视图解析器**:如果需要自定义,如何手动配置。参考引用[2]和引用[4]。 - 使用InternalResourceViewResolver(用于JSP)的示例(引用[2])。 - 简要提到XmlViewResolver(引用[4]),但指出在Boot中可能不常用。 4. **配置视图控制器**:参考引用[3],展示如何设置默认视图或重定向。 5. **常见问题和解决方案**:基于引用[5],讨论配置错误如404问题,并提供修复建议。 6. **总结**:对比手动和自动配置,根据场景推荐。 最后,添加"§§相关问题§§"部分,生成相关问题。 确保引用: - 在相关段落末尾添加引用标识。 例如: - "Spring Boot会自动配置常见的视图解析器[^1]." - "可以手动配置InternalResourceViewResolver[^2]." 代码块:用户提供了代码示例,我应该引用它们。系统指令要求使用代码块展示代码。 在回答中: - 引用代码时,使用代码块格式。 - 确保LaTeX正确,但这里可能无数学。 相关问题建议: 1. 如何处理Spring Boot视图解析器配置错误? 2. Spring Boot支持哪些视图技术? 3. 如何自定义视图解析器行为? 4. 视图解析器和视图控制器的区别是什么? 基于引用内容生成。 </think> ### Spring Boot视图解析器配置方法 在Spring Boot应用中,视图解析器(ViewResolver)负责将控制器返回的逻辑视图名(如"home")解析为具体的视图资源(如HTML、JSP文件)。Spring Boot通过自动配置简化了常见视图技术的集成,但也支持手动配置以满足定制需求。下面我将逐步解释配置方法,基于参考引用内容。 #### 1. **Spring Boot自动配置视图解析器** Spring Boot会根据项目依赖自动配置常见的视图解析器。例如,添加Thymeleaf或Freemarker starter依赖后,Boot会默认设置对应的视图解析器,无需手动配置。 - **步骤**: 1. 在`pom.xml`中添加视图技术的starter依赖(如Thymeleaf): ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> ``` 2. 视图文件默认放在`src/main/resources/templates`目录下(如`home.html`)。 3. 控制器中返回逻辑视图名: ```java @Controller public class HomeController { @GetMapping("/") public String home() { return "home"; // 自动解析为templates/home.html } } ``` - **优势**:Spring Boot自动处理前缀、后缀等约定,属性可通过`application.properties`定制(如`spring.thymeleaf.prefix=classpath:/custom/`)[^1]。 #### 2. **手动配置视图解析器** 如果需要深度定制(如使用JSP或其他非标准视图),可以手动配置视图解析器。以下是两种常见方式: - **方式一:配置InternalResourceViewResolver(用于JSP)** 参考引用[2],在自定义配置类中使用`@Bean`定义: ```java package com.stu.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.ViewResolver; import org.springframework.web.servlet.view.InternalResourceViewResolver; @Configuration public class MvcConfig { @Bean public ViewResolver internalResourceViewResolver() { InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setPrefix("/WEB-INF/views/"); // 视图文件前缀 resolver.setSuffix(".jsp"); // 视图文件后缀 return resolver; } } ``` - **注意事项**:确保视图文件路径正确(如将JSP文件放在`src/main/webapp/WEB-INF/views/`目录下)。如果出现404错误,需注册`webapp`目录为资源目录(见常见问题部分)[^2][^5]。 - **方式二:配置视图控制器(简化视图跳转)** 参考引用[3],使用`WebMvcConfigurer`设置默认视图或重定向: ```java package com.boot.zhiyi.config; import org.springframework.context.annotation.Configuration; import org.springframework.core.Ordered; import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class ViewConfig implements WebMvcConfigurer { @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/").setViewName("forward:/html/login.html"); // 设置根路径跳转 registry.setOrder(Ordered.HIGHEST_PRECEDENCE); // 设置优先级 } } ``` - **适用场景**:适合单纯重定向或设置默认入口视图,无需控制器逻辑[^3]。 - **其他视图解析器(如XmlViewResolver)** 引用[4]展示了传统XML配置,但在Spring Boot中推荐使用Java配置。如果需要类似功能,可定义`BeanNameViewResolver`或自定义解析器,不建议直接使用XML[^4]。 #### 3. **常见问题与解决方案** - **404错误(视图文件未找到)**: - **原因**:视图文件路径未正确注册。 - **修复**:在`pom.xml`中添加资源目录配置(引用[5]): ```xml <build> <resources> <resource> <directory>src/main/webapp</directory> <!-- 注册webapp目录 --> <targetPath>META-INF/resources</targetPath> <includes> <include>**/*.*</include> </includes> </resource> </resources> </build> ``` 确保视图文件路径与`setPrefix()`匹配[^5]。 #### 4. **总结与推荐** - **自动配置**:默认推荐,适用于常见视图技术(Thymeleaf、Freemarker)。添加starter依赖后,Boot自动处理解析器,通过属性文件定制简单参数[^1]。 - **手动配置**:适用于JSP、深度定制或非标准需求。使用`InternalResourceViewResolver`或视图控制器,确保资源路径正确[^2][^3]。 - **选择建议**:优先使用自动配置;如需定制视图路径或处理特殊场景,再引入手动配置。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值