`
snoopy7713
  • 浏览: 1124900 次
  • 性别: Icon_minigender_2
  • 来自: 火星郊区
博客专栏
Group-logo
OSGi
浏览量:0
社区版块
存档分类
最新评论

Velocity模版与Ajax灵活应用

阅读更多

一:先简单介绍一下velocity的模版页面

velocity是apache开源组织旗下的一个开源项目,可以到apache的官方网去下载并了解它的语法和用法,非常简单,既方便又易用,主要包括两个jar包,velocity-1.5.jar,velocity-dep-1.5.jar。

velocity的模版是以vm为后缀的,例如我的web应用下有一个模版:/myweb/template/test.vm,它是以$符号来引用 对象,例如我在request中设置了一个名称叫做mydata的attribute,类型为List,list的保存的对象类型为Data.java

public class Data {
private String name = "";
private String sex = "";
private String address = "";
public String getAddress() {
   return address;
}
public void setAddress(String address) {
   this.address = address;
}
public String getName() {
   return name;
}
public void setName(String name) {
   this.name = name;
}
public String getSex() {
   return sex;
}
public void setSex(String sex) {
   this.sex = sex;
}
}

在页面显示时的迭代用法是:

<table>
<tr>
#foreach($data in $!mydata)
<td>$!data.getName()</td>
<td>$!data.getSex()</td>
<td>$!data.getAddress()</td>
#end
</tr>
</table>

用模版犹如建一栋房子,把钢架结构搭好了,就往里边堆东西就可以了。

二:解析velocity模版的实现说明

Velocity引擎对vm模版解释是根据引擎的上下文和模版的路径来进行解析的,从以下的代码可以一览其然,非常简单明了:

首先要初始化一个vm引擎:

   VelocityEngine engine = new VelocityEngine();

再次要初始化vm模版资源的绝对路径,以方便引擎进行解析(黑体部分的属性是必须得有的,vm模版的路径例如第一点中的:/myweb/template/test.vm:):

Properties p = new Properties();
    final String str = vmpath.substring(0, vmpath.lastIndexOf("/"));

    p.setProperty("file.resource.path", request.getSession()
      .getServletContext().getRealPath("")
      + str);
    engine.init(p);

然后就是把request属性等设置在引擎的上下文中,当然也可以把session中的属性也设置进去。

VelocityContext context = new VelocityContext();
   Enumeration enu = request.getAttributeNames();

   while (enu.hasMoreElements()) {
    final String paramName = enu.nextElement().toString();
    context.put(paramName, request.getAttribute(paramName));
   }

最后就是解析模版了:

    template = engine.getTemplate(vmpath.substring(vmpath
      .lastIndexOf("/") + 1));
    template.merge(context, sw);

以下是解析vm模版的全部代码:

import java.io.StringWriter;
import java.util.Enumeration;
import java.util.Properties;

import javax.servlet.http.HttpServletRequest;

import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.exception.ParseErrorException;
import org.apache.velocity.exception.ResourceNotFoundException;

public class VmUtil {

public static String getVmString(HttpServletRequest request, String vmpath) {
   if (null == vmpath || "".equals(vmpath))
    return "";

   // velocity模版的解析引擎
   VelocityEngine engine = new VelocityEngine();

   try {
    Properties p = new Properties();
    final String str = vmpath.substring(0, vmpath.lastIndexOf("/"));

    p.setProperty("file.resource.path", request.getSession()
      .getServletContext().getRealPath("")
      + str);
    engine.init(p);
   } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }

   // velocity的上下文环境变量的设置
   VelocityContext context = new VelocityContext();
   Enumeration enu = request.getAttributeNames();

   while (enu.hasMoreElements()) {
    final String paramName = enu.nextElement().toString();
    context.put(paramName, request.getAttribute(paramName));
   }

   // velocity模版
   Template template = null;
   StringWriter sw = new StringWriter();

   try {
    template = engine.getTemplate(vmpath.substring(vmpath
      .lastIndexOf("/") + 1));
    template.merge(context, sw);
   } catch (ResourceNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   } catch (ParseErrorException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }

   return sw.toString();
}

}

三:jsp页面可以用自定义标签的形式来引入vm模版,此做法的目的是利用ajax局部刷新时可以只刷新模版的那部分。

jsp页面中的引入自定义标签时可以将模版的路径作为一个属性进行设置,例如/test.jsp页面中引入:

<showpage:vmpage vmurl="/myweb/template/test.vm"/>

jsp自定义标签的doStateTag或者doEngTag方法都可以调用VmUtil .getVmString(request,vmurl) 来获取解析后的html字符串,然后用out将其输出到页面中去,在此就不再详细介绍jsp自定义标签的用法了。

四:prototype.js框架的应用,主要利用其的ajax框架

prototype.js是一个开源的比较流行的js框架工具包,包括ajax等应用,在此只介绍它部分的ajax用法:

页面局部刷新时用到的function, 传入的参数就是ajax请求局部刷新的url,divName就是要局部刷新的div或者td等,在页面调用时要记得到如prototype.js的脚本集:

function showPage(url,divName)
{
this.g_div_name = divName;
this.success = function (xmlRequest)
{
   var str = xmlRequest.responseText;
   document.getElementById(this.g_div_name).innerHTML = str;
}

this.fail = function (xmlRequest)
{
   alert("paging error!");
}
var xmlRequest = new Ajax.Request(url,{method:"post",parameters:"&timestamp="
      + new Date.getTime(),onSuccess:this.success,onFailure:this.fail});
     
    if (!xmlRequest)
    {
    alert("paging error!");
    }
}

五:页面功能实现的一些简单介绍

本文只是介绍模版和ajax的结合运用,故不提供具体的例子,以下简要说一下servlet。假如有个/test.jsp和一个 /myservlet路径的servlet,为了配合ajax实现局部的刷新,增加一个ajax请求的标志位ajaxFlag 参数,该servlet的servie方法中局部说明如下:

.......

request.setAttribute("mydata",mydata);

.......

String ajaxFlag = request.getParameter("ajaxFlag");

if(null != ajaxFlag &&! "true".equals(ajaxFlag ))

{

        response.setContentType("text/html;charset=UTF-8");

      reponse.getWriter().println(VmUtil .getVmString(request,"/myweb/template/test.vm") );

         return ;//如果是ajax请求,输出后直接返回

}

reponse.sendRedirect("/test.jsp");//非ajax请求,重定向到指定的jsp页面中去。

.......

六:总结

不断追求、勇于进取是我从事该行业的方向标。

http://dev2dev.bea.com.cn/blog/neso/200711/velocity_ajax_06_624.html

 

分享到:
评论

相关推荐

    电子商务完整版

    灵活的组装形式,可以定义网页区块,结合AJAX动态更新局部信息。 3. 集成支付和配送功能 E6Mall集成了第三方支付系统,支持支付宝、贝宝等第三方支付平台;同时集成了配送功能,可根据各第三方物流公司价格体系设计...

    velocity2js-开源

    Velocity2Js将Velocity模板转换为JavaScript函数。 这些功能可以轻松地集成到任何基于ajax的Web应用程序中。 速度模板中使用的上下文可以作为关联数组(例如JSON)传递。

    JavaScript Template JST模板引擎

    让你的MVC模式连成一体,而且由于View由浏览器来 处理,大大减少了服务器的负担,用来构建Ajax技术的网络信息系统应用是一个非常好的选择。下面将通过翻译该站的文章来给大家介绍这个JST引擎的使 用。

    Java Web程序设计教程

    1.2.4使用javascript与ajax提升用户体验 7 1.3多种集成开发环境 9 1.3.1集成开发环境简介 9 1.3.2web应用服务器说明 11 本章小结 14 课后练习 14 第2章 javaee运行及开发环境 15 2.1jdk的下载与安装 15 ...

    struts2.0.jar

    Struts 2标签现在可与FreeMarker、Velocity及类似模板引擎配合使用。 · 引入拦截器: Struts 2为拦截器(interceptor)提供了全面支持。拦截器可在Action类执行前后加以执行。拦截器经配置后,可以把工作流程或者...

    java web 开发详解

    太过灵活——没有公共的父控制器 没有内置的Ajax支持 Stripe  优点: 不需要书写XML配置文件 良好的学习文档 社区成员很热心 缺点: 社区比较小 不如其他的项目活跃 ActionBean里面的URL是硬编码的 Struts 2  优点...

    Beetl模板引擎-其他

    关于性能:通过与主流模板引擎Freemarker,Velocity以及JSP对比,Beetl均远高于前面三个,这是因为宏观上,通过了优化的渲染引擎,IO的二进制输出,字节码属性访问增强,微观上,通过一维数组保存上下文,合并静态...

    vel2js-开源

    vel2js 是velocity2js 的一个分支。 它将 Velocity 模板转换为 Javascript 函数,可以轻松集成到任何基于 ajax 的 Web 应用程序中。 Velocity 模板中使用的上下文可以作为关联数组(例如 JSON)传递。

    基于SpringBoot的代码生成器的设计和实现.doc

    本系统使用模板引擎Apache Velocity来实现从模型到代码的渲染,使用MySQL数据库来储存模型和模板信息,网页前端使用Vue框架和Ajax技术进行设计。本文对该设计进行了初步的实现,并对代码生成功能进行测试,生成的...

    struts项目学习笔记

    支持更多视图技术(JSP(转译java文件,编译成class文件,才可以运行)、(模板技术,html,把数据和模板html一起以流方式输出)FreeMarker、Velocity) 基于AOP(面向切面编程)思想的拦截器机制,更易扩展(不修改源代码的...

    EasyJWeb服务调度和自定义邮件引擎技术的CRM系统实战开发

    EasyJWeb框架是基于Velocity模板技术的,所有的页面都是静态HTML页面,省略了JSP的编译过程,大大提高了系统的访问速度。EasyJWeb对于中小型的软件项目来说是十分优秀的,内置的Action可以轻易的捕获前台的请求,而...

    Spring in Action(第2版)中文版

    16.5spring中带有dwr的支持ajax的应用程序 16.5.1直接web远程控制 16.5.2访问spring管理的beandwr 16.6小结 附录a装配spring a.1下载spring a.1.1研究spring发布 a.1.2构建自己的类路径 a.2把spring添加为一...

    Spring in Action(第二版 中文高清版).part2

    16.5 Spring中带有DWR的支持Ajax的应用程序 16.5.1 直接Web远程控制 16.5.2 访问Spring管理的Bean DWR 16.6 小结 附录A 装配Spring A.1 下载Spring A.1.1 研究Spring发布 A.1.2 构建自己的类路径 A.2 把...

    Spring in Action(第二版 中文高清版).part1

    16.5 Spring中带有DWR的支持Ajax的应用程序 16.5.1 直接Web远程控制 16.5.2 访问Spring管理的Bean DWR 16.6 小结 附录A 装配Spring A.1 下载Spring A.1.1 研究Spring发布 A.1.2 构建自己的类路径 A.2 把...

    Struts2入门教程(全新完整版)

    处理Velocity模板 16 org.apache.struts2.dispatcher.VelocityResult 16 xslt 16 处理XML/XLST模板 16 org.apache.struts2.views.xslt.XSLTResult 16 全局result: 17 动态Result:了解 18 12.异常处理 18 三、在...

    Struts2 in action中文版

    8.1.1 页面上:如何使用自定义结果组件构建Struts 2 Ajax应用程序 171 8.1.2 实现JSON结果类型 173 8.2 常用的结果类型 180 8.2.1 RequestDispatcher,也叫做dispatcher 180 8.2.2 ServletRedirectResult,也叫做...

    struts2 学习例子

    包括最常用的jsp页面,也可以说Velocity和FreeMarker等模板技术中的使用 2.Struts2分类 (1)UI标签:(User Interface, 用户界面)标签,主要用于生成HTML元素标签,UI标签又可分为表单标签非表单标签 (2)非UI...

    qfilter:qfilter是一个基于koa开发的中间件服务。用来解决一系列的开发,调试问题。 只需要一个命令行,就可以生成一套好用的开发环境

    前端服务过滤器 ...支持java里面的velocity模板的渲染。支持layout。 Getting started 请确保node版本号支持harmony特性generator(node 0.11以上)。 1.install globally sudo npm install -g qfilter 2.in

    Portfolio-Java-Legacy:这是Hari Hara Kumar Portfolio网站

    作品集 该产品组合网站是使用BOOTSTRAP 3,... 通过研究此项目,您可以了解如何使用Velocity Templates(.vm)使用自定义模板发送邮件 这是我的投资组合网站。 如果您认为此代码将对您有所帮助,请立即将其添加到项目中

Global site tag (gtag.js) - Google Analytics