模板引擎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", ""); 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实例的更多相关文章
- ASP.NET 模板引擎 - NVelocity
1,HTML的Form表单数据按Button提交数据以后,由 Action 指定的服务器端处理程序(.ashx)进行处理后 ,再响应的浏览器. 2,我们把 HTML的表单,写到 .ashx 一般处理程 ...
- C#模板引擎NVelocity实战项目演练
一.背景需求 很多人在做邮件模板.短信模板的时候,都是使用特殊标识的字符串进行占位,然后在后台代码中进行Replace字符串,如果遇到表格形式的内容,则需要在后台进行遍历数据集合,进行字符串的拼接,继 ...
- JS模板引擎-Mustache模板引擎使用实例1-表格树
1 使用实例代码 1.jsp代码 <!DOCTYPE html> <html lang="zh-CN"> <head> <title> ...
- 好用的模板引擎NVelocity
CastleNVelocity-1.1.1,使用方法: 把dll放到项目中,添加引用,修改配置的文件夹以及数据模型,最后在逻辑代码中调用即可. 封装到CommonHelper.cs using Sys ...
- 一个简单的PHP模板引擎
PHP早期开发中通常是PHP代码和HTML代码混写,这也使代码中充斥着数据库操作,逻辑处理等.当项目不大时,这样的代码还可以接受,但是随着项目不断扩大,我们就会发现同一个文件中同时存在前端逻辑和后端处 ...
- SpringBoot 之 视图解析与模板引擎、 热部署、日志配置(四)
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一 . SpringBoot环境下的视图解析技术 1. JSP JSP 是我们常用的视图技术了,但是Sp ...
- 【转】NVelocity模板引擎初学总结
转自:http://sunxitao88.blog.163.com/blog/static/68314439200861963326251/ 前不久,接触到.NET下的MVC-MonoRail,它推荐 ...
- 强大的模板引擎开源软件NVelocity
背景知识NVelocity(http://sourceforge.net/projects/nvelocity )是从java编写的Velocity移植的.net版本,是java界超强的模版系统,.n ...
- Asp.net动态页面静态化之初始NVelocity模板引擎
Asp.net动态页面静态化之初始NVelocity模板引擎 静态页面是网页的代码都在页面中,不须要运行asp,php,jsp,.net等程序生成client网页代码的网页,静态页面网址中一般不含&q ...
随机推荐
- 关于C#开发WEB项目TextBox控件的自适应高问题解决办法!
前两天做WEB开发时候遇到了一个小问题TextBox 控件要根据输入的内容多少自动改变大小,并且这个大小要求是在本页面内最大化.也就是 Width="100%" Height=&q ...
- linux shell重定向总结
command-line1 [-n] > file或文件操作符或设备 command-line1 [-n] >> file或文件操作符或设备 >suc.txt >err. ...
- phantomjs 双向认证,访问nginx,https
应用背景: phantomjs的一个爬虫,访问https站点,单向认证(只认证服务器身份)的都可以,双向认证(服务器和客户端都需要认证)必须上传本地证书: 开始用一个包含公钥私钥的PEM证书访问,怎么 ...
- eclipse 项目显示红叉
***修改eclipse 代码提示级别1.单个项目修改项目上右键-->properties-->java compiler-->building-->enable projec ...
- css制作对话框
当你发现好多图都能用css画出来的时候,你就会觉得css很有魅力了.//我是这么觉得的,先不考虑什么兼容问题 像漫画里出现的对话框,往往都是一个对话框然后就加入一个箭头指向说话的那一方,来表示这个内容 ...
- Android Activity task 相关属性
所谓的 task ,是指用户完成某一项任务时与之交互的一组 Activity.比如用户要向开发者汇报 bug,先打开程序主页,然后打开关于页面,再点击报告 bug 按钮,打开编辑邮件页面.当前这三个 ...
- css技巧
1.实现position为fixed与absolute值时居中定位: 给需要定位的元素块外加一层div盒子,外层div盒子存在于文档流中,让外层div盒子居中定位并设置position属性为relat ...
- CentOS 6.5系统安装配置LAMP(Apache+PHP5+MySQL)服务器环境
安装篇: 一.安装Apache yum install httpd #根据提示,输入Y安装即可成功安装 /etc/init.d/httpd start#启动Apache 备注:Apache启动之后会提 ...
- web api Route属性定义
ASP.NET Web API路由,简单来说,就是把客户端请求映射到对应的Action上的过程.在"ASP.NET Web API实践系列03,路由模版, 路由惯例, 路由设置"一 ...
- Powershell 开启远程桌面
function Set-RemoteDesktop { while($InNumber -ne 6) { Write-Host " ###################### ...