Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1002560
  • 博文数量: 152
  • 博客积分: 4937
  • 博客等级: 上校
  • 技术积分: 1662
  • 用 户 组: 普通用户
  • 注册时间: 2007-10-05 16:55
文章分类

全部博文(152)

文章存档

2013年(12)

2012年(6)

2011年(58)

2010年(43)

2009年(1)

2008年(15)

2007年(17)

我的朋友

分类: Java

2010-07-09 11:01:38

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这两个标记了。
 
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sharky77/archive/2006/07/10/900326.aspx
阅读(1372) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~