前言

最近一直忙于工作,没时间来管理博客,同时电脑也不给力,坏了一阵又一阵,最后还是去给修理了,这不刚一回来迫不及待的就写一篇文章来满足两个月未写博客的紧迫感。

Nvelocity

关于nvelocity就不再过多介绍,这样的文章已经太多太多,我只是将其封装起来用用,其中遇到的问题也会在其中一一进行讲解。为什么会用到该模板引擎是因为要定义不同的格式来进行后续的打印,关于打印后续有时间也和大家讲解讲解,关于打印可以透露一点,有想到过用现成比如园友伍华聪大大介绍的lodop,这款打印还是非常的强大,虽然有免费版,但是也就供学习用,在实际项目中还是要用到比较复杂的打印api,于是乎就得去写了,这个过程幸好有基本的代码供参考,还是学到不少有关打印的知识,无论是在餐厅还是在肯德基等地方都会有打印的小票,之前没怎么去在意过,直到自己遇到要实现这样的打印以及对应的格式在去仔细研究研究,其过程也是受益匪浅。

好,话说了这么多,我们开始进入主题,分割线


实现内容:需要将数据放到xml文件中然后将其反序列化为对象进行后续的传输。。。

如下直接给出封装的Nvelocity。

NVelocityEngine

    public class NVelocityEngine
{
private VelocityEngine _velocit;
private static readonly string templateDir = System.Web.Hosting.HostingEnvironment.MapPath("~/Template");
public NVelocityEngine(string tempDir)
{
//创建NVelocity引擎的实例对象
this._velocit = new VelocityEngine();
//初始化该实例对象
ExtendedProperties props = new ExtendedProperties(); props.AddProperty(RuntimeConstants.RESOURCE_LOADER, "file");
props.AddProperty(RuntimeConstants.INPUT_ENCODING, "utf-8");
props.AddProperty(RuntimeConstants.OUTPUT_ENCODING, "utf-8"); //设置模板所在目录
props.AddProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, tempDir);
props.AddProperty(RuntimeConstants.FILE_RESOURCE_LOADER_CACHE, true);
props.AddProperty("file.resource.loader.modificationCheckInterval", ""); this._velocit.Init(props);
} private static Mutex _Mutex = new Mutex();
private static NVelocityEngine _MeObj;
public static NVelocityEngine Create()
{
if (_MeObj != null)
return _MeObj; _Mutex.WaitOne();
if (_MeObj == null)
_MeObj = new NVelocityEngine(templateDir);
_Mutex.ReleaseMutex(); return _MeObj;
} public string GetHtml(IContext context, string templatePath)
{
StringWriter writer = new StringWriter();
Template template = this._velocit.GetTemplate(templatePath, "utf-8");
template.Merge(context, writer);
return writer.GetStringBuilder().ToString();
}
}
}

NVelocityPage

    public class NVelocityPage
{ private IContext _IContext;
private string _templatePath; public NVelocityPage(string templatePath)
{
this._IContext = new VelocityContext();
this._templatePath = templatePath;
} public void Add(string key, object value)
{
if (this._IContext.ContainsKey(key))
this._IContext.Remove(key);
this._IContext.Put(key, value);
} public string WriteHtml()
{
try
{
return NVelocityEngine.Create().GetHtml(this._IContext, this._templatePath);
}
catch (Exception e)
{ throw e;
} }
}

接下来则是需要反序列化为对象的几个类,命名比较粗糙,将就点看吧。

    [XmlRoot("Table")]
public class Table
{
[XmlArrayItem(typeof(tr), ElementName = "TR")]
public List<tr> TR { get; set; }
} public class tr
{
[XmlArrayItem(typeof(td),ElementName="TD")]
public List<td> TD { get; set; }
} public class td
{
[XmlAttribute("tdValue")]
public string tdValue { get; set; }
}

XML文件

<?xml version="1.0" encoding="utf-8" ?>
<Table>
<TR>
#foreach($d in $list)
<tr>
<TD>
<td tdValue="$d.Age"/>
</TD>
</tr>
#end
</TR>
</Table>

测试类:

            var list = new List<Person>()
{
new Person(){Age=,Name=""},
new Person(){Age=,Name=""},
new Person(){Age=,Name=""},
new Person(){Age=,Name=""}
};
var nvelocityPage = new NVelocityPage("table.xml");
nvelocityPage.Add("list", list);
var tableXml = nvelocityPage.WriteHtml();
var memoryStream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(tableXml));
       var xmlSerializer = new XmlSerializer(typeof(Table));
var table = (Table)xmlSerializer.Deserialize(memoryStream);

结果如下:

反序列为对象时没有正确,估计是在写xml特性有问题结果进行如下修改即可。

将上述

  [XmlArrayItem(typeof(tr), ElementName = "TR")]

修改为如下:

 [XmlArray("TR")]
[XmlArrayItem("tr")]

同理进行修改则如我们所期望,结果则不再演示。在其过程中在利用内存流进行反序列化时建议进行如下设置

  memoryStream.Position = ;

之前未进行设置则出现如下错误,后来又未出现,不明白是怎么情况

XML 文档(0, 0)中有错误。缺少根元素

至此,我们利用模板引擎进行数据替换接着进行加载到内存中反序列化为对象就已结束。

总结

之前未接触过将输出的xml数据利用xml特性来进行反序列化为对象,也花了一点时间去看这方面的东西,本以为只能通过加载xml文件来进行反序列化,未曾想到这样也是可以的,多次尝试才最终完成任务,每一次的实际项目应用需要才会使我学习到更多且了解的更透彻。今天写这篇文章脑子也是懵的,终于写完,只是为了两个月未写博客做一个新的开始,后续会陆续讲解项目当中学到的新的知识,希望对阅读本文的你有所启发和帮助,当然文章难免有错误之处、表述不清之处请指出或者错别字,我好及时的修改和完善。

模板引擎Nvelocity实例的更多相关文章

  1. ASP.NET 模板引擎 - NVelocity

    1,HTML的Form表单数据按Button提交数据以后,由 Action 指定的服务器端处理程序(.ashx)进行处理后 ,再响应的浏览器. 2,我们把 HTML的表单,写到 .ashx 一般处理程 ...

  2. C#模板引擎NVelocity实战项目演练

    一.背景需求 很多人在做邮件模板.短信模板的时候,都是使用特殊标识的字符串进行占位,然后在后台代码中进行Replace字符串,如果遇到表格形式的内容,则需要在后台进行遍历数据集合,进行字符串的拼接,继 ...

  3. JS模板引擎-Mustache模板引擎使用实例1-表格树

    1 使用实例代码 1.jsp代码 <!DOCTYPE html> <html lang="zh-CN"> <head> <title> ...

  4. 好用的模板引擎NVelocity

    CastleNVelocity-1.1.1,使用方法: 把dll放到项目中,添加引用,修改配置的文件夹以及数据模型,最后在逻辑代码中调用即可. 封装到CommonHelper.cs using Sys ...

  5. 一个简单的PHP模板引擎

    PHP早期开发中通常是PHP代码和HTML代码混写,这也使代码中充斥着数据库操作,逻辑处理等.当项目不大时,这样的代码还可以接受,但是随着项目不断扩大,我们就会发现同一个文件中同时存在前端逻辑和后端处 ...

  6. SpringBoot 之 视图解析与模板引擎、 热部署、日志配置(四)

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一 . SpringBoot环境下的视图解析技术 1. JSP JSP 是我们常用的视图技术了,但是Sp ...

  7. 【转】NVelocity模板引擎初学总结

    转自:http://sunxitao88.blog.163.com/blog/static/68314439200861963326251/ 前不久,接触到.NET下的MVC-MonoRail,它推荐 ...

  8. 强大的模板引擎开源软件NVelocity

    背景知识NVelocity(http://sourceforge.net/projects/nvelocity )是从java编写的Velocity移植的.net版本,是java界超强的模版系统,.n ...

  9. Asp.net动态页面静态化之初始NVelocity模板引擎

    Asp.net动态页面静态化之初始NVelocity模板引擎 静态页面是网页的代码都在页面中,不须要运行asp,php,jsp,.net等程序生成client网页代码的网页,静态页面网址中一般不含&q ...

随机推荐

  1. C#/PHP调用有SoapHeader的WebService

    日前调用第三方WebService接口时遇到了SoapHeader验证的问题,记录一下解决方法. 接口需要的格式: <soapenv:Header> <ReqSOAPHeader x ...

  2. #研发解决方案#分布式并行计算调度和管理系统Summoner

    郑昀 创建于2015/11/10 最后更新于2015/11/12 关键词:佣金计算.定时任务.数据抽取.数据清洗.数据计算.Java.Redis.MySQL.Zookeeper.azkaban2.oo ...

  3. MySQL表的四种分区类型

    MySQL表的四种分区类型 一.什么是表分区 通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysql5.1开始支持数据表分区了. 如:某用户表的记录超过了600万条,那么就可以根据入库日期将表 ...

  4. [LintCode] Sort List 链表排序

    Sort a linked list in O(n log n) time using constant space complexity. Have you met this question in ...

  5. 查看sbt版本

    进入 sbt 命令行模式, 键入sbtVersion 得到[info]0.13.12

  6. DSY2287*消失之物

    Description ftiasch 有 N 个物品, 体积分别是 W1, W2, ..., WN. 由于她的疏忽, 第 i 个物品丢失了. "要使用剩下的 N - 1 物品装满容积为 x ...

  7. C++ 编写DLL文件给易语言调用

    摸索了两天了,终于解决了所有问题,在此跟大家分享. 需要三个文件,dll_demo.h.dll_demo.cpp.dll_dome.def 直接上代码: 头文件如下: #ifndef _DLL_DEM ...

  8. phpcms v9常用方法

    1.联动菜单根据地区id显示地区名称的方法: 显示效果: 四川 >> 攀枝花 >> 仁和区 [字段名字为 area] {get_linkage($info['area'],1, ...

  9. nginx-nginx.conf脚本

    user www www; worker_processes ; error_log /usr/local/nginx/logs/error.log info ; pid /var/run/nginx ...

  10. PHP基础知识之逻辑运算符

    与(and,&&)和或(or,||)有两种形式,两种形式的区别是:优先级不一样,and.or的优先级低于&&.||