模板工具(二)——VelocityTools

         应该算是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>" )
#end
Here we use a custom tool: $toytool.message
$br
Here 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 directory
tools.view.servlet.error.template = Error.vm

# Directory for layout templates,
#  relative to web application root directory
tools.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 an Ant Task

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

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

 

你可能感兴趣的:(session,velocity,layout,application,工具,escaping)