03-模板引擎

模板引擎

l 自己做字符串替换的方法实现模板的缺点:不利于美工修改;很
难实现复杂的要求(if、for)
l 模板引擎有很多:
Nvelocity(http://www.castleproject.org/download/)、
StringTemplate、RazorEngine等。用法大同小异:编写模板→
提供数据→渲染成HTML
l NVelocity基本用法代码见备注。
• 给模板设置的属性如果有属性,则还可以进一步的获取:
$data.Person.Name。
• 如果对象有一个字符串索引器,则还可以“$data.索引器值”的方
式通过索引器获取值。使用一个Dictionary测试(如果报错,说明用
错了版本了)
• (*)Nvelocity中解析jquery代码$.ajax()中的$.的时候把$理解成了
Nvelocity的$特殊符号,应对方法是用jQuery代替$

NVelocity深入

l 1、#foreach ($element in $list)
This is $element.
#end
l 测试:把一个Person数组的输出到界面上
l 2、条件语句
l #if (condition)
l #elseif (condition)
l #else
l #end
l 测试:如果年龄大于20则显示为红色
l 3、可以使用#include包含另一个文件# include("foot.htm"),文件内容会包含进来
,不会解析其中的NVelocity元素。#parse也可以包含另一个文件,但是会解析
其中的NVelocity元素,被包含的文件继承父模板中的参数。可以实现“网站头体
一致、左侧菜单”等效果。

C#和NVelocity更好的结合
l 如果模板上需要数据很多(比如填写个人信息),那么就需要传递很多
参数,这样很麻烦,可以把这些参数封装到一个类中,这样
$data.Name,$data.Age就可以了。不过每次写不同的页面都要写一个
这样的类太麻烦,C#3.0中提供了“匿名类”语法,var person =
new{Name="yzk",Age=25}; 相当于声明一个有Name、Age两个属性的
类,new这个类的一个实例,并且用变量person指向它,因为是匿名类
,没有确切的类型,所以把person变量声明为“自动推断”的变量var
。后面就可以这样用了int i= person.Age。属性是只读的。
l 把DataTable传递给NVelocity的时候要传递DataTable .Rows
l (*)为了减少每次解析模板的时间,建议启用NVelocity缓存

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NVelocity.App;
using NVelocity.Runtime;
using NVelocity;
using System.Collections;
using System.Data;

namespace ASPNetHttpHandler2
{
    /// <summary>
    /// Login3 的摘要说明
    /// </summary>
    public class Login3 : IHttpHandler
    {

        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/html";
            Dictionary<string, string> dict = new Dictionary<string, string>();
            dict["tom"] = "斯坦福";
            dict["jim"] = "加里敦";
            dict["yzk"] = "哈佛";

            VelocityEngine vltEngine = new VelocityEngine();
            vltEngine.SetProperty(RuntimeConstants.RESOURCE_LOADER, "file");
            vltEngine.SetProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, System.Web.Hosting.HostingEnvironment.MapPath("~/templates"));//模板文件所在的文件夹
            vltEngine.Init();

            string[] strs = new string[] { "杨中科", "刘德华","阿信" };
            List<Person> persons = new List<Person>();
            persons.Add(new Person { Age = 30, Name = "杨中科" });
            persons.Add(new Person { Age = 10, Name = "王二小" });
            persons.Add(new Person { Age = 50, Name = "周扒皮" });

            Person p = new Person();
            p.Age = 30;
            p.Name = "yzk";

            VelocityContext vltContext = new VelocityContext();
            vltContext.Put("ps", dict);//设置参数,在模板中可以通过$data来引用
            vltContext.Put("mingrens", strs);
            vltContext.Put("persons", persons);
            vltContext.Put("person",p);
            vltContext.Put("age", 3);

            Template vltTemplate = vltEngine.GetTemplate("test3.htm");
            System.IO.StringWriter vltWriter = new System.IO.StringWriter();
            vltTemplate.Merge(vltContext, vltWriter);

            string html = vltWriter.GetStringBuilder().ToString();
            context.Response.Write(html);
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace ASPNetHttpHandler2
{
    public class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }

        public Person Father { get; set; }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NVelocity.App;
using NVelocity.Runtime;
using NVelocity;

namespace ASPNetHttpHandler2
{
    /// <summary>
    /// DisplayNews 的摘要说明
    /// </summary>
    public class DisplayNews : IHttpHandler
    {

        public void ProcessRequest(HttpContext context)
        {
            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("~/templates"));//模板文件所在的文件夹
            vltEngine.Init();

            //把类的定义和对象的声明初始化放到一起
            //匿名类
            var news = new { Title = "特大喜讯",Author="杨中科",PostDate="2013-11-08",Msg="今天晚上会公布喜讯细节!" };
            string s = news.PostDate;           

            VelocityContext vltContext = new VelocityContext();
            vltContext.Put("data", news);

            Template vltTemplate = vltEngine.GetTemplate("displayNews1.htm");
            System.IO.StringWriter vltWriter = new System.IO.StringWriter();
            vltTemplate.Merge(vltContext, vltWriter);

            string html = vltWriter.GetStringBuilder().ToString();
            context.Response.Write(html);
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>$data.Title</title>
</head>
<body>
    <h1>$data.Title</h1>
    <p>作者:$data.Author;发布日期:$data.Postdate</p>
    <p>$data.Msg</p>
</body>
</html>

#if($age<10)
  hahaha
#end

<p>本网站版权所有!盗版弄死你!$age</p>
</body>
</html>

<a href="http://www.sina.con">点击就不送屠龙宝刀</a>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
</head>
<body>
<p><h1>欢迎光临如鹏网$age</h1></p>
#if($age>30)
  hahaha
#end

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html><head></head><body><strong><font color=‘green‘>登录</font></strong><form action=‘Login.ashx‘><input type=‘text‘ name=‘username‘ value=‘$username‘/><input type=‘password‘ name=‘password‘ value=‘$password‘ /><input type=‘submit‘ value=‘登录‘/></form><p>$msg</p></body></html>

#include("head.htm")

$ps.tom

1:
<ul>
    #foreach($mr in $mingrens)
    <li>$mr</li>
    #end
</ul>

2:
<ul>
    #foreach($p in $persons)
        <li>$p.Name的年龄是$p.Age</li>
    #end
</ul>

3:
<ul>
    #foreach($p in $persons)
        #if($p.Age>20)
          <li style="color:Red">$p.Name的年龄是$p.Age</li>
        #else
          <li style="color:Green">$p.Name的年龄是$p.Age</li>
        #end
    #end
</ul>

<p>
#if($age>10)
   大于10
#else
   小于等于10
#end
</p>
#parse("GG.htm")

#parse("foot.htm")

#include("head.htm")
我就是这么点东西
#include("GG.htm")
<ul>
#foreach($p in $persons)
    <li><input type="text" value="$p.Name" /></li>
#end
</ul>
#include("foot.htm")

时间: 2024-08-10 08:25:09

03-模板引擎的相关文章

前端学PHP之Smarty模板引擎

前面的话 对PHP来说,有很多模板引擎可供选择,但Smarty是一个使用PHP编写出来的,是业界最著名.功能最强大的一种PHP模板引擎.Smarty像PHP一样拥有丰富的函数库,从统计字数到自动缩进.文字环绕以及正则表达式都可以直接使用,如果觉得不够,SMARTY还有很强的扩展能力,可以通过插件的形式进行扩充.另外,Smarty也是一种自由软件,用户可以自由使用.修改,以及重新分发该软件.本文将详细介绍Smarty模板引擎 概述 Smarty是一个php模板引擎.更准确的说,它分离了逻辑程序和外

ajax&amp;模板引擎

使用命名空间,来避免命名的ajax函数被重名的覆盖var $_fox_tool = { // 将 我们封装的 函数 保存在 一个 全局 对象的 属性中 ajax_tool_pro: function(object) { var ajaxObj = new XMLHttpRequest(); if (object.method == 'post') { ajaxObj.open(object.method, object.url); ajaxObj.setRequestHeader("Conten

《开源框架那些事儿26》:“最好的模板引擎”Beetl剖析及与Tiny模板引擎对比

查找最好的模板引擎,发现这个搜索词出来的是beetl,于是就仔细学习了Beetl,试图找寻“最好的”三个字表现在哪里?于是搭建环境,阅读代码,与鄙人所做的TinyTemplate进行了粗略的对比,在征得beetl作者@闲.大赋 的同意后,编写了此对比文章.由于时间关系,对Beetl的认知深度还有不足,分析不当之处在所难免,还请广大同学纠正,定当有错误和不当必改. 点滴悟透设计思想,加入框架设计兴趣小组:http://bbs.tinygroup.org/group-113-1.html Beetl

Spring MVC 学习总结(七)——FreeMarker模板引擎与动态页面静态化

模板引擎可以让程序实现界面与数据分离,业务代码与逻辑代码的分离,这就提升了开发效率,良好的设计也使得代码复用变得更加容易.一般的模板引擎都包含一个模板解析器和一套标记语言,好的模板引擎有简洁的语法规则.强大的功能.高效的渲染效率.详尽的帮助说明与不断的更新与维护.常见的前端模板引擎有: 常用的java后台模板引擎:jsp.FreeMarker.Velocity等. 请不要迷恋速度,为了推广的测试可能是片面的,好的模板引擎经得起时间考验,建议大家选择成熟的.常用的模板引擎.另外不管前后端的模板引擎

Java之利用Freemarker模板引擎实现代码生成器,提高效率

http://blog.csdn.net/huangwenyi1010/article/details/71249258 目录(?)[-] 开心一笑 视频教程 提出问题 解决问题 前言 技术选型 实现思路 首先假如在数据库中有一张表 ay_test 我们首先要获取数据库的连接这里我只贴出相关的代码 获取数据库表的元数据 最后根据元数据获取表字段注释等等生成相关的文件 代码实现 Java代码实现 FreeMarkerTemplateUtils工具类 实体类 ColumnClass freemark

artTemplate模板引擎学习实战

在我的一篇关于智能搜索框异步加载数据的文章中,有博友给我留言,认为我手写字符串拼接效率过低,容易出错.在经过一段时间的摸索和学习之后,发现现在拼接字符串的方法都不在是自己去书写了,而是使用Javascript引擎.而javascript引擎的实质就是帮我们把带有JavaScript代码的伪THTML语句编译为HTML. 如果有不了解的朋友,可以前往这两篇文章: 淘宝购物车页面 PC端和移动端实战 淘宝购物车页面 智能搜索框Ajax异步加载数据 源码地址: GitHub:Uncle-Keith 回

使用模块化思维和模板引擎搭建前端架构(require+underscore)

require.js 介绍: 是一个非常小巧的JavaScript模块载入框架,是AMD规范最好的实现者之一.最新版本的RequireJS压缩后只有14K,堪称非常轻量. 官网:http://www.requirejs.cn/    (PS:如果没接触过,刚开始看都是一头蒙蔽的,建议看下菜鸟教程) 新手教程:http://www.runoob.com/w3cnote/requirejs-tutorial-1.html 优点:可完成团队协作.模块复用.单元测试等等一系列复杂的需求 undersco

《开源框架那点事儿25》:对框架模板引擎实现方式的改造实录

点滴悟透设计思想,Tiny模板引擎优化实录! 增加框架设计兴趣小组:http://bbs.tinygroup.org/group-113-1.html Tiny模板引擎的实现方式原来是採用的编译方式,近期发生了一些问题.因此我认为有必要把编译方式调整为解释方式,为此就開始了此次实现活动. 编译方式存在的问题 当时採用编译方式.主要是考虑到编译方式在执行时不必再去遍历语法树.因此就採用了编译方式. 可是在实际应用其中,出现了例如以下问题: 文件路径冲突的问题 因为採用的是编译方式,这个时候就存在在

php模板引擎的原理与简单实例

模板引擎其实就是将一个带有自定义标签的字符串,通过相应的规则解析,返回php可以解析的字符串,这其中正则的运用是必不可少的,所以要有一定的正则基础.总体思想,引入按规则写好的模板,传递给标签解析类(_HtmlTag)进行解析,再把解析好的字符串传递给php进行解析渲染输出首先定义了一个_HtmlTag类: class _HtmlTag{ protected $taglist = "if|elseif|else|loop|for|while|=|:=|:e|:html|:"; prote

Django基础,Day10 - template 模板引擎与路径设置

作为一个Web框架,Django需要一个方便的方式来生成动态的HTML.最常见的方法依赖于模板.模板包含所需的HTML输出的静态部分以及一些特殊的语法描述如何插入动态内容. Django框架后端默认支持自生内置的一套模板系统DTL(Django Template Language) 和 有名的Jinja2模板系统.当然,也可以从第三方模块中之前其他模板系统.如果没有特殊要求,建议使用Django自带的DTL模板系统,这也是django 1.8之前唯一可以的内置选项. TEMPLATE 默认配置