第八章 多视图
8.1.3 Velocity 实例分析
这个小节通过一个例子来展示如何用 Velocity 来进行编程。
在 MyEclipse 中新建一个 Views 工程,这个项目除了那些必须的包这之外还要有其他包,
具体有哪些包见图 8-1。这些包有些在 struts-2.0.9-all.zip 可以找到,但是有些没有,那读者 就要自己去下载。
注意:这个网址http://source.sakaiproject.org/maven/ 可以下到大部分的 jar 包。在之前所有
用到 velocity 视图的例子都应该包含这些 jar 包,其中 avalon-logkit-2.1.jar 尤为重要。
图 8-1 项目需要的包
用 Velocity 来显示 Action 中数据,在这里我先定义一个 NBATeam 类,包含三个私有属 性:teamName,superStar,num。具体代码如下:
NBATeam.java package view.test;
public class NBATeam {
//定义一个球队的四个成员变量 private String teamName;
private String superStar;
private Long num;
//默认的不带参数的构造函数 public NBATeam() {
super();
}
/带参数的构造函数
public NBATeam(Long num,String teamName,String superStar) { super();
this.num = num;
this.teamName = teamName;
this.superStar = superStar;
}
/*省略 get、set 方法*/
}
在这个类中有两个不同构造函数,由于参数不同,将会调用不同的构造函数。接下来就 是三个私有数据的 setXXX()方法和 getXXX()方法。super()表示调用超类的构造函数。
接下来就看看 Action 是怎样的。
ViewAction.java
package view.test.action;
/*省略导入的包*/
@SuppressWarnings("serial")
public class ViewAction extends ActionSupport { private List<NBATeam> myList;
public String execute() throws Exception {
//构造四个 NBA 球队,调用带参数的构造函数
NBATeam p1 = new NBATeam(new Long(6),"Bull","Jordan");
NBATeam p2 = new NBATeam(new Long(3),"Lakers","Kobe");
NBATeam p3 = new NBATeam(new Long(2),"Rocket","YaoMing");
NBATeam p4 = new NBATeam(new Long(3),"Spurs","Duncan");
myList = new ArrayList<NBATeam>();
//把新建好的四个球队插入一个链表 NBATeam 的 List,先创建一个对象名为 myList 的链表,然后再把先前创建好的四个 NBATeam 插入 myList。这样有关 NBATeam 的内容就全部存放在 myList 中,要显示的时候将其里面 的对象取出来就可以了。接下来看看 struts.xml 的配置是怎么样的。具体内容如下:
struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.devMode" value="true" />
<package name="default" extends="struts-default">
<!-- 配置自定义的 Action 名字以及类 -->
<action name="myVelocityTest" class="view.test.action.ViewAction">
<result name="success" type="velocity">NBATEAMShow.vm</result>
</action>
</package>
</struts>
上面的代码就是增加一个 Action 的相关配置,让 ViewAction 类和名字为 myVelocityTest 的 Action 关联起来,最后成功后返回 NBATEAMShow.vm 的页面,这就是一个 Velocity 编 写的页面。
至于 web.xml 中的设置跟以前的配置还是一样,内容如下:
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_9" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>VIEWS</display-name>
<filter>
<title>This Page Generates Velocity Texts</title>
</head>
<body>
<h1>NBAteam Describe</h1>
<hr/>
</body>
</html>
由于有四个 NBATEAM 要显示,那就必须得用循环指令了,可以看看前面的语法,循 环使用#foreach/#end,$NBATeam in $myList 表示在 myList 中的所有 NBATeam 类型的数据,
当 全 部 取 出 之 后 , 循 环 就 会 结 束 。 $NBATeam.teamName , $NBATeam.superStar ,
$NBATeam.num 这当然就是 NBATeam 三个私有数据的引用咯,是不是很简便啊!在显示的 时候用到了表格的形式,只是简单建了一张表。这样整个 Velocity 就算配置成功了,来看看 目录,如图 8-2 所示:
图8-2 工程Views的目录
在浏览器中输入:http://localhost:8080/Views/myVelocityTest.action,效果如图 8-3 所示。
图8-3Velocity的效果图
看完整个 Volecity 不知道读者会有什么收获,其实可以用 JSP 来写上面的例子,读者就 会发现用 JSP 将是多么不方便的一件事。
这一节从 Velocity 的基础开始一点点介绍到语法,再通过实例来运行,希望能引起读者 们都 Velocity 的兴趣。当然模板引擎还有很多,下节就会见到另外一种。
8.2 FreeMarker
除了 Velocity 之外还有一种模板引擎,在 Struts2 中已经开始推荐使用 FreeMarker 了,
从下载的 struts-2.0.9-all.zip 中自带 freemarker-2.3.8.jar 就可以看出这点,如果要使用 Velocity 还要自己去下载上面提到的那些包。可以这么说,FreeMarker 的功能比 Velocity 更强大,对 于大多数应用程序,FreeMarker 比 Velocity 工作更简单,FreeMarker 实现了许多 Velocity 没 实现的功能。在介绍完 FreeMarker 之后,再回过头来看看它们的区别。