`
zzc1684
  • 浏览: 1223088 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

Spring MVC的多视图解析器配置及与Freemarker的集成

阅读更多

一、从freemarker谈起

Freemarker使用模板技术进行视图的渲染。自从看了Struts标签、Freemarker、JSTL的性能对比后,我毅然决定放弃Struts标签了!效率太差……

Spring本身支持了对Freemarker的集成。只需要配置一个针对Freemarker的视图解析器即可。

 

二、Spring MVC视图解析器

视图解析器的工作流程大致是这样的:Controller的某个方法执行完成以后,返回一个视图(比如:listUser),视图解析器要做的工作 就是找到某个对象来完成视图的渲染,或者跳转到其他的逻辑视图。这里的渲染对象通常就是我们的jsp文件或者我们下面用的Freemarker(例如 listUser.jsp或者listUser.ftl)。渲染完成以后,将解析结果发送到客户端浏览器

下面介绍一下本文需要用到的解析器(更多解析器资料,请参考 http://e-freya.iteye.com/blog/384083 ):

InternalResourceViewResolver:这是一个最常用的解析器。通常使用它指定渲染对象为jsp页面

FreeMarkerViewResolver:这就是Spring与Freemarker整合需要用到的解析器

 

三、配置多视图,支持freemarker

我们通常不希望所有的动态页面请求都使用Freemarker来渲染,那就需要配置多个视图解析器。网上有很多这方面的帖子。我看到很多人的做法是 在web.xml中配置两个DispatcherServlet,一个拦截*.do,一个拦截*.ftl;然后再写两个 dispatcherServlet.xml,配置两个视图解析器;jsp页面、ftl模板就各司其职。

其实没有那么复杂。

1.Web.xml

 

Xml代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee   
  5.     http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">  
  6.     <welcome-file-list>  
  7.         <welcome-file>index.jsp</welcome-file>  
  8.     </welcome-file-list>  
  9.   
  10.     <!-- ======================================================== -->  
  11.     <!--                  Spring MVC Config Servlet               -->  
  12.     <!-- ======================================================== -->  
  13.     <!-- JSP DispatcherServlet -->  
  14.     <servlet>  
  15.         <servlet-name>dispatcher</servlet-name>  
  16.         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  17.         <init-param>  
  18.             <param-name>contextConfigLocation</param-name>  
  19.             <param-value>/WEB-INF/classes/applicationContext.xml</param-value>  
  20.         </init-param>  
  21.         <load-on-startup>1</load-on-startup>  
  22.     </servlet>  
  23.   
  24.     <!-- ======================================================== -->  
  25.     <!--                  Spring MVC Config Mapping               -->  
  26.     <!-- ======================================================== -->  
  27.     <servlet-mapping>  
  28.         <servlet-name>dispatcher</servlet-name>  
  29.         <url-pattern>*.do</url-pattern>  
  30.     </servlet-mapping>  
  31. </web-app>  

 

 

2.dispatcherServlet.xml

 

Xml代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"  
  4.     xmlns:tx="http://www.springframework.org/schema/tx"  
  5.     xmlns:p="http://www.springframework.org/schema/p"  
  6.     xmlns:context="http://www.springframework.org/schema/context"  
  7.     xmlns:mvc="http://www.springframework.org/schema/mvc"  
  8.     xsi:schemaLocation="  
  9.   http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
  10.   http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd  
  11.   http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd  
  12.   http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd  
  13.   http://www.springframework.org/schema/mvc  http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">  
  14.   
  15.       
  16.     <!--通用视图解析器-->  
  17.     <bean id="viewResolverCommon" class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
  18.         <property name="prefix" value="/WEB-INF/page/"/>    
  19.         <property name="suffix" value=".jsp"/><!--可为空,方便实现自已的依据扩展名来选择视图解释类的逻辑  -->  
  20.         <property name="viewClass">  
  21.             <value>org.springframework.web.servlet.view.InternalResourceView</value>  
  22.         </property>  
  23.         <property name="order" value="1"/>  
  24.     </bean>  
  25.       
  26.     <!-- 配置freeMarker视图解析器 -->  
  27.     <bean id="viewResolverFtl" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">  
  28.         <property name="viewClass" value="org.springframework.web.servlet.view.freemarker.FreeMarkerView"/>  
  29.         <property name="contentType" value="text/html; charset=utf-8"/>  
  30.         <property name="cache" value="true" />  
  31.         <property name="suffix" value=".ftl" />  
  32.         <property name="order" value="0"/>  
  33.     </bean>  
  34.       
  35.     <!-- 配置freeMarker的模板路径 -->  
  36.     <bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">  
  37.         <property name="templateLoaderPath">  
  38.             <value>/WEB-INF/ftl/</value>  
  39.         </property>  
  40.         <property name="freemarkerVariables">  
  41.             <map>  
  42.                 <entry key="xml_escape" value-ref="fmXmlEscape" />  
  43.             </map>  
  44.         </property>  
  45.         <property name="defaultEncoding">  
  46.             <value>utf-8</value>  
  47.         </property>  
  48.         <property name="freemarkerSettings">  
  49.             <props>  
  50.                 <prop key="template_update_delay">3600</prop>  
  51.             </props>  
  52.         </property>  
  53.     </bean>  
  54.        
  55.     <bean id="fmXmlEscape" class="freemarker.template.utility.XmlEscape"/>  
  56.       
  57.     <!-- 注解支持 -->    
  58.     <mvc:annotation-driven/>  
  59.       
  60.     <!-- 对包中的所有类进行扫描,以完成Bean创建和自动依赖注入的功能 -->  
  61.     <context:component-scan base-package="com.hl.usersmanager">  
  62.         <!-- 允许定义过滤器将基包下的某些类纳入或排除  
  63.         <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> -->  
  64.     </context:component-scan>  
  65.       
  66. </beans>  

 

 

3.Controller

Java代码  收藏代码
  1. package com.hl.usersmanager.controller;  
  2.   
  3. import java.util.List;  
  4.   
  5. import org.springframework.beans.factory.annotation.Autowired;  
  6. import org.springframework.stereotype.Controller;  
  7. import org.springframework.ui.ModelMap;  
  8. import org.springframework.web.bind.annotation.RequestMapping;  
  9.   
  10. import com.hl.usersmanager.model.Users;  
  11. import com.hl.usersmanager.service.IUserService;  
  12.   
  13. @Controller  
  14. public class UserController {  
  15. //  使用注解实现自动装配 不需要再写get set方法以及在context中配置bean  
  16.     @Autowired  
  17.     private IUserService userService;  
  18.   
  19.     @RequestMapping(value = "findUserByName.do")  
  20.     public String findUserByName(String name,ModelMap model) {  
  21.         Users users = userService.findUserByName(name);  
  22.         model.addAttribute("userPhone",users.getPhone());  
  23.         System.out.println("userPhone:" + users.getPhone());  
  24.         return "showUser";  
  25.     }  
  26.       
  27.     @RequestMapping(value = "findAllUsers.do")  
  28.     public String findAllUsers(ModelMap model) {  
  29.         List<Users> users = userService.findAllUsers();  
  30.         model.addAttribute("users",users);  
  31.         return "listUser";  
  32.     }  
  33.       
  34.     ……  
  35. }  
 
 
在视图解析器中有一个<property name="order" value="orderValue"/>的配置,这个配置表示解析器的优先级别。我们将FreeMarkerViewResolver的级别设为 0,将InternalResourceViewResolver的级别设为1。这样,解析器就会优先使用 FreeMarkerViewResolver 进行解析,如果找不到相应的模板,就使用InternalResourceViewResolver进行 解析,如果还找不到页面,就会产生一个404错误!
 
在本例中,我们在/WEB-INF/page/下有一个showUser.jsp页面,在/WEB-INF/ftl/下有一个 listUser.ftl的模板文件。那么当访问findAllUsers.do的时候,Controller返回一个listUser视图,根据解析器 配置,先使用FreeMarkerViewResolver进行解析。它会根据模板路径templateLoaderPath的配置/WEB-INF /ftl/下去找是否有一个listUser并且以后缀配置suffix值.ftl,即listUser.ftl文件,如果找到则使用该模板进行解析。这 里我们实现已经创建了这个模板文件,所以user列表成功被显示出来。
当用户访问findUserByName.do的时候,返回showUser视图,毅然先使用FreeMarkerViewResolver进 行解析,结果发现在/WEB-INF/ftl/下并没有showUser.ftl这个模板文件,于是使用 InternalResourceViewResolver进行解析,于是开始寻找/WEB-INF/page/下是否有showUser.jsp文件。 由于我们已经创建了这个文件,于是最终使用showUser.jsp进行渲染。那么如果没有找到showUser.jsp,就会抛出404错误。
 
这里还要注意的是,如果Controller中返回视图加了后缀jsp或者ftl,在配置中就不要加入suffix配置,否则会找不到页面。
 
评论
9 楼 my249645546 2014-07-23   引用
xj20305 写道
我配置成功了,但是请问为什么freemarker的优先级order要小于internal的,否则就失败

因为这个order越小,表示优先级越高。所以,你如果想优先用Freemarker解析,那么它的order值就得比internal的小
8 楼 xj20305 2014-07-22   引用
我配置成功了,但是请问为什么freemarker的优先级order要小于internal的,否则就失败
7 楼 brightfox 2013-07-18   引用
brightfox 写道
my249645546 写道
brightfox 写道
楼主你好,最近我在用jeecms,根据你的这篇文章我在jeecms中配置了多视图支持,但是一直没有成功,作为一个初学者都不知道该怎么做,请问您是否在jeecms中配置过?


order 配置了吗?
现在的问题是什么,报什么错误?

没 有报错,但是访问jsp,依然是根据freemarker视图解析的。这是我在jeecms-servlet-front.xml中配置 的<bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
        <property name="prefix" value="/"/>
        <property name="order" value="1"/>
    </bean>

<bean id="freemarkerViewResolver" class="com.jeecms.common.web.springmvc.SimpleFreeMarkerViewResolver">
<property name="contentType" value="text/html; charset=UTF-8"/>
<property name="exposeRequestAttributes" value="false"/>
<property name="exposeSessionAttributes" value="false"/>
<property name="exposeSpringMacroHelpers" value="true"/>
<property name="order" value="0"/>
</bean>


你QQ多少 我加你[/quo
1074362064
6 楼 my249645546 2013-07-18   引用
brightfox 写道
my249645546 写道
brightfox 写道
楼主你好,最近我在用jeecms,根据你的这篇文章我在jeecms中配置了多视图支持,但是一直没有成功,作为一个初学者都不知道该怎么做,请问您是否在jeecms中配置过?


order 配置了吗?
现在的问题是什么,报什么错误?

没 有报错,但是访问jsp,依然是根据freemarker视图解析的。这是我在jeecms-servlet-front.xml中配置 的<bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
        <property name="prefix" value="/"/>
        <property name="order" value="1"/>
    </bean>

<bean id="freemarkerViewResolver" class="com.jeecms.common.web.springmvc.SimpleFreeMarkerViewResolver">
<property name="contentType" value="text/html; charset=UTF-8"/>
<property name="exposeRequestAttributes" value="false"/>
<property name="exposeSessionAttributes" value="false"/>
<property name="exposeSpringMacroHelpers" value="true"/>
<property name="order" value="0"/>
</bean>


你QQ多少 我加你
5 楼 brightfox 2013-07-18   引用
my249645546 写道
brightfox 写道
楼主你好,最近我在用jeecms,根据你的这篇文章我在jeecms中配置了多视图支持,但是一直没有成功,作为一个初学者都不知道该怎么做,请问您是否在jeecms中配置过?


order 配置了吗?
现在的问题是什么,报什么错误?

没 有报错,但是访问jsp,依然是根据freemarker视图解析的。这是我在jeecms-servlet-front.xml中配置 的<bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
        <property name="prefix" value="/"/>
        <property name="order" value="1"/>
    </bean>

<bean id="freemarkerViewResolver" class="com.jeecms.common.web.springmvc.SimpleFreeMarkerViewResolver">
<property name="contentType" value="text/html; charset=UTF-8"/>
<property name="exposeRequestAttributes" value="false"/>
<property name="exposeSessionAttributes" value="false"/>
<property name="exposeSpringMacroHelpers" value="true"/>
<property name="order" value="0"/>
</bean>
4 楼 my249645546 2013-07-18   引用
brightfox 写道
楼主你好,最近我在用jeecms,根据你的这篇文章我在jeecms中配置了多视图支持,但是一直没有成功,作为一个初学者都不知道该怎么做,请问您是否在jeecms中配置过?


order 配置了吗?
现在的问题是什么,报什么错误?
3 楼 brightfox 2013-07-17   引用
楼主你好,最近我在用jeecms,根据你的这篇文章我在jeecms中配置了多视图支持,但是一直没有成功,作为一个初学者都不知道该怎么做,请问您是否在jeecms中配置过?
2 楼 my249645546 2013-01-21   引用
javacampo 写道
找了很多文章,还是你这篇写的有头有尾,而且原理讲起来通俗易懂!

我最近在用freemarker生成html,由于项目采用SpringMVC+Mybatis,只有部分页面需要静态化,不知道你有没有实际的这个方面的经验,求教一下,谢谢了。我的QQ:120294885 敬候佳音.


页面静态化,通常有两种方式。一种是整个页面静态化为html文件;另一种是整个页面还是动态文件,只是页面的部分栏目静态化为一个模块,然后在页面中进行include

freemarker 本身可以用来渲染动态页面。如果你是想用来进行页面静态化,也是可以的。大致原理是这样:在boss系统中的java端一旦有记录添加或者修改,就以某个 ftl文件作为模板,在某个指定的路径下生成一个指定格式(ftl、html均可)的文件。然后 前台系统页面中将这个生成的文件导入即可。
html文件 只能在shtml文件中才能导入
jsp页面 应该可以使用标签进行导入(我没有试过 应该可以)

当然,如果你是整个页面静态化 直接在boss系统中生成一个完整的文件即可 不需要导入。
1 楼 javacampo 2013-01-18   引用
找了很多文章,还是你这篇写的有头有尾,而且原理讲起来通俗易懂!

我最近在用freemarker生成html,由于项目采用SpringMVC+Mybatis,只有部分页面需要静态化,不知道你有没有实际的这个方面的经验,求教一下,谢谢了。我的QQ:120294885 敬候佳音.
分享到:
评论

相关推荐

    Spring配置Freemarker视图解析器,配置多个视图解析器

    本篇文章将深入探讨如何在Spring中配置Freemarker视图解析器,以及如何配置多个视图解析器以实现更灵活的应用场景。 首先,让我们了解如何配置单个Freemarker视图解析器。在Spring的配置文件(如`...

    Spring MVC--5.视图和视图解析器

    接下来,我们将深入探讨Spring MVC中的视图和视图解析器的工作原理及常见用法。 首先,我们来看视图。在Spring MVC中,视图通常是一个JSP、FreeMarker或Thymeleaf等模板引擎页面。这些模板引擎允许开发者将业务逻辑...

    spring mvc, tiles, freemarker集成

    Freemarker与Spring MVC结合使用时,可以作为视图层,将业务数据渲染成用户友好的界面。 集成这三者的基本步骤如下: 1. **配置POM.xml**:在项目的`pom.xml`文件中添加Spring MVC、Tiles和Freemarker的依赖。确保...

    spring MVC3 集成 freemarker

    将FreeMarker与Spring MVC集成,可以实现灵活的视图层渲染,提高应用的可扩展性和可维护性。 **FreeMarker 的基本概念** FreeMarker是一个基于模板的开源Java库,用于生成HTML、XML、电子邮件等静态或动态内容。它...

    spring mvc +freemarker不错的mvc搭配

    Spring MVC 是一个强大...在Spring MVC中集成FreeMarker,首先需要在项目的配置文件(如`servlet-context.xml`)中配置FreeMarker视图解析器。这通常包括指定模板目录、编码格式和是否缓存模板等设置。例如: ```xml ...

    spring mvc freemarker 简单例子

    - 在Spring的配置文件(例如`dispatcher-servlet.xml`)中,添加Freemarker视图解析器的配置,包括视图解析器的bean定义,设置模板路径等: ```xml &lt;bean id="freemarkerConfig" class="org.springframework.web....

    spring mvc 3.0-mybatis-freemarker整合

    1. **配置Spring MVC**:首先,我们需要在Spring的配置文件中定义DispatcherServlet,设置视图解析器为FreeMarkerViewResolver,并配置FreeMarker的配置路径。 2. **配置MyBatis**:接着,配置MyBatis的...

    Spring MVC 4.2.3

    7. **多视图解析器**:Spring MVC支持多种视图解析器,如JSP、FreeMarker、Thymeleaf等,可以根据项目需求灵活选择。 8. **模板引擎集成**:例如,与Thymeleaf的集成使得开发者能编写声明式逻辑的模板,提高了视...

    spring MVC + freeMarker

    5. 视图解析:在控制器中,通过`return "viewName"`来指定视图名称,Spring MVC会根据配置自动找到对应的FreeMarker模板文件。 例如,有一个名为`StuManage`的控制器,可能包含一个用于显示学生列表的方法: ```...

    Spring MVC整合FreeMarker

    - 在 Spring MVC 的配置文件(如 `servlet-context.xml`)中,我们需要添加 FreeMarker 的配置,包括视图解析器(`FreemarkerViewResolver`)和 FreeMarker 配置工厂(`FreemarkerConfig`)。 - 视图解析器用于...

    Spring.MVC-A.Tutorial-Spring.MVC学习指南 高清可复制版PDF

    此外,Spring MVC还能够与其他Spring模块(如Spring Security、Spring WebSocket等)无缝集成,提供完整的解决方案。 总之,“Spring MVC - A Tutorial”这份指南会详细讲解Spring MVC的各个核心组件和使用技巧,...

    《精通Spring MVC 4》源码

    首先,Spring MVC的核心组件包括DispatcherServlet、Controller、Model-View-Controller(MVC)架构、视图解析器和数据绑定等。DispatcherServlet作为Spring MVC的前端控制器,负责接收HTTP请求,然后根据配置分发到...

    Mastering Spring MVC 4(2015.09)源码

    Spring MVC支持多种视图技术,如JSP、FreeMarker或Thymeleaf,开发者可以根据项目需求选择合适的视图解析器。 视图解析器是Spring MVC中用于确定视图名对应的实际资源路径的组件。例如,...

    SpringMVC自定义多视图

    Spring MVC默认提供了一些视图解析器,如InternalResourceViewResolver用于处理JSP视图,而JsonViewResolver可以处理JSON响应。但为了实现自定义多视图,我们可能需要创建自己的视图解析器或者扩展现有的。 例如,...

    最全最经典spring-mvc教程

    视图解析器(ViewResolver)根据指定的逻辑视图名查找物理视图,常见的视图技术有JSP、Thymeleaf、FreeMarker等。 Spring MVC还支持数据绑定,自动将请求参数绑定到Java对象,这极大地简化了表单提交的处理。对于...

    spring MVC简单示例

    这个"spring MVC简单示例"是为了帮助初学者理解Spring MVC的基本工作原理和配置,通过实践这个例子,你可以了解到如何创建一个简单的Controller、配置视图解析器并建立一个基本的请求处理流程。随着对Spring MVC的...

    springjpa 和 spring多视图配置实例

    本实例探讨的是如何在Spring环境中整合Spring MVC、Spring Data JPA以及使用Freemarker或JSON作为多视图配置。让我们深入理解这些技术及其相互作用。 首先,Spring MVC是Spring框架的一部分,专门用于构建Web应用...

    spring-MVC.zip_Java spring mvc_spring mvc_spring mvc

    在提供的"spring MVC.docx"文档中,可能详细介绍了如何配置Spring MVC环境,创建Controller,处理请求,以及如何配置视图解析器等内容。对于初学者来说,这是一份很好的实践指南,可以帮助理解Spring MVC的工作原理...

    Spring mvc5.0.3 所有jar包

    5. **视图解析**: Spring MVC支持多种视图技术,如JSP、FreeMarker、Thymeleaf等。通过`viewResolver`配置,可以指定视图解析器,将视图名解析为实际的视图路径。 6. **RESTful风格的URL设计**: Spring MVC支持创建...

Global site tag (gtag.js) - Google Analytics