读书人

【转】Spring调整Velocity模板

发布时间: 2012-10-07 17:28:51 作者: rapoo

【转】Spring整合Velocity模板
9.1 使用Velocity模板
Velocity是一种针对Java应用的易用的模板语言。Velocity模板中没有任何Java代码,这使得它能够同时被非开发人员和开发人员轻松地理解。Velocity的用户手册上是这么说的:“Velocity将Java代码从Web页面中分离出来,使用Web站点从长远看更容易维护,并且提供了一种可行的JavaServer Pages替代解决方案。”

除了JSP,Velocity可能是用于Web应用的最流行的模板语言。因此很可能你会想采用Velocity作为视图层技术开发基于Spring的应用。幸运地是,Spring支持将Velocity作为Spring MVC的视图层模板语言。

让我们通过基于Velocity重新实现Spring培训应用中的视图层来看一下如何在Spring MVC中使用Velocity。
9.1.1 定义Velocity视图
假设你已经选择使用Velocity而不是JSP来创建Spring培训应用的视图。你需要使用Velocity模板编写的页面之一是显示可用课程列表的页面。程序清单 9.1 显示了courseList.vm,一个和courseList.jsp等价的用于显示课程列表的Velocity模板。

 程序清单9.1 基于Velocity的课程列表

<html>

<head>

<title>Course List</title>

</head>

<body>

<h2>COURSE LIST</h2>

<table width="600" border="1" cellspacing="1" cellpadding="1">

<tr bgcolor="#999999">

<td>Course ID</td>

<td>Name</td>

<td>Instructor</td>

<td>Start</td>

<td>End</td>

</tr>

#foreach($course in $courses)

<tr>

<td>

<a href="displayCourse.htm?id=${course.id}">

${course.id}

</a>

</td>

<td>${course.name}</td>

<td>${course.instructor.lastName}</td>

<td>${course.startDate}</td>

<td>${course.endDate}</td>

</tr>

#end // 在所有课程中循环

</table>

</body>

</html>

可能你首先注意到的是这个模板中没有任何模板标签。这是因为Velocity不是基于与JSP类似的标签的,而是采用了它自己的语言——称为Velocity模板语言(VTL)——用于流程控制和其他指令。在courseList.vm中,#foreach指令用于循环处理一个课程列表,显示每个课程的明细。除了这个Velocity和JSP的基本区别之外,你会发现Velocity的表达式语言和JSP很相似。事实上,当JSP使用${}作为它自己的表达式语言时,它不过是模仿Velocity的做法而已。这个模板仅仅演示了很少一部分你可以使用Velocity所做的事情。

如果想知道更多,可以访问Velocity位于http://jakarta.apache.org/velocity的主页。注意当完成模板之后,你需要配置Spring使它可以在MVC应用中使用Velocity模板作为视图。
9.1.2 配置Velocity引擎
首先需要配置的是Velocity引擎自己。要做到这点,可以通过以下方式在Spring配置文件中声明一个VelocityConfigurer Bean:

<bean id="velocityConfigurer"

name="${status.expression}"

value="http://www.blog.edu.cn/$!status.value">

<font color="#FF0000">${status.errorMessage}</font><br>

#springBind("command.email")


email: <input type="text"

name="${status.expression}"

value="http://www.blog.edu.cn/$!status.value">

<font color="#FF0000">${status.errorMessage}</font><br>

#springBind宏的参数是被绑定表单域的引用路径。它在模板中设置了一个名为status的变量用于保存表单域的名称、值以及可能出现的任何错误信息(可能来自一个验证器)。

如果错误信息中包含在HTML中有特殊意义的字符(比如:<,>,&),你可能需要对错误信息进行转义以正确显示在Web浏览器中。在这种情况下,你需要使用宏#springBindEscaped而不是#springBind:

#springBindEscaped("command.email", true)

除了域的引用路径之外,#springBindEscaped宏接受一个boolean参数,表明是否需要对错误信息中的HTML特殊字符进行转义。如果该参数为false,则宏#springBindEscaped和#springBind的行为完全一样,HTML特殊字符不会被转义。

为了在模板中使用Spring的宏,你需要通过VelocityViewResolver的exposeSpringMacroHelpers来使用这些宏:

<bean id="viewResolver" class="org.springframework.web.servlet.view.velocity.VelocityViewResolver">



<property name="exposeSpringMacroHelpers">

<value>true</value>

</property>

</bean>

通过把exposeSpringMacroHelpers属性设为true,你就能在Velocity模板中使用#springBind和#springBindEscaped宏。

尽管Velocity是一种广泛使用的JSP的替代技术,它不是惟一可以使用的替代模板技术。FreeMarker是另一种广为人知的用于在MVC应用的视图层中替代JSP的模板语言

读书人网 >软件架构设计

热点推荐