context.Response.ContentType = "text/html";
VelocityEngine vltEngine = new VelocityEngine(); //实例化模板
vltEngine.SetProperty(RuntimeConstants.RESOURCE_LOADER, "file"); //文件系统
vltEngine.SetProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, System.Web.Hosting.HostingEnvironment.MapPath("~/ModelEngine"));
//模板文件所在的文件夹
VelocityContext vltContext = new VelocityContext();
Template vltTemplate = vltEngine.GetTemplate("login.html"); //获取模板,将一个HTML文档作为模板,
//前面设置完成之后,经过下面的处理,得到最终的HTML页面
vltContext.Put("username", ""); //设置页面参数,也就是那些加上了$符号的值
vltContext.Put("password", ""); //这里把这些值都设置成了空
System.IO.StringWriter vltWriter = new System.IO.StringWriter();
vltTemplate.Merge(vltContext, vltWriter);
string html = vltWriter.GetStringBuilder().ToString(); //得到最终页面的HTML代码
context.Response.Write(html); //输出
上面就是一个Nvelocity最基本的使用方法了
还可以使用诸如:
假定有这个类 :
class person
{
public string name{get;set;}
public string addr {get;set;}
}
--------省略前面的代码
vltContext.Put("person", new person{name="moersing",addr="china"}); //将整个类传递到页面模板中,在页面模板使用 &perosn.name 来获取这个值即可。
本人也是新手啦,上面是参照某老师视频给出的(在此,本人衷心感谢,为了避免别人说我是在打广告,这里就不说是哪位了),但是不知道为什么,nvelocity1.6.1bate2 这个版本貌似是不支持集合索引的,也就是说,诸如:table.rows, Dictionary,等在HTML页面无法使用 $array.attributeName访问的,nvelocity会报错,什么无法转换之类的。
注:$array不是一个Nvelocity中的对象,这里只是一个占位符,表示一个集合,attributeName表示该集合中的属性名。
例如:1.6.1版本
Dictionary <string,string> test = new Dictionary <string,string>();
test["name"]= "moersing"; //设置key和value值
vltContext.Put("person",test); //传递整个字典
在页面中的引用
<!--省略前面的代码-->
<body>
$test.name <!--引用key值-->
</body>
但是报错了,提示无法转换,我整了半天也不知道怎么回事,然后根据某老师说的,换成1.1.1的nvelocity,同样是这段代码,却报错了。在getTemplate这个方法出错,提示对象为null,也就是getTemplate这个方法无法获得HTML模板,文件夹路径和名称也是对的(那是肯定的,在1.6.1能使用这个路径,当然没错)。
解决办法:
context.Response.ContentType = "text/html";
Dictionary<string, string> test = new Dictionary<string, string>();//实例化字典
test["name"] = "moersing";
VelocityEngine engine = new VelocityEngine();
ExtendedProperties prop = new ExtendedProperties();
prop.AddProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, System.Web.HttpContext.Current.Server.MapPath("./")); //路径开始是./
prop.AddProperty(RuntimeConstants.ENCODING_DEFAULT, "utf-8");
engine.Init(prop);
Template vltTemplate = engine.GetTemplate("HTMLPage1.htm"); //获取模板
VelocityContext vltContext = new VelocityContext();
vltContext.Put("test", test); //设置页面参数,也就是那些加上了$符号的值
StringWriter vltWriter = new StringWriter();
vltTemplate.Merge(vltContext, vltWriter);
string html = vltWriter.GetStringBuilder().ToString(); //得到最终页面的HTML代码
context.Response.Write(html); //输出
这样就没有问题了,仔细看看上面的代码和前面的代码是不一样的,原理是什么,咱也不清楚,呵呵,哪位大师如果知道,请赐教,另外,我测试了一下,这种写法也支持1.6.1beat版本的( o(≧v≦)o~~好棒 luky )
另外,
vltTemplate.Merge(vltContext, vltWriter);
string html = vltWriter.GetStringBuilder().ToString(); //得到最终页面的HTML代码
context.Response.Write(html); //输出
如果只是响应客户端请求输出最终页面的话,也可以简化成
vltTemplate.Merge(vltContext,context.Response.output); //这样就直接在页面输出了!
但是考虑到封装的思想,可以封装成一个方法,这样就无法简化了,
vltTemplate.Merge(vltContext, vltWriter);
string html = vltWriter.GetStringBuilder().ToString(); //得到最终页面的HTML代码
return html ; //返回一个HTML。
本人也是菜鸟,这些都是靠自己摸索出来的,但毕竟还是原创,不喜勿喷。 -----------凌轩阁℡墨轩™
如果上面的代码有什么问题,欢迎加本人QQ:1261870167 请各位赐教,万分感激。