第一步:FreeMarkerViewResolver视图解析器需要 导入jar
freemarker-2.3.28.jar
spring-context-support-4.0.4.RELEASE.jar
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.28</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.0.4.RELEASE</version>
</dependency>
第二步:配置文件配置
<!-- html视图解析器 必须先配置freemarkerConfig,注意html是没有prefix前缀属性的-->
<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<!--模板路径,相当于前缀-->
<property name="templateLoaderPath">
<value>/WEB-INF/htmls/</value>
</property>
</bean>
<bean id="htmlviewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="contentType" value="text/html;charset=UTF-8"></property>
<property name="cache" value="true"/>
<!--后缀,没有前缀属性-->
<property name="suffix" value=".html" />
<!--优先级别,越小级别越高-->
<property name="order" value="0"/>
</bean>
<!--配置视图解析器,不同包可以建多个解析器,用viewNames属性区分:匹配视图名以jpg开头的。-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="contentType" value="application/xml"/>
<property name="viewNames" value="htmls*"/>
<!--前缀-->
<property name="prefix" value="/WEB-INF/"/>
<!--后缀-->
<property name="suffix" value=".jsp"/>
<property name="order" value="1"/>
</bean>
<!--静态资源默认用servlet配置,如果用FreeMarkerViewResolver解析器可以不用这句-->
<mvc:default-servlet-handler/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="contentType" value="text/html;charset=UTF-8"/>
<property name="viewNames" value="jsp*"/>
<!--前缀-->
<property name="prefix" value="/WEB-INF/"/>
<!--后缀-->
<property name="suffix" value=".jsp"/>
<property name="order" value="2"/>
</bean>
首先可以使用order属性进行设置 系统首先按解析器的order值进行查找 首先使用FreeMarkerViewResolver解析器调用canHandle方法,判断当前解析器对视图是否能够解析。如不能解析在依次调用。
我这有两个JSP文件:因为不同包,所以就多配一个InternalResourceViewResolver解析器
1 WEB-INF/htmls/a.jsp
2 WEB-INF/jsp/b.jsp
**注意:**要添加viewNames属性,以分别匹配不同的包。因为InternalResourceViewResolver其有一个buildView方法,该方法一定会创建一个View;所以呢View永远不为null(即使该jsp不存在);
<property name="viewNames" value="htmls*"/>
<property name="viewNames" value="jsp*"/>
如上两个的意思是对htmls或jsp开头的视图名进行处理,比如返回的视图名为htmls/a 那么会交给viewNames为htmls*的那个解析器处理;
XmlViewResolver视图解析器:
1,新建一个xml,并配置如下
view.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"
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/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 定义一个外部资源视图 -->
<bean id="taobao" class="org.springframework.web.servlet.view.RedirectView">
<property name="url" value="http://www.taobao.com"/>
</bean>
<!-- 定义一个内部资源视图 -->
<bean class="org.springframework.web.servlet.view.JstlView" id="ccc.html">
<property name="url" value="/statics/htmls/ccc.html"/>
</bean>
<!-- 定义一个内部资源视图 -->
<bean class="org.springframework.web.servlet.view.JstlView" id="ccc.jpg">
<property name="url" value="/statics/images/ccc.jpg"/>
</bean>
</beans>
2,spring mvc配置文件配置
<!--XmlViewResolver视图解析器-->
<bean class="org.springframework.web.servlet.view.XmlViewResolver">
<property name="location" value="classpath:view.xml"/>
<property name="order" value="0"/>
</bean>
3,controller层代码
@RequestMapping("/useradd2")
public String userAdd1(){
return "ccc.html";
}
@RequestMapping("/useradd3")
public String userAdd2(){
return "ccc.jpg";
}
注意:html;jpg文件需要放在静态资源文件夹下,不然会被拦截,报404错误