`

NVelocity入门,为服务器与客户端传输xml数据,实现Ajax通信铺平道路

阅读更多
本来是打算学Velocity的,但自己懒得写原始的数据库连接并查询数据,又避免使用Hibernate、Spring等一大堆繁琐的配置(看来本人写Java代码时是有非ssh、ssj不下手的癖好。虽然这些技术在真正项目中可以带来一系列的好处,但现在我只是想知道怎么用Velocity,仅此而已),所以我选择从NVelocity开始学习(我以前封装了一个C#的GenericDaoSql类,超好用的呢,这样我就不必去管那些烦人的数据库连接什么的了,需要数据时,直接调用一个方法搞定,嘿嘿),接下来用Velocity应该也差不多吧,毕竟NVelocity是Velocity在.NET平台的一个实现。

好了,废话不多说了,让我们先来了解一下为什么需要使用NVelocity。
没有用NVelocity时,我们在后台什么一个xml格式的数据通常是这样的:
StringBuilder usersXML = new StringBuilder();

        // 获取用户信息列表,烦人的sql语句了不见了,coding时是不是很舒服呢
        List<UserInfo> users = userInfoDAO.SelectAll();
        usersXML.Append("<users count=\""+ users.Count +"\" title=\"使用字符串拼接的例子\">");
        foreach (UserInfo user in users)
        {
            usersXML.Append("<user>")
                         .Append("<name>").Append(user.Name).Append("</name>")
                         .Append("<sex>").Append(user.Sex).Append("</sex>")
                         .Append("<city>").Append(user.City).Append("</city>")
                         .Append("</user>");
        }
        usersXML.Append("</users>");


        Response.Clear();
        Response.ContentType = "text/xml";
        Response.Write("<?xml version=\"1.0\" encoding=\"utf-8\" ?>");
        Response.Write(usersXML.ToString());
        Response.End();



这种方式实现挺简单的,看起来效果也不错,于是心底暗自偷笑:“真是小菜一碟,数据准备好了,接下来可以玩Ajax了,多么酷的效果哦,爽…….”。可别得意,先来看这么做存在的一个问题,一个很严重的问题:
xml格式被写死在代码里面了。想一下,如果以后我想再为user添加联系方式,爱好等时,我们得从一大堆乱七八糟的代码中找出这段生成xml格式数据的代码,然后再接着Append("<connectType>").Append(user.ConnectType).Append("</connectType>"),如此之类…..
一阵编码之后,搞定了。长吁之后,接着编译代码,打包部署…….
刚准备休息,boss跑过来:“你把这个user改成userInfo吧,人家需要userInfo开始的数据……”。
”DM,那家伙是不是白痴呀,怎么老叫改这改那的…….”。不由一身冷汗,还好,没说出口,只是心底暗骂而已,要不肯定被炒鱿鱼了哦。
“一分钟可以搞定吗?改几个字符串而已……”。
     “哪有那么快,我还得编译代码呢!“。一副不服气的样子,欠扁……
……
其实刚才都是我遐想的,其实问题没那么严重,只是改些字符串而已。但老改确实挺烦人的,得重新编译代码倒是事实。而且,这些确实只是显示格式而已,把这个仅用来定义显示样式的格式写死在代码里面确实挺让人郁闷的。
要是直接写个xml,像这个样子:
<?xml version="1.0" encoding="utf-8" ?>
<users count="用户人数" title="标题">
	<!-- 要是可以在这边来个循环,把用户循环显示出来就好了-->
	<user>
		<name>用户名</name>
		<sex>性别</sex>
		<city>城市</city>
	</user>
</users>

到时候我们给这个xml一个人员列表的数据,让它可以生成一个人员列表的xml就好了,哎,一副无助的样子……
可事实上真的有这样的工具,我们管它叫模板引擎,NVelocity就属于这类。只要使用模板语言(template language)来编写好模板,到时候给模板引擎解析,并生成我们需要的数据。
好,既然这样,下面我们来看一下生成貌似上面xml格式数据的模板应该怎么写:
<?xml version="1.0" encoding="utf-8" ?>
#foreach($u in $ListUsers)
#beforeall
<users count="$Count" title="$Title">
    #each
    <user>
        <name>$u.Name</name> 
        <sex>$u.Sex</sex> 
        <city>$u.City</city> 
     </user>
#afterall
</users>
#nodata
<users>暂无用户资料</users>
#end


我们只需要给这个模板一个ListUsers的人员列表数据,模板引擎就会帮我们生成需要的数据,嘿嘿,是不是很爽呀…….
“可是我不会模板语言呀…….“。
“BC,不会不知道学呀,真是的……“,此人一副傲慢的样子。
鄙视那人,“学就学,谁怕谁呀,咱们又不比你笨……“,于是装着一副可以战胜一切困难的样子,其实心里一点底气都没有。
其实,学过一些编程语言后,在读模板语言写的代码时,基本上都能够猜出是什么意思。
我们现在来看看上面那个模板是什么意思:
#foreach($u in $ListUsers)其实跟C#里面的foreach(Java中的扩展for)几乎一样,就死遍历ListUsers里面的数据,每次遍历的值放到对象u中,接下来
#beforeall:就是在遍历ListUsers前,先输出<users count="$Count" title="$Title">
#each:就是每遍历一下,得到一个u,就输出
<user>
        <name>$u.Name</name> //$u.Name就是输出u对象的Name属性,在Java中就肯定是调用getName()方法了哦,C#实现的NVelocity也延续了java的习惯,就是说,这个也可以表示调用getName()方法,具体是直接调用属性,还是调用方法得看具体情况,NVelocity会自动辨别的
        <sex>$u.Sex</sex>
        <city>$u.City</city>
     </user>
#afterall:遍历完ListUsers后,输出</users>
#nodata:如果没数据的话,直接数据<users>暂无用户资料</users>
#end:表示遍历完毕的结束标志
看看,是不是真的很简单呢!
好了,现在我们来看一下在服务器端怎么调用这个模板,并传给这个模板ListUsers这个参数:
// 获取到用户列表
IList<UserInfo> listUsers = UserInfoService.GetAllUsers();

        // 创建一个模板引擎
        VelocityEngine vltEngine = new VelocityEngine();
        // 文件型模板, 还可以是 "assembly", 则使用资源文件
      vltEngine.SetProperty(RuntimeConstants.RESOURCE_LOADER, "file");
        // 模板存放目录
vltEngine.SetProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, Server.MapPath("~/Template/"));
        vltEngine.Init();

        // 定义一个模板上下文        
VelocityContext vltContext = new VelocityContext();
        // 传入模板所需要的参数
        vltContext.Put("Title", "NVelocity文件模板例子");
        vltContext.Put("Count", listUsers.Count);
        vltContext.Put("ListUsers", listUsers);

        // 获取我们刚才所定义的模板,上面已设置模板目录, 此处用相对路径即可.
        Template vltTemplate = vltEngine.GetTemplate("users.xml");
       // 定义一个字符串输出流
        StringWriter vltWriter = new StringWriter();
        // 根据模板的上下文,将模板生成的内容写进刚才定义的字符串输出流中
        vltTemplate.Merge(vltContext, vltWriter);
        // 输出字符串流中的数据
        Response.Write(vltWriter.GetStringBuilder().ToString());


    终于搞定了,是不是很简单。
    是滴,难倒是不难,只是……
    别说了,不光你觉得烦,我都觉的有点烦人了,还是原来直接拼接字符串容易呀!
话虽这么说,但在真正的项目中还是会带来很多好处的,包括易维护性(老兄,写代码时,多替以后维护你代码的哥们着想着想呀。说不定那位哥们有一天会找上你家门找你算账的哦!有那么惨吗?维护的人知道有多惨,但你不知道维护的人有多惨……)。

    代码包中包含了一个调用已编译dll中的模板的例子(user.xml模板已经被编译进dll中了,这样带来的好处是:以后你只需要将修改的dll覆盖掉原来的dll就可以了,大哥,组件化开发呀),代码差不多,我就不多说了,该说的我都说了,该你看了吧!
分享到:
评论
1 楼 scyyzgxh 2012-10-20  
引用
所以我选择从NVelocity开始学习(我以前封装了一个C#的GenericDaoSql类

这里提及到的GenericDaoSql类,博主能否提供出来学习下?scyyzgxh3965@163.com,谢谢了。

相关推荐

    使用NVelocity实现的简单学员管理

    NVelocity是Apache软件基金会下的一个开源项目,是一个强大的模板引擎,它允许开发者将HTML、XML或者其他格式的文本与数据源结合起来,生成动态内容。在.NET环境中,NVelocity为开发者提供了便利的方式来生成静态或...

    Json+NVelocity模板引擎C#入门示例,比较全面

    NVelocity则是一个开源的Java模板引擎,用于生成动态内容,它可以将HTML、XML等静态模板与数据模型相结合,生成最终的输出。虽然NVelocity原生是为Java设计的,但通过一些库,它也可以很好地在C#环境中工作。 Json...

    NVelocity操作基础代码

    NVelocity的核心功能是将数据模型与模板结合,生成输出文本。它允许开发者通过简单的语法(如#set, #if, #foreach等)在模板中插入、控制和迭代数据。以下是一些关键知识点: 1. **模板语法**:NVelocity的模板语法...

    Nvelocity真静态案例

    真静态是指将动态生成的网页内容在服务器端预先渲染为静态HTML文件,然后直接返回给客户端,避免了每次请求都需要执行数据库查询和其他复杂的业务逻辑。这种方法可以显著提高网站的访问速度和并发能力,同时降低...

    Nvelocity模板引擎

    NVelocity是一款基于.NET平台的模板引擎,主要用于ASP.NET应用程序中,它允许开发者将视图(View)部分与业务逻辑(Controller)分离,实现MVC(Model-View-Controller)架构中的视图渲染功能。NVelocity借鉴了Java...

    Velocity文档和NVelocity类库

    总结来说,Velocity和NVelocity为开发者提供了强大的模板引擎,它们帮助我们实现表现层与业务逻辑的分离,简化了动态内容的生成过程。通过深入学习和实践,我们可以充分利用这些工具,提升软件开发的效率和质量。

    nvelocity 模型适配

    3. **数据驱动**:NVelocity模板与数据模型相结合,模板中的变量和表达式会根据提供的上下文数据进行替换。这些数据通常来自应用程序的业务逻辑层。 4. **可扩展性**:NVelocity支持自定义指令和事件处理器,这允许...

    NVelocity中文文档以及NVelocity.dll 1.0(适用用.net环境下)

    NVelocity目前官方版本为0.42。官方地址:http://nvelocity.sourceforge.net/,原作者已经申明不再对NVelocity做技术支持了,所以sourceforge上NVelocity版本一直是0.42不再有更新了。不过目前NVelocity已经有1.0的...

    nvelocity_模板_NVelocity_C#_模板引擎_

    **NVelocity模板引擎详解** NVelocity是开源的Java模板引擎,但在.NET环境中也有广泛应用,它是一种强大的、可扩展的模板语言,主要用于生成动态内容。NVelocity允许开发者将HTML或者其他格式的文档与业务逻辑分离...

    NVelocity使用文档

    NVelocity的主要功能是将静态模板与动态数据结合,生成定制化的输出。它允许开发者将业务逻辑与展示层分离,提高代码可维护性和重用性。通过模板,你可以定义页面布局和样式,而动态数据则由程序在运行时注入,这样...

    NVelocity语法与实例教程

    NVelocity 语法与实例教程

    nvelocity 模版 例子

    NVelocity可以轻松地与ASP.NET、ASP.NET MVC、NHibernate等.NET框架集成,为应用程序提供灵活的视图层解决方案。 10. **社区和支持** NVelocity有一个活跃的社区,提供了丰富的文档、示例和插件,帮助开发者解决...

    NVelocity语法 java or c#

    NVelocity是一款强大的、开源的模板引擎,最初是为Java平台设计的,但通过特定的封装,它也能够被C#开发者在ASP.NET平台上利用。NVelocity语法是用于生成动态内容的关键,它允许开发者将静态HTML模板与应用程序数据...

    2017年NVelocity引擎各种用法

    NVelocity引擎是基于Java的模板引擎,它是Apache软件基金会的Velocity项目的一部分,被广泛用于Web开发中的视图层,帮助开发者将动态内容与静态页面模板分离。2017年的这个资源集合提供了一系列NVelocity的使用案例...

    NVelocity.dll

    NVelocity灵感来源于Apache Velocity,它允许开发者将逻辑与呈现分离开来,使得视图层的代码更加简洁、可维护。 **NVelocity的核心功能:** 1. **模板语言:** NVelocity使用自己的模板语言,允许开发者在HTML或...

    模板引擎 - NVelocity

    在实际开发中,NVelocity可以与其他Java框架(如Spring MVC)集成,实现视图层的渲染。通过这种方式,开发者可以在控制器中处理业务逻辑,然后将模型数据传递给NVelocity模板,由模板负责生成最终的视图。 总结来说...

    NVelocity简单实例+资源包

    NVelocity是一款基于.NET平台的模板引擎,它源自Java世界的Velocity,并且被广泛应用于.NET应用程序中的动态内容生成。这款开源库允许开发者将业务逻辑与视图层分离,通过模板语言来控制输出格式,使得代码更加清晰...

    NVelocity1.1版及示例Demo(全源码)

    在.NET环境中,NVelocity作为一个.NET版本的 Velocity引擎,为开发者提供了强大的文本渲染和模板处理能力。这个压缩包“NVelocity1.1版及示例Demo(全源码)”包含了NVelocity 1.1版本的所有源代码以及相关的示例和...

    C# NVelocity模板调用实例

    总的来说,C#结合NVelocity模板引擎可以实现高效的动态内容生成,提供了一种灵活的方式将后端数据与前端展示分离。通过熟悉VTL语法和正确配置C#代码,你可以创建出强大的、可扩展的Web应用程序。

Global site tag (gtag.js) - Google Analytics