- 浏览: 40859 次
- 性别:
- 来自: 南京
最新评论
-
feihumingyue:
nice 写的很好
iBaits中SqlMapClientTemplate的使用 -
isy:
谢谢分享!
中文搜索引擎coreseek安装测试
Velocity 和 FreeMarker 是两种模板语言,都可以做为view层技术在Spring MVC 应用中使用。它们的语言风格和适用对象都很相似,这里把它们放在一起讨论。至于它们语义和语法上的不同,可以参考 FreeMarker 站点。
使用Velocity或FreeMarker需要包含 velocity-1.x.x.jar
或 freemarker-2.x.jar
。另外Velocity还需要 commons-collections.jar
。一般把这些jar包放在 WEB-INF/lib
下,这样可以保证J2EE Server找到它们并加到web应用的classpath下。这里同样假设你的 'WEB-INF/lib'
目录下已有 spring.jar
!Spring的发布包中已经提供了最新的稳定版本的Velocity、FreeMarker和commons collections,可以从相应的/lib/
子目录下得到。如果你想在Velocity中使用Spring的dateToolAttribute或numberToolAttribute,那你还需要 velocity-tools-generic-1.x.jar
。
通过在'*-servlet.xml'
中增加相关的配置bean,可以初始化相应的配置,如下:
<!-- 该bean使用一个存放模板文件的根路径来配置Velocity环境。你也可以通过指定一个属性文件来更精细地控制Velocity,但对基于文件的模板载入来说,默认的方式已相当健全 --> <bean id="velocityConfig" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer"> <property name="resourceLoaderPath" value="/WEB-INF/velocity/"/> </bean> <!-- 也可以把ResourceBundle或XML文件配置到视图解析器中。如果你需要根据Locale来解析不同的视图,你就得使用resource bundle解析器。 --> <bean id="viewResolver" class="org.springframework.web.servlet.view.velocity.VelocityViewResolver"> <property name="cache" value="true"/> <property name="prefix" value=""/> <property name="suffix" value=".vm"/> <!-- 如果你需要使用Spring 对 Velocity宏命令的支持, 将这个属性设为true --> <property name="exposeSpringMacroHelpers" value="true"/> </bean>
<!-- freemarker config --> <bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> <property name="templateLoaderPath" value="/WEB-INF/freemarker/"/> </bean> <!-- 也可以把ResourceBundle或XML文件配置到视图解析器中。如果你需要根据Locale来解析不同的视图,你就得使用resource bundle解析器。. --> <bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver"> <property name="cache" value="true"/> <property name="prefix" value=""/> <property name="suffix" value=".ftl"/> <!-- 如果你需要使用Spring 对 FreeMarker 宏命令的支持, 将这个属性设为true --> <property name="exposeSpringMacroHelpers" value="true"/> </bean>
注意
对于非web应用,你需要在application context的配置文件中声明 VelocityConfigurationFactoryBean
或者 FreeMarkerConfigurationFactoryBean
。
模板文件需要存放在配置 *Configurer
bean时所指定的目录下,就像上面的例子所示。这里不准备详细叙述使用这两种语言创建模板的细节,你可以参考相应的站点获取那些信息。如果你用了我们推荐的视图解析器,你会发现从逻辑视图名到相应模板文件的映射方式与使用 InternalResourceViewResolver
处理JSP时的映射方式类似。比如若你的控制器返回了ModelAndView对象,其中包含一个叫做"welcome"的视图名,则视图解析器将试图查找 /WEB-INF/freemarker/welcome.ftl
或 /WEB-INF/velocity/welcome.vm
。
以上着重介绍的基本配置适合大部分应用需求,然而仍然有一些不常见的或高级需求的情况,Spring提供了另外的配置选项来满足这种需求。
这个文件是可选的,不过一旦指定,其所包含的值即影响Velocity运行时状态。只有当你要做一些高级配置时才需要这个文件,这时你可以在上面定义的 VelocityConfigurer
中指定它的位置。
<bean id="velocityConfig" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer"> <property name="configLocation value="/WEB-INF/velocity.properties"/> </bean>
另一种方法,你可以直接在Velocity config bean的定义中指定velocity属性,来取代"configLocation"属性。
<bean id="velocityConfig" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer"> <property name="velocityProperties"> <props> <prop key="resource.loader">file</prop> <prop key="file.resource.loader.class"> org.apache.velocity.runtime.resource.loader.FileResourceLoader </prop> <prop key="file.resource.loader.path">${webapp.root}/WEB-INF/velocity</prop> <prop key="file.resource.loader.cache">false</prop> </props> </property> </bean>
关于Spring中Velocity的配置请参考 API文档
,或者参考Velocity自身文档中的例子和定义来了解如何配置 'velocity.properties'
。
FreeMarker的'Settings'和'SharedVariables'配置可以通过直接设置 FreeMarkerConfigurer
的相应属性来传递给Spring管理的FreeMarker Configuration
对象,其中 freemarkerSettings
属性需要一个 java.util.Properties
类型对象,freemarkerVariables
需要一个 java.util.Map
类型对象。
<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> <property name="templateLoaderPath" value="/WEB-INF/freemarker/"/> <property name="freemarkerVariables"> <map> <entry key="xml_escape" value-ref="fmXmlEscape"/> </map> </property> </bean> <bean id="fmXmlEscape" class="freemarker.template.utility.XmlEscape"/>
关于settings和variables如何影响 Configuration
对象的细节信息,请参考FreeMarker的文档。
Spring提供了一个在JSP中使用的标签库,其中包含一个 <spring:bind/>
标签,它主要用来在表单中显示支持对象(译者注:即表单数据传输对象)的数据,并在一个 Validator
(工作在Web层或业务逻辑层)校验失败时显示失败信息。从1.1版本开始,Spring为Velocity和FreeMarker也提供了同样的功能,而且还另外提供了便于使用的宏,用来生成表单输入元素。
spring.jar
文件为这两种语言维护了一套标准宏,对于正确配置的应用,它们总是可用的,前提是你将VelocityView
bean 或者 FreeMarkerView
bean 的 exposeSpringMacroHelpers
属性设为'true'
。其实还有更方便的方法,如果你恰好在使用 VelocityViewResolver
或 FreeMarkerViewResolver
,你也可以设置它们的这个属性,这样你的视图都会继承这个值。注意,对任何HTML表单处理方面的问题来说,这个属性是 不必要
的,除非
你确定需要Spring宏提供的好处。下面是一份view.properties文件的例子,其中展示了对这两种语言都适用的正确配置。
personFormV.class=org.springframework.web.servlet.view.velocity.VelocityView personFormV.url=personForm.vm personFormV.exposeSpringMacroHelpers=true
personFormF.class=org.springframework.web.servlet.view.freemarker.FreeMarkerView personFormF.url=personForm.ftl personFormF.exposeSpringMacroHelpers=true
下面是一个完整的Spring Web MVC 配置文件。通过这个配置,每个Velocity视图都可以调用标准的 Velocity宏命令。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans>
<bean name="helloController" class="info.wilhelms.springwebapp.SampleController">
<property name="commandName" value="command"/>
<property name="commandClass" value="info.wilhelms.springwebapp.Message"/>
<property name="formView" value="foo"/>
<property name="successView" value="banjo"/>
<property name="bindOnNewForm" value="true"/>
<property name="sessionForm" value="true"/>
</bean>
<bean id="velocityConfig"
class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
<property name="resourceLoaderPath" value="/WEB-INF/velocity/"/>
</bean>
<bean id="viewResolver" class="org.springframework.web.servlet.view.velocity.VelocityViewResolver">
<property name="cache" value="false"/>
<property name="prefix" value=""/>
<property name="suffix" value=".vm"/>
<property name="exposeSpringMacroHelpers" value="true"/>
</bean>
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<value>
**/hello.htm=helloController
</value>
</property>
</bean>
</beans>
Spring 库中定义的一些宏被认为是内部的(私有的),但宏定义中没有这种限制范围的方式,这使得对调用代码和用户模板来说,所有的宏都是可见的。下面的内容集中于供用户模板直接调用的宏。如果你希望看看宏定义的代码,可以分别参考 org.springframework.web.servlet.view.velocity
包中的spring.vm文件和 org.springframework.web.servlet.view.freemarker
包中的spring.ftl文件。
在扮演Spring表单控制器对应视图的html表单(或vm/ftl模板)里,你可以模仿下面的代码来绑定表单数据并显示错误信息(和JSP的形
式非常相似)。注意默认情况下命令对象的名字是"command",你可以在配置自己的表单控制器时通过设置'commandName'属性来覆盖默认
值。例子代码如下(其中的 personFormV
和 personFormF
是前面定义的视图):
<!-- velocity宏自动可用 --> <html> ... <form action="" method="POST"> Name: #springBind( "command.name" ) <input type="text" name="${status.expression}" value="$!status.value" /><br> #foreach($error in $status.errorMessages) <b>$error</b> <br> #end <br> ... <input type="submit" value="submit"/> </form> ... </html>
<!-- FreeMarker宏必须导入到一个名称空间,这里推荐你定义为'spring'空间 --> <#import "spring.ftl" as spring /> <html> ... <form action="" method="POST"> Name: <@spring.bind "command.name" /> <input type="text" name="${spring.status.expression}" value="${spring.status.value?default("")}" /><br> <#list spring.status.errorMessages as error> <b>${error}</b> <br> </#list> <br> ... <input type="submit" value="submit"/> </form> ... </html>
#springBind
/ <@spring.bind>
需要一个'path'属性,格式为命令对象的名字(默认值为'command',除非你在配置FormController的属性时改变它)后跟圆点再加
上你希望绑定到的命令对象的属性名。你也可以使用类似"command.address.street"的格式来处理嵌套对象。使用 bind
宏时,HTML转码行为由web.xml中名为 defaultHtmlEscape
的ServletContext参数指定。
上述宏的另一种可选形式是 #springBindEscaped
/ <@spring.bindEscaped>
,它另外接受一个布尔型参数,显式指定了输出值或错误信息这些状态信息时是否使用HTML转码。附加的表单处理宏简化了HTML转码的使用,只要有可能,你就应该使用它们。关于它们的细节将在下节讲述。
为这两种语言附加的一些很方便的宏同时简化了表单绑定和表单生成(包括显示校验错误信息)。不需要使用这些宏来生成表单输入域,它们可以被混杂并匹配到简单HTML,或者直接调用前面讲过的spring绑定宏。
下表展示了可用的宏的VTL定义和FTL定义,以及它们需要的参数。
宏定义表
message (输出一个根据code参数选择的资源绑定字符串) |
#springMessage($code)
|
<@spring.message code/>
|
messageText (输出一个根据code参数选择的资源绑定字符串,找不到的话输出default参数的值) |
#springMessageText($code $text)
|
<@spring.messageText code, text/>
|
url (在URL相对路径前面添加应用上下文根路径application context root) |
#springUrl($relativeUrl)
|
<@spring.url relativeUrl/>
|
formInput (标准表单输入域) |
#springFormInput($path $attributes)
|
<@spring.formInput path, attributes, fieldType/>
|
formHiddenInput * (表单隐藏输入域) |
#springFormHiddenInput($path $attributes)
|
<@spring.formHiddenInput path, attributes/>
|
formPasswordInput *(标准表单密码输入域;注意不会为这种类型的输入域装配数据) |
#springFormPasswordInput($path $attributes)
|
<@spring.formPasswordInput path, attributes/>
|
formTextarea (大型文本(自由格式)输入域) |
#springFormTextarea($path $attributes)
|
<@spring.formTextarea path, attributes/>
|
formSingleSelect (单选列表框) |
#springFormSingleSelect( $path $options $attributes)
|
<@spring.formSingleSelect path, options, attributes/>
|
formMultiSelect (多选列表框) |
#springFormMultiSelect($path $options $attributes)
|
<@spring.formMultiSelect path, options, attributes/>
|
formRadioButtons (单选框) |
#springFormRadioButtons($path $options $separator $attributes)
|
<@spring.formRadioButtons path, options separator, attributes/>
|
formCheckboxes (复选框) |
#springFormCheckboxes($path $options $separator $attributes)
|
<@spring.formCheckboxes path, options, separator, attributes/>
|
showErrors (简化针对所绑定输入域的校验错误信息输出) |
#springShowErrors($separator $classOrStyle)
|
<@spring.showErrors separator, classOrStyle/>
|
* 在FTL(FreeMarker)中,这二种宏实际上并不是必需的,因为你可以使用普通的 formInput
宏,指定fieldType
参数的值为 'hidden
' 或 'password
'即可 。
上面列出的所有宏的参数都具有一致的含义,如下述:
-
path:待绑定属性的名字(如:command.name)
-
选项:一个Map,其中保存了所有可从输入域中选择的值。map中的键值(keys)代表将从表单绑定到命令对象然后提交到后台的实值 (values)。存储在Map中的与相应键值对应的对象就是那些在表单上显示给用户的标签,它们可能与提交到后台的值不同。通常这样的map由控制器以 引用数据的方式提供。你可以根据需求的行为选择一种Map实现。比如对顺序要求严格时,可使用一个
SortedMap
,如一个TreeMap
加上适当的Comparator;对要求按插入顺序返回的情况,可以使用commons-collections提供的LinkedHashMap
或LinkedMap
。 -
分隔符:当使用多选的时候(radio buttons 或者 checkboxes),用于在列表中分隔彼此的字符序列(如 "<br>")。
-
属性:一个附加的以任意标签或文本构成的字符串,出现在HTML标签内。该字符串被宏照原样输出。例如:在一个textarea标签内你可 能会提供'rows="5" cols="60"'这样的属性,或者你会传递'style="border:1px solid silver"'这样的样式信息。
-
classOrStyle:供showErrors宏用来以这种样式显示错误信息,其中错误信息嵌套于使用该CSS类名的span标签内。如果不提供或内容为空,则错误信息嵌套于<b></b>标签内。
宏的例子在下面描述,其中一些是FTL的,一些是VTL的。两种语言之间的用法差别在旁注中解释。
<!-- 上面提到的Name域的例子,使用VTL中定义的表单宏 --> ... Name: #springFormInput("command.name" "")<br> #springShowErrors("<br>" "")<br>
formInput宏接受一个path参数(command.name)和一个附加的属性参数(在上例中为空)。该宏与所有其他表单生成宏一样,对 path参数代表的属性实施一种隐式绑定,这种绑定保持有效状态直到一次新的绑定开始,所以showErrors宏不再需要传递path参数——它简单地 操作最近一次绑定的属性(field)。
showErrors宏接受两个参数:分隔符(用于分隔多条错误信息的字符串)和CSS类名或样式属性。注意在FreeMarker中可以为属性参数指定默认值(这点儿Velocity做不到)。上面的两个宏调用在FTL中可以这么表达:
<@spring.formInput "command.name"/> <@spring.showErrors "<br>"/>
上面展示的用于生成name表单输入域的代码片断产生的输出如下,同时还显示了输入值为空的情况下提交表单后产生的校验错误信息(校验过程由Spring的验证框架提供)。
生成的HTML如下:
Name: <input type="text" name="name" value="" > <br> <b>required</b> <br> <br>
参数(属性)用来向textarea传递样式信息或行列数属性。
有四种用于在HTML表单中生成通用选择输入框的宏。
-
formSingleSelect
-
formMultiSelect
-
formRadioButtons
-
formCheckboxes
每个宏都将接受一个由选项值和选项标签的集合构成的Map,其中选项值和其标签可以相同。
下面展示了一个在FTL中使用radio按钮的例子。表单支撑对象(form backing object)提供了一个默认值'London',所以该域不需要校验。当渲染表单时,整个待展现的城市列表由模型对象的'cityMap'属性以引用数据的方式提供。
... Town: <@spring.formRadioButtons "command.address.town", cityMap, "" /><br><br>
这将产生一行radio按钮——cityMap
中
一个值对应一个按钮,并以""分隔。没有额外的属性,因为宏的最后一个参数不存在。cityMap中所有的key-value都使用String类型值。
map中的key用作输入域的值(将被作为请求参数值提交到后台),value用作显示给用户的标签。上述示例中,表单支撑对象提供了一个默认值以及三个
著名城市作为可选值,它产生的HTML代码如下:
Town: <input type="radio" name="address.town" value="London"> London <input type="radio" name="address.town" value="Paris" checked="checked"> Paris <input type="radio" name="address.town" value="New York"> New York
如果你希望在应用中按照内部代码来处理城市,你得以适当的键值创建map,如下:
protected Map referenceData(HttpServletRequest request) throws Exception { Map cityMap = new LinkedHashMap(); cityMap.put("LDN", "London"); cityMap.put("PRS", "Paris"); cityMap.put("NYC", "New York"); Map m = new HashMap(); m.put("cityMap", cityMap); return m; }
现在上述代码将产生出以相关代码为值的radio按钮,同时你的用户仍能看到对他们显示友好的城市名。
Town: <input type="radio" name="address.town" value="LDN"> London <input type="radio" name="address.town" value="PRS" checked="checked"> Paris <input type="radio" name="address.town" value="NYC"> New York
缺省情况下使用上面这些宏将产生符合HTML 4.01标准的标签,并且Spring的绑定支持使用web.xml中定义的HTML转码行为。为了产生符合XHTML标准的标签以及覆盖默认的HTML 转码行为,你可以在你的模板(或者模板可见的模型对象)中指定两个变量。在模板中指定的好处是稍后的模板处理中可以为表单中不同的域指定不同的行为。
要切换到符合XHTML的输出,你可以设置model/context变量xhtmlCompliant的值为true:
## for Velocity.. #set($springXhtmlCompliant = true) <#-- for FreeMarker --> <#assign xhtmlCompliant = true in spring>
在进行完这些处理之后,由Spring宏产生的所有标签都符合XHTML标准了。
类似地,可以为每个输入域指定HTML转码行为:
<#-- 该句覆盖默认HTML转码行为 --> <#assign htmlEscape = true in spring> <#-- next field will use HTML escaping --> <@spring.formInput "command.name" /> <#assign htmlEscape = false in spring> <#-- all future fields will be bound with HTML escaping off -->
相关推荐
以上是对Velocity和FreeMarker的基本介绍和比较,它们都是Java Web开发中的重要工具,理解它们的特性和应用场景有助于选择最适合项目的技术栈。对于标签“源码”和“工具”,我们可以进一步研究这两个模板引擎的源...
首先,你需要在项目中引入Spring MVC和Velocity的相关库。这通常是在pom.xml文件中添加Maven依赖,或者在Gradle中添加对应的依赖项。 **3.2 配置Spring MVC** 在Spring MVC的配置文件(如`spring-mvc.xml`)中,你...
Spring MVC是Spring框架的一个模块,专为构建Web应用程序而设计,以其灵活性、高效性和可扩展性受到广大开发者的青睐。下面我们将详细探讨Spring MVC的核心概念和技术点。 1. **Spring MVC架构** Spring MVC采用...
【Spring3.0 MVC框架简介】 Spring3.0 MVC是Spring框架的重要组成部分,专注于构建高性能、健壮...通过这些教程,开发者可以全面了解和掌握Spring 3.0 MVC框架,从而在实际项目中灵活运用,构建出高效、可靠的Web应用。
Spring MVC 是一个基于Java的轻量级Web应用框架,它属于Spring框架的一部分,主要用于构建控制器层,实现模型-视图-控制器...在实际项目中,结合Spring Boot和其他Spring生态组件,可以进一步提升开发效率和应用质量。
9. **Tiles, FreeMarker, Velocity**: Spring MVC支持多种视图技术,如JSP、Thymeleaf、FreeMarker等,这些技术可以方便地构建动态网页。 10. **RESTful风格的支持**: Spring MVC通过@RequestMapping支持RESTful ...
Spring MVC是Spring框架的一个核心模块,专门用于处理Web应用程序的请求和响应。Spring MVC4.1.6版本是在2015年发布的,它在前一个版本的基础上进行了一系列的优化和增强,旨在提供更高效、更灵活的Web开发体验。 ...
4. **View Resolver**:Spring MVC支持多种视图技术,如JSP、Velocity、FreeMarker和XSLT等。View Resolver负责根据Controller返回的逻辑视图名解析成实际的视图。这使得开发者可以灵活地选择适合项目需求的视图技术...
包含国际化、标签、Theme、视图展现的FreeMarker、JasperReports、Tiles、Velocity、XSLT相关类。 当然,如果你的应用使用了独立的MVC框架,则无需这个JAR文件里的任何类。(例如: org.springframework.web....
在Spring的高级特性中,Web应用与MVC模式是紧密相关的,Spring MVC为开发者提供了指南,它不仅仅支持传统的JSP和Servlet技术,还包括了基于模板的Web表示层技术,如FreeMarker、Velocity、Thymeleaf等,这些技术可以...
Spring MVC允许使用不同的View实现,例如JSP、Velocity、Freemarker、XSLT等。ViewResolver是Spring MVC中负责将逻辑视图名称解析为物理视图的组件。 在使用Spring MVC框架时,需要按照以下步骤进行: 1. 在web....
5. **Spring 3 MVC的国际化与本地化教程**:在开发多语言应用时,这部分将演示如何在Spring MVC中设置和使用国际化资源,以适应不同地区的用户需求。 6. **Spring 3 MVC主题教程**:Spring MVC支持主题概念,允许你...
书中内容从Spring框架的基础知识讲起,逐步深入到Spring MVC的各个特性,包括如何使用注解和XML配置来开发MVC应用程序,如何处理数据绑定和验证,以及如何利用转换器和格式化器来优化数据处理。通过本书的学习,读者...
Spring MVC 详解 Spring MVC 是一个基于 Java 的 Web 应用程序框架,基于模型-视图-...通过 DispatcherServlet、控制器、视图、模型和服务等核心组件,Spring MVC 能够提供一个完整的解决方案来开发 Web 应用程序。
通过策略接口,Spring MVC 具有高度可配置性,支持多种视图技术,如 JSP、Velocity、Tiles、iText 和 POI。 Spring MVC 的主要组成部分包括控制器、模型对象、分派器和处理程序对象,这些组件的职责明确,易于定制...
Spring MVC 支持多种视图技术,如 JSP、Freemarker、Velocity 和 Thymeleaf 等。视图通常包含动态占位符,如 `${name}`,它们会在渲染时被 Model 中的数据替换。 8. **HandlerMapping**:处理器映射器根据请求 URL ...
Spring MVC提供了全局和局部的异常处理器,如@ControllerAdvice和@ExceptionHandler,可以统一处理程序中的异常。同时,通过消息源(MessageSource)实现国际化,使应用能够根据用户选择的语言显示不同的文本。 八...
在Spring MVC中,常见的视图技术有JSP、Velocity、Thymeleaf等。 7. **HandlerMapping**:处理器映射器,根据请求URL找到对应的Controller方法。 8. **HandlerAdapter**:处理器适配器,使得Spring MVC可以调用...
Spring MVC 可以与多种模板引擎(如FreeMarker、Thymeleaf、Velocity等)配合,生成动态HTML页面。 10. **单元测试**: 利用Spring Test和MockMVC,可以方便地对Spring MVC应用进行单元测试和集成测试。 通过这...
在Spring MVC中,控制器是应用程序的核心组件。控制器负责处理用户请求,并将结果返回给用户。控制器可以使用注解来指定请求映射,例如: ```java @Controller @RequestMapping("/user") public class ...