在前面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中引用.