Velocity之Web高级篇-VelocityStruts

前面的《Velocity之Web篇》讲述了Velocity的Web应用基础,主要以Velocity+Servlet为主讲述基本Web开发模式,但毕竟这只是基础篇,如果Velocity与目前应用较广的Web框架结合起来,那么将能达到一步千里的目的,下面我们就结合Struts来举例两者是怎样进行整合工作的。
 
我们需要的运行资源为:Tomcat(我用5.5版本)、jakarta-struts-1.2.4.zip(从http://struts.apache.org/download.cgi上下载)。

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 演示
 * www.javayou.com
 */
                                                                               
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的处理:
 <servlet>
   <servlet-name>velocityEngine</servlet-name>
   <servlet-class>
        org.apache.velocity.tools.view.servlet.VelocityViewServlet
   </servlet-class>
 </servlet>
 <servlet-mapping>
    <servlet-name>velocityEngine</servlet-name>
    <url-pattern>*.vm</url-pattern>
 </servlet-mapping>

以上是注册了Servlet:velocityEngine,并用来处理 *.vm。
然后我们需要更改/WEB-INFO下的struts-conf.xml,在action-mappings里增加action:
 <action  path="/sample"
    type="com.javayou.velocity.struts.VelocityAction"
          scope="request">
    <forward name="welcome"  path="/WEB-INF/vm/sample.vm"/>
 </action>
接下来需要把编译好的VelocityAction.class Copy到struts-examples/WEB-INFO/classes/下的com/javayou/velocity/struts包内,把sample.vm增加到struts-examples/WEB-INFO/vm目录内,以上没有的目录需要手工创建好。
至此环境全部布置完毕,重启Tomcat,可以在IE里输入:http://localhost:8080/struts-examples/sample.do,即可得到最后结果。

以上可以看到对原来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 )
      <td align=center class=v10><b>#</b></td>
      <td align=center class=v10><b> # </b></td>
      <td align=center class=v10><b>/#</b></td>
    #end
    #end
   
这样在.vm中就可以使用printList和poundthis这两个标记了。

 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值