Struts2与Velocity模板

Struts2与Velocity模板

Velocity是一种基于JAVA的模板引擎,开发人员使用简单的模板语言就可以快速开发显示层,它使得显示层与程序代码分离,在早期的Webwork版本中,所有UI标签均使用Velocity模板引擎生成,可以在Struts-core-2.0.8.jar中找到template文件夹,其中的archive文件夹下存放着原有的vl文件!

Struts2中查找vm文件的顺序先查找Web应用程序,再查找类路径。如果你需要使用vm作为显示层,只需要在配置文件中指定resulttype属性为velocity,然后将<param>location属性指定到一个以vm结尾的资源上就可以了!

1.Struts2中的Velocity中文乱码的处理方式:

因为在Velocity-1.4.jar中的org.apache.velocity.runtime.defaults中定义的velocity.properties中定义的input.encoding=ISO8859-1output.encoding=ISO8859-1,通常最好在VM文件中使用%{getText(‘’)}调用国际化资源文件的内容就不会产生乱码。

2.Velocityvm文件必须要经过Action才可以访问,以便被程序解析,不可以直接访问vm文件。

3.vm文件中使用Struts2的标签只需要在原有标签前加#s就可以了,参数之间使用””分隔!

(1.)例如下面是一个表单的定义:

#sform(“action=Student” namespace=”/ilkj/student”)

       #stextfield(“label=%{getText(‘student.label.name’)}” “name=student.name”)

       #spassword(“label=%{getText(‘student.label.password’)} ” name=student.age”)

       #ssubmit(“value=getText(‘globale.label.submit’)”)

#end

(2.)下面是取出session中的一个参数的值

#sproperty(“value=#session.information” “default=noValue”)

(3.)下面是访问Action中的属性

${student.name},当然你也可以简单写成$student.name的形式。

4.Velocity的内建变量:

stack---ValueStack,可以使用${stack.findString(‘OGNL表达式’)}取值

action---最近执行的Action,例如${action.getStudent().getName()}或者也可以直接写${action.student.name}

response---HttpServletRequest

request---HttpServletResponse

session---HttpSession

application---ServletContext

base---生成应用的上下文,相当与request.getContextPath()

5.注释语法

(1.)单行注释:##

(2.)多行注释:#* ... ... *#

6.暂停执行

#stop---停止执行后面的模板内容

7.转义字符

Velocity使用 \ 转义字符,例如email被定义为[email protected]#set($email=’[email protected]’)),你还想输出$email而不被Velocity解析,那么你可以使用 \$email

8.引入其他文件

#include(“”),如果是JSP或者vm文件将会显示内容,其他文本文件显示文本,二进制会显示乱码,引入多个文件使用 , 间隔,#parse(“”)引入一个本地的vm文件,与#include(“”)不同,#parse(“”)只能引入一个文件,并且#parse(“”)可以访问父模板里的变量。

9.模板代码复用

#macro(代码段名称 $参数1 ... ...)

       ... ...

#end

只要使用#代码段名称($参数1 ... ...)就可以使用这段代码,当然你也可以不使用任何参数

10.判断语句

#if(逻辑表达式)

注意:在Velocity中使用==判断两个变量是否相等,而不是使用equals(“”)方法。

#else

#end

从上面我们还可以总结出,Velocity模板引擎使用#表示一种命令,例如#set是给某个变量设置值,使用$引用变量,使用()表示参数,使用{}表示作用范围。

另外需要注意的时候,Velocity只会按照gettXXX()解析变脸变量,例如student.name实际上找到的student.getName()方法,你可以试着在Action写一个变量而不使用getXXX()方法,看看会不会在vm中取到值,答案是变量会被原样输出。

Velocity使用的都是对象,即使你定义#set ($count=1)也会被包装成Integer使用。

另外,修改vm文件需要重新启动服务器,如果在开发阶段,我们可以设置struts.properties中的struts.devMode=true避免每次重新启动服务器。

最后我们思考一下,如果货币 $2.95 会被 Velocity 引擎直接输出,还是去查找 2.95 这个变量?如果你在思考这个问题,说明你的 JAVA 基础不过关哦!因为 JAVA 中的变量不能以数字开头的哦!因此你不必担心货币 $2.95 会被当作变量解析!另外,如果 Velocity 引擎未找到变量也会原样输出,例如 ${student.name} 如果未找到会直接原样输出,这也是为什么我们直接访问 JSP 的时候会看到大量的 ${} 被原样输出。如果变量不存在,你想让它不输出,可以这样写$!{}

你可能感兴趣的:(Struts2与Velocity模板)