前言

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

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. windows环境下搭建vue+webpack的开发环境

    前段时间一直在断断续续的看vue的官方文档,后来就慢慢的学习搭建vue的开发环境,已经有将近两周了,每到最后一步的时候就会报错,搞的我好郁闷,搁置了好几天,今天又接着搞vue的开发环境,终于成功了.我 ...

  2. css多行显示省略号

    首先说css多行显示省略号和单行文本省略号: 我们知道,单行显示省略号时,我们首先需要设置容器的宽度width:value(具体的值),然后强制文本在一行内显示,即white-spacing:nowr ...

  3. Mac系统中配置Tomcat环境

    第一步:下载Tomcat 下载地址:http://tomcat.apache.org/download-80.cgi 直接下载如图选中的即可 第二步: 下载完成后,解压,随意放入目录.如我就把它放在/ ...

  4. Jenkins 集成打包和上传 App Store 的冲突

    周一下午用 Jenkins 集成打包,遇到了一个很奇怪的问题,之前上传到 APP Store 的时候 Build Settings->“Code Signing Resource Rules P ...

  5. ThreadPoolExecutor源码学习(2)-- 在thrift中的应用

    thrift作为一个从底到上除去业务逻辑代码,可以生成多种语言客户端以及服务器代码,涵盖了网络,IO,进程,线程管理的框架,着实庞大,不过它层次清晰,4层每层解决不同的问题,可以按需取用,相当方便. ...

  6. 常用类-StringBuffer

    总结:凡是要频繁的修改字符串内容的时候,都要使用StringBuffer类来完成,而且在StringBuffer类里提供了一些在String类中没有的,包括:delete(),insert()等等 / ...

  7. 跨域无法获取自定义header的问题

    同域的时候,header里面的参数可以随便自己定义.服务端都是可以获取的. 但是跨域的时候,除了设置 <add name="Access-Control-Allow-Origin&qu ...

  8. Ubuntu系统下lnmp环境搭建和Nginx多站点配置

    最近需要使用Ubuntu作为服务器搭建Lnmp环境,顺便将操作过程写下来,与大家分享.如有不足之处,欢迎大家提出不同意见.(本文默认读者已经熟悉相关linux命令的使用,比如创建文件和文件夹,编辑文件 ...

  9. 使用JavaScript获取日期加随机数生成单号

    今天学习Javascript,得到一个自动生成单号的JavaScript,留下日后备用: function getNowFormatDate() { var day = new Date(); var ...

  10. .保护Express应用程序

    毫无疑问,Node.js已经变的愈加成熟,尽管这样,开发者仍然缺乏大量的安全指南.在这篇文章中,我将分享一些有关Node.js安全要点给大家,希望大家能够谨记于心. 1.避免使用Eval Eval并不 ...