velocity应用

     在前面http://freesea.iteye.com/admin/blogs/652707初学velocity中只是简单的了解了一下velocity,对于velocity的实际应用还需要多学习,今天有点时间,测式了一个简单的应用,由于没有深入理解,很容易健忘,在此备忘一下

 

 

今天主要是使用velocity-tools-view包对视图进行显示控制,这个包对于简化velocity的使用起到很大的作用。在使用之前当然还是到官网上去看一下,下载地址:http://velocity.apache.org/download.cgi#tools

 

下载解压后发现里面有个examples目录,直接把simple.war丢到tomcat的webapps目录下进行,看起来挺简单的,但是存在很多的疑问,为了能够更进一步了解,自己也依着做了一遍,真是受益匪浅。

 

一、web.xml

     在simple项目中,看了一下web.xml配置

 

<web-app>
  <servlet>
    <servlet-name>velocity</servlet-name>
    <servlet-class>org.apache.velocity.tools.view.servlet.VelocityViewServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>velocity</servlet-name>
    <url-pattern>*.vm</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.vm</welcome-file>
  </welcome-file-list>
</web-app>

 

 看起来跟正常的项目没什么区别,主要是把表现层改由vm的模板文件而已

 

二、ToyTool.java

 

public class ToyTool
{
    private String message = "Hello from ToyTool!";

	public String getMessage()
	{
        return message;
	}

    public void setMessage(String m)
    {
        message = m;
    }

    /** To test exception handling in templates. */
    public boolean whine() {
        throw new IllegalArgumentException();
    }

}

 

 

三、index.vm

I'm a velocity template.

#if( $XHTML )
  #set( $br = "<br />" )
#else
  #set( $br = "<br>" )
#end

$br
$br

Here we use a custom tool: $toytool.message

$br
$br

Lets count : #foreach($i in [1..5])$i #end

$br
$br

Let's play with a hashmap:$br
first add foo: $map.put("foo",$foo)$br
then add bar: $map.put("bar",$bar)$br
$br
and that gives us $map

$br
$br

Here we get the date from the DateTool:  $date.medium

$br
$br

#if( $isSimple )
This is simple#if( $XHTML ) xhtml#end app version ${version}.
#end

 四、toolbox.xml

 

<toolbox>
  <xhtml>true</xhtml>
  <tool>
     <key>toytool</key>
     <scope>request</scope>
     <request-path>index.vm</request-path>
     <class>ToyTool</class>
  </tool>
  <data type="number">
    <key>version</key>
    <value>1.1</value>
  </data>
  <data type="boolean">
    <key>isSimple</key>
    <value>true</value>
  </data>
  <data type="string">
    <key>foo</key>
    <value>this is foo.</value>
  </data>
  <data type="string">
    <key>bar</key>
    <value>this is bar.</value>
  </data>
  <tool>
    <key>map</key>
    <scope>session</scope>
    <class>java.util.HashMap</class>
  </tool>
  <tool>
    <key>date</key>
    <scope>application</scope>
    <class>org.apache.velocity.tools.generic.DateTool</class>
  </tool>
</toolbox>
 

 

看了这几个文件,由于是初学,有很多的疑问:

1、为什么不使用velocity.properties文件就能正确使用呢(在velocity初学http://freesea.iteye.com/admin/blogs/652707时是需要的)

 

2、在index.vm中有一个 $toytool.message,可以直接取出ToyTool类的属性,但是在配置里没有任务信息告诉我哪里有使用到这个类呢

 

3、在toolbox.xml中定义的那些tool和 和date是什么意思呢,怎么把这些东西也可以在模板上输出,真是搞不懂

 

带着这些问题,一直想了解清楚。

 

首先从web.xml中的入口开如,一般正常情况是进入到index.vm页面

 

 

  <welcome-file-list>
    <welcome-file>index.vm</welcome-file>
  </welcome-file-list>
 

 

而所有的vm文件都使用VelocityViewServlet类

 

<servlet>
    <servlet-name>velocity</servlet-name>
    <servlet-class>org.apache.velocity.tools.view.servlet.VelocityViewServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>velocity</servlet-name>
    <url-pattern>*.vm</url-pattern>
  </servlet-mapping>
 

 

为了查清VelocityViewServlet都执行了些什么,就下了velocity-tools-1.4-src.zip下来研究,发现这个类其实为我们默认实现了

很多事情,比如:

 

在没有配置velocity.properties情况,它默认会使用

 

/**
     * Default Runtime properties.
     */
    public static final String DEFAULT_TOOLS_PROPERTIES =
        "/org/apache/velocity/tools/view/servlet/velocity.properties";

 

 原来不需在WEB-INF/velocity.properties配置也可以,默认使用了velocity-tools包中的velocity属性文件

 

# default to servletlogger, which logs to the servlet engines log
runtime.log.logsystem.class = org.apache.velocity.tools.view.servlet.ServletLogger

# by default, load resources with webapp resource loader
resource.loader = webapp
webapp.resource.loader.class = org.apache.velocity.tools.view.servlet.WebappLoader
 

 

 

虽然可以使用默认的配置,但是也出了很多问题,比如在vm文件中使用中文时输出就出现了乱码,由于org.apache.velocity.tools.view.servlet.VelocityViewServle类默认使用的输出编码是ISO-8859-1

 

    /** The HTTP content type context key. */
    public static final String CONTENT_TYPE = "default.contentType";

    /** The default content type for the response */
    public static final String DEFAULT_CONTENT_TYPE = "text/html";

    /** Default encoding for the output stream */
    public static final String DEFAULT_OUTPUT_ENCODING = "ISO-8859-1";

 

 所以还是使用自己定义的的velocity.properties文件,这样的话就不会使用默认包里的文件了,我们可以自己定义输出编码,等信息如:

 

runtime.log = velocity_example.log
#Velocity.properties配置示例 
# 如果需要系统从WEB-INF/classes路径加载Velocity的模板文件,取消下面两行的注释 
#resource.loader=class 
#class.resource.loader.class=org.apache.Velocity.runtime.resource.loader.ClasspathResourceLoader 
#如需禁止系统通过文件系统加载模板文件,注释如下两行 
resource.loader=file 
file.resource.loader.path=D:\Workspaces\MyEclipse 8.5\velocity\WebRoot
#确定从何处加载velocity的模板文件 
file.resource.loader.cache=false 
#设置读取模板文件的解码格式,为了支持中文 
input.encoding=utf-8 
#配置输出视图文件的解码格式,为了支持中文 
output.encoding=utf-8 

 

终于解决了我第一个疑问,VelocityViewServlet除了处理这个外,还对toolbox.xml进得处理,所以为什么在vm中可以直接使用$toytool.message的原因,它把toolbox.xml中定义的工具绑定了上下文环境,所以在vm中得以引用,具体就不列出代码段了,除了这些外,tools包还定了很多有用的工具类,需要时都可以在toolbox.xml中定义,vm中引用.

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值