`
Ben.Sin
  • 浏览: 234242 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

【转】Spring 结合velociy/freemaker的相关配置

阅读更多

Spring Framework开发参考: 14.4. Velocity和 FreeMarker

VelocityFreeMarker 是两种模板语言,都可以做为view层技术在Spring MVC 应用中使用。 它们的语言风格和适用对象都很相似,这里把它们放在一起讨论。至于它们语义和语法上的不同,可以参考 FreeMarker 站点。

14.4.1. 需要的资源

 

使用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

 

14.4.2. Context 配置

 

通过在 '*-servlet.xml' 中增加相关的配置bean,可以初始化相应的配置,如下:

    
     <!--
     该bean使用一个存放模板文件的根路径来配置Velocity环境。你也可以通过指定一个属性文件来更精细地控制Velocity,但对基于文件的模板载入来说,默认的方式已相当健全
     -->
    

    
<bean id="velocityConfig">
  <property name="resourceLoaderPath" value="/WEB-INF/velocity/"/>
</bean>

     <!--
     也可以把ResourceBundle或XML文件配置到视图解析器中。如果你需要根据Locale来解析不同的视图,就需要使用resource bundle解析器。
     -->


    
<bean id="viewResolver">
  <property name="cache" value="true"/>
  <property name="prefix" value=""/>
  <property name="suffix" value=".vm"/>
</bean>
    
     <!-- freemarker config -->
    

    
<bean id="freemarkerConfig">
  <property name="templateLoaderPath" value="/WEB-INF/freemarker/"/>
</bean>

     <!--
     也可以把ResourceBundle或XML文件配置到视图解析器中。如果你需要根据Locale来解析不同的视图,就需要使用resource bundle解析器。
     -->


    
<bean id="viewResolver">
  <property name="cache" value="true"/>
  <property name="prefix" value=""/>
  <property name="suffix" value=".ftl"/>
</bean>

注意

对于非web应用,你需要在application context的配置文件中声明 VelocityConfigurationFactoryBean 或者 FreeMarkerConfigurationFactoryBean


14.4.3. 创建模板

 

模板文件需要存放在配置*Configurer bean时所指定的目录下,就像上面的例子所示。 这里不准备详细叙述使用这两种语言创建模板的细节,你可以参考相应的站点获取那些信息。 如果你用了我们推荐的视图解析器,你会发现从逻辑视图名到相应模板文件的映射方式与使用 InternalResourceViewResolver 处理JSP时的映射方式类似。比如若你的控制器返回了ModelAndView对象,其中包含一个叫做“welcome”的视图名,则视图解析器将试图查 找 /WEB-INF/freemarker/welcome.ftl/WEB-INF/velocity/welcome.vm 作为合适的模板。

 

14.4.4. 高级配置

 

以上着重介绍的基本配置适合大部分应用需求,然而仍然有一些不常见的或高级需求的情况,Spring提供了另外的配置选项来满足这种需求。

14.4.4.1. velocity.properties

 

这个文件是可选的,不过一旦指定,其所包含的值即影响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">
  <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' 文件。

 

14.4.4.2. FreeMarker

 

FreeMarker的'Settings'和'SharedVariables'配置可以通过直接设置 FreeMarkerConfigurer 的相应属性来传递给Spring管理的FreeMarker Configuration 对象,其中 freemarkerSettings 属性需要一个java.util.Properties 类型对象, freemarkerVariables 需要一个 java.util.Map 类型对象。

<bean id="freemarkerConfig">
  <property name="templateLoaderPath" value="/WEB-INF/freemarker/"/>
  <property name="freemarkerVariables">
    <map>
      <entry key="xml_escape" value-ref="fmXmlEscape"/>
    </map>
  </property>
</bean>
<bean id="fmXmlEscape"/>

关于settings和variables如何影响 Configuration 对象的细节信息,请参考FreeMarker的文档。


14.4.5. 绑定支持和表单处理

 

Spring提供了一个在JSP中使用的标签库,其中包含一个 <spring:bind/> 标签,它主要用来在表单中显示支持对象(译者注:即表单数据传输对象)的数据,并在一个 Validator (工作在Web层或业务逻辑层)校验失败时显示失败信息。 从1.1版本开始,Spring为Velocity和FreeMarker也提供了同样的功能,而且还另外提供了便于使用的宏,用来生成表单输入元素。

14.4.5.1. 用于绑定的宏

 

spring.jar 文件为这两种语言维护了一套标准宏,对于正确配置的应用,它们总是可用的。

在Spring库中定义的一些宏被认为是内部的(私有的),但当宏定义中不存在这样的范围界定时, 会使得所有的宏均是可见的,能够任意调用代码和用户模板。下面的一节将集中讨论模板中可以直接调用的宏。 如果希望直接查看宏的代码,它们分别是 org.springframework.web.servlet.view.velocity 包中的spring.vm文件和 org.springframework.web.servlet.view.freemarker 包中的spring.ftl文件。

 

14.4.5.2. 简单绑定

 

在扮演Spring表单控制器对应视图的html表单(或vm/ftl模板)里, 你可以模仿下面的代码来绑定表单数据并显示错误信息(和JSP的形式非常相似)。 注意默认情况下命令对象的名字是“command”,你可以在配置自己的表单控制器时通过设置'commandName'属性来覆盖默认值。 例子代码如下(其中的personFormVpersonFormF 是前面定义的视图):

     <!-- 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转码的使用,只要有可能,你就应该使用它们。关于它们的细节将在下节讲述。

 

14.4.5.3. 表单输入生成宏

 

为这两种语言附加的一些很方便的宏同时简化了表单绑定和表单生成(包括显示校验错误信息)。 不需要使用这些宏来生成表单输入域,它们可以被混杂并匹配到简单HTML,或者直接调用前面讲过的spring绑定宏。

下表展示了可用的宏的VTL定义和FTL定义,以及它们需要的参数。

表 14.1. 宏定义表

macro VTL definition FTL definition
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提供的 LinkedHashMapLinkedMap

  • 分隔符:当使用多选的时候(radio buttons 或者 checkboxes),用于在列表中分隔彼此的字符序列(如 "<br>")。

  • 属性:一个附加的以任意标签或文本构成的字符串,出现在HTML标签内。该字符串被宏照原样输出。例如:在一个textarea标签内你可能会提供 'rows="5" cols="60"'这样的属性,或者你会传递'style="border:1px solid silver"'这样的样式信息。

  • classOrStyle:供showErrors宏用来以这种样式显示错误信息,其中错误信息嵌套于使用该CSS类名的span标签内。如果不提供或内 容为空,则错误信息嵌套于<b></b>标签内。

 

宏的例子在下面描述,其中一些是FTL的,一些是VTL的。两种语言之间的用法差别在旁注中解释。

14.4.5.3.1. 输入域

 

 

       <!-- 上面提到的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传递样式信息或行列数属性。

 

14.4.5.3.2. 选择输入域

 

有四种用于在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="spring.framework.ecked"> 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="spring.framework.ecked"> Paris <input
      type="radio" name="address.town" value="NYC">
      New York
     


14.4.5.4. 重载HTML转码行为并使你的标签符合XHTML

 

缺省情况下使用上面这些宏将产生符合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开发必备(中文指南+精通Velociy)

    5. **与其他框架的集成**:展示了Velocity如何与Spring、Struts等Java Web框架协同工作,以及在非Web环境中如邮件生成、XML处理的应用。 6. **社区与资源**:提供了Velocity社区的信息,包括邮件列表、文档和API,...

    javaWeb应用开发之velocity模板使用

    velociy模板引擎介绍,使用example,demo。开发教程。

    分子动力学模拟方法概述

    Gear算法可以处理非线性常微分方程,Velociy-Verlet算法则可以同时得到粒子的位置、速度与加速度,保持计算精度的同时提供了速度的显式表达式。 在分子动力学模拟中,还要考虑宏观可观测量的提取,如温度、压力、热...

    白色大气风格的建筑商业网站模板下载.rar

    白色大气风格的建筑商业网站模板下载.rar

    面向对象编程语言Objective-C基础语法详解及应用

    内容概要:本文详细介绍了面向对象编程语言Objective-C的基础语法,包括其历史背景、特点、环境搭建、基本语法、面向对象编程、高级特性和实际应用。具体涵盖的内容包括Objective-C的历史发展、面向对象编程的核心特性、变量和数据类型、控制结构、函数、数组和字典的使用,以及类、对象、属性和方法的定义与使用。此外,还介绍了高级特性如协议和委托、类别和扩展、ARC、块和GCD。最后,通过示例项目展示了如何在Xcode中创建和调试Objective-C程序,以及如何使用Cocoa和Cocoa Touch框架。 适合人群:具备一定的编程基础,希望学习或深入了解Objective-C编程的开发人员。 使用场景及目标:适用于需要开发macOS和iOS应用的开发者,帮助他们掌握Objective-C的基本语法和高级特性,提高编程效率和代码质量。 其他说明:本文不仅提供了详细的理论讲解,还通过实际代码示例展示了如何在Xcode中创建和调试Objective-C项目,适合初级到中级水平的开发人员学习和参考。

    球馆预约系统ssm.zip

    本次开发的微信小程球馆预约系统,有管理员,用户两个角色。管理员功能有个人中心,用户管理,场地类型管理,球馆信息管理,球馆预约管理,系统管理。用户可以在微信小程序上面注册登录,查看球馆信息,对球馆进行预约操作。 开发本程序后台用到了SSM开发技术,微信端用的是uni-app技术。数据库采用关系数据库市场占有率最高的MySQL作为本程序使用的数据库,完全符合程序使用并且有丰富的拓展余地。 用户在微信小程序注册登录后可以看到首页,首页可以搜索球馆名称,也可以查看球馆资讯,下面是导航栏。 用户点击球馆信息可以进行预约,预约需要输入相关时间等信息。 我的里面可以修改个人信息,可以退出,还可以查看球馆预约信息和我的收藏信息。

    STM32F030单片机串口2发送接收.zip

    1、嵌入式物联网单片机项目开发例程,简单、方便、好用,节省开发时间。 2、代码使用KEIL 标准库开发,当前在STM32F030C8T6运行,如果是STM32F030其他型号芯片,依然适用,请自行更改KEIL芯片型号以及FLASH容量即可。 3、软件下载时,请注意keil选择项是jlink还是stlink。 4、有偿指导v:wulianjishu666; 5、如果接入其他传感器,请查看账号发布的其他资料。 6、单片机与模块的接线,在代码当中均有定义,请自行对照。 7、若硬件有差异,请根据自身情况调整代码,程序仅供参考学习。 8、代码有注释说明,请耐心阅读。 9、编译时请注意提示,请选择合适的编译器版本。

    廖鹏盛 - 时代进行曲.zip

    廖鹏盛 - 时代进行曲.zip

    白色大气风格的人体艺术摄影网站模板下载.zip

    白色大气风格的人体艺术摄影网站模板下载.zip

    白色大气风格的服装设计师模板下载.zip

    白色大气风格的服装设计师模板下载.zip

    白色大气风格的景观设计HTML网站模板.zip

    白色大气风格的景观设计HTML网站模板.zip

    (176226648)机器学习领域,基于TensorFlow与mnist数据集,实现手写数字识别,手写数字识别,机器学习学习首选项目

    优质的机器学习资源是当今科技领域的热点,其中TensorFlow作为谷歌公司的开源库,成为最受欢迎的深度学习框架之一,广泛应用于各类项目中。TensorFlow提供了丰富的功能和灵活性,使得开发者可以轻松构建和训练复杂的神经网络模型,处理图像、文本和其他类型的数据。由于其开源性质,拥有庞大的社区支持,用户可以放心使用,并从开源社区中获取宝贵的经验和资源。 mnist数据集是机器学习领域的经典数据集之一。它包含着大量的手写数字图像,供开发者用来训练和测试各种算法和模型。这个数据集的规模相对较小,因此对于绝大多数人来说,无论是数据的下载还是训练过程,都不会对电脑性能提出过高的要求。这使得mnist成为了理想的入门数据集,适合初学者探索和理解机器学习算法的基本原理。 结合Pygame与TensorFlow,你将能够为机器学习实验创建出图形化界面,以及实现交互式处理。Pygame是一款面向游戏和多媒体应用的Python库,但同样也可以用于数据可视化和图形化交互。利用Pygame,你可以展示训练过程中的图像输出、模型的预测结果等,增强对机器学习算法运行情况的直观认识。而且,Pygame的简单。内

    基于两种坐标系的超螺旋滑模观测器的永磁同步电机pmsm无位置(速度)传感器控制模型 支持 dq旋转坐标系和静止坐标系建立smo 引入二阶滑模超螺旋算法替代一阶滑模 dq坐标系引入锁相环PLL估计转速及

    基于两种坐标系的超螺旋滑模观测器的永磁同步电机pmsm无位置(速度)传感器控制模型 支持 dq旋转坐标系和静止坐标系建立smo 引入二阶滑模超螺旋算法替代一阶滑模 dq坐标系引入锁相环PLL估计转速及转子位置 有效削弱抖振 赠送超螺旋滑模搭建推导文档及相关参考资料 仿真模型

    汇编实验算数运算程序设计.docx

    汇编实验算数运算程序设计.docx

    小区监控视频监控方案.doc

    小区监控视频监控方案.doc

    白色大气风格的HTML商务模板下载.zip

    白色大气风格的HTML商务模板下载.zip

    白色大气风格响应式运动健身瑜伽企业网站模板.zip

    白色大气风格响应式运动健身瑜伽企业网站模板.zip

    单片机实验仿真设计报告

    单片机实验仿真设计报告

    白色大气风格的设计公司整站网站模板下载.zip

    白色大气风格的设计公司整站网站模板下载.zip

    白色大气风格的html商务模板.zip

    白色大气风格的html商务模板.zip

Global site tag (gtag.js) - Google Analytics