模板引擎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 ...
随机推荐
- tomcat -ROOT 与webapps 的关系,关于部署的一些问题
现象:之前遇到很奇怪的问题,发完版之后没有效果,页面还是读取上一版的. 反复查找原因发现 http://localhost:8080/mobie 这个路径下的页面是正常的, 而 http://lo ...
- 快速安装Percona pt工具
yum install perl-DBI perl-DBD-MySQL perl-Time-HiRes perl-Time-HiRes perl-IO-Socket-SSLwget http://pk ...
- 在线图片压缩后以ImageIO 流的形式 设置大小显示指定页面
1.Servlet 代码 public class ZoomImgServlet extends HttpServlet implements Servlet { public void init ...
- NSIS 无边框移动问题总结笔记
无边框移动 插件 WinProc WinCore.nsh [一定要有这个] 代码 ;事件 ;处理无边框移动 Function onGUICallback ${If} $MSG = ${WM_LBUTT ...
- 各种android应用模仿源码
V2EX的非官方Android客户端,极力遵循Material Design风格 下载 湘潭大学三翼校园"四季电台" Android客户端 下载 高仿煎蛋客户端 下载 ...
- 无参数实例化Configuration对象以及addResource无法加载core-site.xml中的内容
core-site.xml中配置的fs.default.name是hdfs://localhost:9000.但是这里读取出来的是本地文件系统.原因暂不知?有谁知道?
- 【JSOI2007】【Bzoj1029】建筑抢修
贪心... 按照T2来进行排序,用堆来进行维护.循环一遍,如果循环时间加上已用时间不超过截止时间,那就ANS++.否则,将它与堆顶判断,如果小于堆顶就把堆顶踢出,把它加入. #include<c ...
- iOS开发点滴:iPhone屏幕适配
最近开始做iOS开发,遇到一些小问题和解决方法,记录下. 今天是iPhone屏幕适配 iPhone5出来之后屏幕就有iPhone就有了2种尺寸:3.5寸和4寸,xcode 5 的IB设计器里面界面 ...
- C#集合类型大盘点
C#集体类型( Collections in C#) 集合是.NET FCL(Framework Class Library)中很重要的一部分,也是我们开发当中最常用到的功能之一,几乎是无处不在.俗话 ...
- 《CLR.via.C#第三版》第二部分第8,9章节读书笔记(四)
三种类型的构造方法: 实例构造器(引用类型):实例构造器永远不能被继承(所以方法前没有修饰符):如果类的修饰符为static(sealed和abstract),编译器根本不会在类的定义中生成一个默认构 ...