当前位置: 首页 > news >正文

模板引擎Nvelocity实例

前言

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

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", "30");

            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=1,Name="1"},
                new Person(){Age=2,Name="2"},
                new Person(){Age=3,Name="3"},
                new Person(){Age=4,Name="4"}
            };
            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 = 0;

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

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

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

总结

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

 

相关文章:

  • 闲聊产品】之三:点评 WWDC 2014
  • 判断Laravel Eloquent获取数据结果集是否为空
  • 具有先进的图像处理和图像识别技术的条码识别引擎2D Barcode Decoder DLL
  • HeadFirst 设计模式 04 工厂模式
  • WPF RichTextBox 做内容展示框 滚动条控制判定是否阅读完成
  • 迷你MVVM框架 avalonjs 沉思录 第3节 动态模板
  • systemtap -oracle
  • 各类程序员学习路线图
  • apache安装配置说明
  • Spring整合Quartz定时发送邮件
  • 基于Windows Server 2008 R2 Hyper-V环境虚拟化Centos来宾操作系统
  • ExtJS 4.2 系列教程(4):使用Ext.define自定义类
  • 第二天学习。
  • SQL Server 2012笔记分享-16:理解并设置文件组
  • XEN 环境安装
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • Docker 笔记(2):Dockerfile
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • maven工程打包jar以及java jar命令的classpath使用
  • Netty源码解析1-Buffer
  • Vue组件定义
  • 大主子表关联的性能优化方法
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 排序算法学习笔记
  • 使用SAX解析XML
  • 我感觉这是史上最牛的防sql注入方法类
  • 应用生命周期终极 DevOps 工具包
  • HanLP分词命名实体提取详解
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ​Spring Boot 分片上传文件
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • $.each()与$(selector).each()
  • (1)常见O(n^2)排序算法解析
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (SpringBoot)第七章:SpringBoot日志文件
  • (ZT)出版业改革:该死的死,该生的生
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (四)鸿鹄云架构一服务注册中心
  • (一)appium-desktop定位元素原理
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (转)3D模板阴影原理
  • (转)Oracle存储过程编写经验和优化措施
  • (转)详解PHP处理密码的几种方式
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .net CHARTING图表控件下载地址
  • .Net面试题4
  • /dev下添加设备节点的方法步骤(通过device_create)
  • @ConfigurationProperties注解对数据的自动封装
  • @transactional 方法执行完再commit_当@Transactional遇到@CacheEvict,你的代码是不是有bug!...