Velocity之Web高级篇-VelocityStruts 收藏
前面的《Velocity之Web篇》讲述了Velocity的Web应用基础,主要以Velocity+Servlet为主讲述基本Web开发模式,但毕竟这只是基础篇,如果Velocity与目前应用较广的Web框架结合起来,那么将能达到一步千里的目的,下面我们就结合Struts来举例两者是怎样进行整合工作的。
我们需要的运行资源为:Tomcat(我用5.5版本)、jakarta-struts-1.2.4.zip(从上下载)。
Velocity推出后,已经陆续推出了不少Velocity tools,发展为一系列的子项目,其中包含VelocityStruts,它是以Struts为基本框架,但以Velocity为模版引擎代替View层来开发Web应用的,它的核心是VelocityViewServlet类和其他一些附属工具包,来带动Velocity和Struts的整合。
对VelocityStruts最好的解释还是来看下图,引自VelocityStruts的docs,
根据上图可以看到其实VelocityStruts的前面(左边)部分还是完全是Struts的模式,而在Forward转向的时候就增多了对Velocity Template Language编写的模版的支持,使原来转向Jsp View层可以转向VTL View层。
我们看具体的例子,首先编辑一个简单的Struts Action,在它内部进行商业逻辑处理后得到的展示数据,然后Forward到一个.vm 的View中,代码如下:
package com.javayou.velocity.struts;
import javax.servlet.http.*;
import org.apache.struts.action.*;
import java.util.*;
/*
* @author Liang.xf 2004-12-20
* VelocityStruts 演示
*
*/
public class VelocityAction extends Action {
public ActionForward execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
System.out.println(" --- VelocityAction working ---");
//待展示的列表数据
String p1 = "1, LiuDong";
String p2 = "2, Liang.xf";
Vector personList = new Vector();
personList.addElement(new String(p1.getBytes(), "ISO-8859-1") );
personList.addElement(new String(p2.getBytes(), "ISO-8859-1") );
//设置数据
HttpSession session = request.getSession() ;
session.setAttribute("theList", personList);
return mapping.findForward("welcome");
}
}
编译只需要 struts.jar 和 j2ee.jar 两个jar包,假设和源文件一起放置在本地目录下,编译命令如下:
javac -classpath .\struts.jar;.\j2ee.jar VelocityAction.java
这样,加上sample.vm,即完成资源的预备,sample.vm 参考《Velocity之Web篇》。
因为不想在搭建Struts环境上在此多言,故我们借助Struts的样例进行快速搭建,在资源预备中得到的jakarta-struts-1.2.4.zip,解压后,得到一个jakarta-struts-1.2.4文件,更名为jakarta-struts-1.2.4.zip,再继续解压,得到Struts1.2.4,再其webapps目录下,把struts-examples.war Copy到Tomcat的webapps目录下,首先启动Tomcat,Tomcat运行后自动解压和发布struts-examples.war。
以上环境搭建好后,就可以看看Velocity是如何整合到上述的Struts环境下了,首先更改struts-examples\WEB-INFO\下的web.xml,增加Velocity对.vm的处理:
velocityEngine
org.apache.velocity.tools.view.servlet.VelocityViewServlet
velocityEngine
*.vm
以上是注册了Servlet:velocityEngine,并用来处理 *.vm。
然后我们需要更改\WEB-INFO下的struts-conf.xml,在action-mappings里增加action:
type="com.javayou.velocity.struts.VelocityAction"
scope="request">
接下来需要把编译好的VelocityAction.class Copy到struts-examples\WEB-INFO\classes\下的com\javayou\velocity\struts包内,把sample.vm增加到struts-examples\WEB-INFO\vm目录内,以上没有的目录需要手工创建好。
至此环境全部布置完毕,重启Tomcat,可以在IE里输入:,即可得到最后结果。
以上可以看到对原来Struts最大的改变就是在Action处理后的Forward更改上,原来是直接Forward到新的.do 或 Jsp页面上,而在这里变成了 .vm,而.vm在web.xml中已经被注册由VelocityViewServlet进行处理,这样,Struts的最后流向就被转向了Velocity上。
最后再来提一个问题,有人可能有疑问,Struts提供了Taglib的自定义开发,以支持灵活的页面展示脚本,而Velocity提供的相关替代是宏,宏的编写默认在VM_global_library.vm文件内,具体文件名在velocity.properties中指定,简单举例如下:
# macro (printList)
# if ($theList)
# foreach ($ elem in $theList)
$ elem
#end
# end
# end
#macro( poundthis $truth )
#if ($truth )
# |
# |
\# |
#end
#end
这样在.vm中就可以使用printList和poundthis这两个标记了。
阅读(1372) | 评论(0) | 转发(0) |