模板工具(二)——VelocityTools

来源:互联网 发布:手机淘宝无线端链接 编辑:程序博客网 时间:2024/06/05 17:48

         应该算是Velocity的扩展,为了Velocity更好用。包括GenericTools  VelocityView  VelocityStruts三个子项目,其中VelocityStruts是为了与struts整合服务,此处不介绍。

GenericTools

j2se提供tools使用,具体tools如下:

         DateTool:  Date操作:格式化、比较等

         EscapeTool:对template进行escaping

         IteratorTool:更好地控制 #foreach loop

         ListTool:透明地处理arraylist

         MathTool:数学运算

         NumberTool:对数字格式化和convert

         RenderTool:对VTL的字符串执行 eval

         ResourceTool:国际化支持

         SortTool:对collections array iterator进行排序

         XMLTool:对xml文件读取,需要dom4j的支持

VelocityView

         使用velocity快速且干净地构建应用程序,可以编写独立于特定技术的前台程序

         包含GenericTool,以及为J2EE扩展的tool;

         VelocityViewServlet  VelocityLayoutServlet  VelocityViewTag(嵌入velocityjsp)  Maven plugin

VelocityViewServlet

         就是一个servlet,用于向vm文件的context中插入 request  response context对象。

简单示例

1.       编写vm文件作为页面

<html><body>I'm a velocity template.#if( $XHTML )  #set( $br = "<br />" )#else  #set( $br = "<br>" )#endHere we use a custom tool: $toytool.message$brHere we get the date from the DateTool:  $date.medium</body></html>


 

2.       Toolbox.xml

被自动加载到velocitycontext

<tools>    <data type="boolean" key="xhtml" value="true"/>    <data type="boolean" key="isSimple" value="true"/>    <data type="number" key="version" value="2.0"/>    <data key="foo">this is foo</data>    <data key="bar">this is bar.</data>    <toolbox scope="request">        <tool key="toytool" class="ToyTool" restrictTo="index*"/>    </toolbox>    <toolbox scope="session">        <tool key="map" class="java.util.HashMap"/>    </toolbox></tools>

   data用来定义常量, tool获取sessionrequest中的数据

3.       配置web.xml文件

<!-- Define Velocity template compiler --><servlet>  <servlet-name>velocity</servlet-name>  <servlet-class>    org.apache.velocity.tools.view.servlet.VelocityViewServlet  </servlet-class>  <!--     Unless you plan to put your toolbox.xml and velocity.properties    under different folders or give them different names, then these    two init-params are unnecessary as of VelocityTools 1.3.  The    VelocityViewServlet will automatically look for these files in    the following locations.  -->  <init-param>    <param-name>org.apache.velocity.toolbox</param-name>    <param-value>/WEB-INF/toolbox.xml</param-value>  </init-param>  <init-param>    <param-name>org.apache.velocity.properties</param-name>    <param-value>/WEB-INF/velocity.properties</param-value>  </init-param></servlet><!-- Map *.vm files to Velocity --><servlet-mapping>  <servlet-name>velocity</servlet-name>  <url-pattern>*.vm</url-pattern></servlet-mapping>


4.       访问页面

        http://localhost:8080/simple/index.vm

Toolbox

         定义request session application范围的变量或常量数据,可以调用该变量的方法,使用方法如下:

PipeWrench.java

public class PipeWrench {  public String getSize() {return "Large Pipe Wrench!";  }} 


ToolBox.xml

<?xml version="1.0"?><toolbox>  <tool>     <key>wrench</key>     <scope>request</scope>     <request-path>/catalog/*</request-path>     <class>PipeWrench</class>  </tool></toolbox>


 

Tool Scope

         支持request  session  application三种scope,用过flex的人应该很熟悉了,application在系统启动时实例化。 Session在每个会话开始时实例化,request为每个请求

         如果tool实现 ViewTool接口,可在init函数中接收到 context对象。

Request-path

         限制哪个path下的内容可以访问,只支持request

Parameter

         可以像tool中传入参数,需要tool定义public void configure(java.util.Map params)方法

Data

         定义 strings, booleans, and numbers

<?xml version="1.0"?><toolbox>  <data type="number">     <key>app_version</key>     <value>0.9</value>  </data>  <data type="string">     <key>app_name</key>     <value>Jon's Tool Shop</value>  </data>  <data type="boolean">     <key>debug</key>     <value>true</value>  </data></toolbox>


 

    在vm$app_version 访问

 

Tools

         AbstractSearchTool:进行查询和分页,需要实现executeQuery方法

         PagerTool:基于request的分页

         BrowserTool:获取客户端的浏览器、操作系统等相关信息

         CookieToolCookie的控制

         LinkTool:格式化和组装超链接,获取url的相对和绝对路径

ImportTool:以字符串方式导入 url指定的文件

ViewRenderTool:使用当前context执行带VTL的字符串,并以字符串形式返回结果

VelocityLayoutServlet

         VelocityViewServlet的子类,提供了layouterror的支持,特性如下:

1.       修改web.xml VelocityViewServlet替换为VelocityLayoutServlet

2.       定义了layou vm

3.       使用content vmlayout vm组合生成页面,在layout vm中,使用$screen_context引用content vm

4.       可选定义 “error” template显示错误

配置

在velocity.properties 中配置# Filepath for error template,#  relative to web application root directorytools.view.servlet.error.template = Error.vm# Directory for layout templates,#  relative to web application root directorytools.view.servlet.layout.directory = layout/# Filepath of the default layout template#  relative to the layout directory#  NOT relative to the root directory of the webapp!tools.view.servlet.layout.default.template =  Default.vm


 

动态切换Layout

      url参数中传入  layout=OtherLayout.vm

      在内容页面vm中定义  #set($layout=”OtherLayout.vm”)

Error Screen

      对未捕获的异常和错误处理,有两个变量 $error_cause$stack_trace,可以在$error_screen中输出错误信息

Escaping HTML

    通过实现 ReferenceInsertionEventHandler 对引用做字符转义,在velocity.properties中配置:

   eventhandler.referenceinsertion.class = org.apache.velocity.app.event.implement.EscapeHtmlReference

   eventhandler.escape.html.match = /msg.*/

 

VelocityViewTag

         是一个jsp tag,允许在jsp中使用velocityvelocity tools,在jsp中使用如下:

       <%@taglib prefix="velocity" uri="http://velocity.apache.org/velocity-view" %> <velocity:view template="foo.vm"/>

其他工具

        Anakia 是一个用XSLXML中输出视图的例

        Texen:用于产生任意文本的工具,It is capable of producing almost any sort of text output. Driven by Ant, essentially anAnt Task

         DocBook Framework:创建适合于online查看和打印的文本,如PDFHTML

         DVSL:类似于XSLT,完成xml文件的转换

 

原创粉丝点击