Spring版本声明:
- Spring 5.2.5.RELEASE
- Spring mvc 5.2.5.RELEASE
项目基于Maven
导入依赖Freemarker依赖
在pom文件中导入下面的依赖:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
<!-- 这个依赖是必须的 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.29</version>
</dependency>
配置Spring MVC视图解析器
在spring-web.xml中配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<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"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<context:component-scan base-package="org.gyb.dubbo.controller"/>
<mvc:annotation-driven/>
<mvc:freemarker-configurer>
<mvc:template-loader-path location="classpath*:/template/"/>
</mvc:freemarker-configurer>
<mvc:view-resolvers>
<mvc:freemarker suffix=".ftl"/>
</mvc:view-resolvers>
</beans>
Spring MVC提供了非常好用的mvc:*</mvc:*>标签,这些标签在提供了便利的同时也埋下了很多陷阱。例如上边配置中关于freemarker的配置:
<mvc:freemarker-configurer>
<mvc:template-loader-path location="classpath*:/template/"/>
</mvc:freemarker-configurer>
第一次使用这个标签,心里刚刚还在感叹Spring MVC的强大,随后就想骂一句mmp,这样配置启动项目之后报了一下错误:
不能解析视图名称,各种试验之后发现问题出在 <mvc:template-loader-path location=“classpath*:/template/”/>这里,查看官方文档可知,location支持Spring resource表示的资源路径,也支持从项目根路径开始表示的字符串路径,即可以写成classpath:/开头的,也可以是/WEB-INF/…这样的路径,但是我偏偏加了一个*,经过测试去掉 * 之后就可以了。正确的配置如下:
<mvc:freemarker-configurer>
<mvc:template-loader-path location="classpath:/template/"/>
<!-- 或者写成下面的,注意这样写IDEA会提示找不到路径而标红,但是不影响运行 -->
<!--<mvc:template-loader-path location="/WEB-INF/classes/template/"/>-->
</mvc:freemarker-configurer>
<mvc:view-resolvers>
<mvc:freemarker suffix=".ftl"/>
</mvc:view-resolvers>
另一个坑
在上面的配置中有如下配置,这个配置没任何问题:
<mvc:view-resolvers>
<mvc:freemarker suffix=".ftl"/>
</mvc:view-resolvers>
千万不要写成如下:
<mvc:view-resolvers>
<mvc:freemarker prefix="/WEB-INF/classes/template/" suffix=".ftl"/>
</mvc:view-resolvers>
不要加prefix属性,这样的话仍然会出现“无法解析视图的错误”。