StringTemplate模板技术
antlr stringtemplate 用法

antlr stringtemplate 用法摘要:1.ANTLR 简介2.StringTemplate 的作用和特点3.ANTLR StringTemplate 的基本语法4.ANTLR StringTemplate 的实际应用5.总结正文:1.ANTLR 简介ANTLR(Another Tool for Language Recognition)是一款强大的解析生成工具,主要用于处理结构化文本数据。
它可以根据用户定义的语法规则生成解析器、词法分析器和树遍历器等。
ANTLR 广泛应用于各种编译器、解释器和数据处理领域。
2.StringTemplate 的作用和特点StringTemplate 是ANTLR 的一个功能强大的子项目,它允许用户在解析过程中动态生成字符串。
StringTemplate 具有以下特点:- 可以在解析树遍历过程中生成字符串,支持复杂的字符串操作和表达式。
- 支持嵌套的模板定义,可以创建多层次的模板结构。
- 可以通过宏定义和参数化来实现代码重用和灵活性。
3.ANTLR StringTemplate 的基本语法ANTLR StringTemplate 的基本语法如下:- rule:定义一个StringTemplate 规则,由LT、GT 和行动代码组成。
LT:表示词法分析器生成的词法单元。
GT:表示从词法分析器生成的词法单元到解析树的转换。
行动代码:表示在解析树遍历过程中执行的操作。
example:rule MyTemplate( MyTemplate ( GT MyTemplate ) ){// 解析器执行的代码}4.ANTLR StringTemplate 的实际应用以一个简单的示例来说明如何使用ANTLR StringTemplate。
首先,定义一个简单的语法规则:```grammar MyGrammar;expression: multiplication ((PLUS | MINUS) multiplication)*;multiplication: atom (MULT atom)*;atom: INT| LPAREN expression RPAREN;INT : [0-9]+ ;LPAREN : "(" ;RPAREN : ")" ;MULT : "*" ;PLUS : "+" ;MINUS : "-" ;WS : [ t]+ -> skip ;```然后,使用ANTLR StringTemplate 生成解析器和词法分析器:```javaimport org.antlr.v4.runtime.*;import org.antlr.v4.runtime.tree.ParseTree;public class Main {public static void main(String[] args) throws IOException {// 创建词法分析器和解析器MyGrammarLexer lexer = newMyGrammarLexer(CharStreams.fromString("1+2*3"));MyGrammarParser parser = new MyGrammarParser(newCommonTokenStream(lexer));// 解析表达式ParseTree tree = parser.expression();// 使用StringTemplate 生成字符串StringTemplate template = new StringTemplate("expression");CommonTokenStream tokenStream = new CommonTokenStream(lexer);String result = template.expand(tokenStream, tree);System.out.println(result); // 输出"1 + 2 * 3"}}```5.总结ANTLR StringTemplate 提供了一种强大的字符串生成功能,可以在解析过程中动态生成字符串。
C++Template基础篇(一):函数模板详解

C++Template基础篇(⼀):函数模板详解Template所代表的泛型编程是C++语⾔中的重要的组成部分,我将通过⼏篇blog对这半年以来的学习做⼀个系统的总结,本⽂是基础篇的第⼀部分。
为什么要有泛型编程C++是⼀门强类型语⾔,所以⽆法做到像动态语⾔(python javascript)那样⼦,编写⼀段通⽤的逻辑,可以把任意类型的变量传进去处理。
泛型编程弥补了这个缺点,通过把通⽤逻辑设计为模板,摆脱了类型的限制,提供了继承机制以外的另⼀种抽象机制,极⼤地提升了代码的可重⽤性。
注意:模板定义本⾝不参与编译,⽽是编译器根据模板的⽤户使⽤模板时提供的类型参数⽣成代码,再进⾏编译,这⼀过程被称为模板实例化。
⽤户提供不同的类型参数,就会实例化出不同的代码。
函数模板定义把处理不同类型的公共逻辑抽象成函数,就得到了函数模板。
函数模板可以声明为inline或者constexpr的,将它们放在template之后,返回值之前即可。
普通函数模板下⾯定义了⼀个名叫compare的函数模板,⽀持多种类型的通⽤⽐较逻辑。
template<typename T>int compare(const T& left, const T& right) {if (left < right) {return -1;}if (right < left) {return 1;}return 0;}compare<int>(1, 2); //使⽤模板函数成员函数模板不仅普通函数可以定义为模板,类的成员函数也可以定义为模板。
class Printer {public:template<typename T>void print(const T& t) {cout << t <<endl;}};Printer p;p.print<const char*>("abc"); //打印abc为什么成员函数模板不能是虚函数(virtual)?这是因为c++ compiler在parse⼀个类的时候就要确定vtable的⼤⼩,如果允许⼀个虚函数是模板函数,那么compiler就需要在parse这个类之前扫描所有的代码,找出这个模板成员函数的调⽤(实例化),然后才能确定vtable的⼤⼩,⽽显然这是不可⾏的,除⾮改变当前compiler的⼯作机制。
Python编程之字符串模板(Template)用法实例分析

Python编程之字符串模板(Template)⽤法实例分析本⽂实例讲述了Python编程之字符串模板(Template)⽤法。
分享给⼤家供⼤家参考,具体如下:#coding=utf8'''''字符串格式化操作符,需要程序员明确转换类型参数,⽐如到底是转成字符串、整数还是其他什么类型。
新式的字符串模板的优势是不⽤去记住所有相关细节,⽽是像shell风格的脚本语⾔⾥⾯那样使⽤美元符号($).由于新式的字符串引进Template对象,Template对象有两个⽅法:substitute()、safe_substitute()。
substitute()更为严谨,在key缺少的情况下会报⼀个KeyError的异常。
safe_substitute()在缺少key的情况下,直接原封不动的把字符串显⽰出来。
'''#导⼊Template对象from string import Templatedef stringTemplate():#创建⼀个Template实例tmptmp=Template("I have ${yuan} yuan,I can buy ${how} hotdog")yuanList=[1,5,8,10,12,13]for yu in yuanList:#substitute()按照Template中string输出#并给相应key赋值Substitute= tmp.substitute(yuan=yu,how=yu)print Substituteprintfor yu in yuanList:#使⽤substitute函数缺少key值包KeyErrortry:lackHow= tmp.substitute(yuan=yu)print lackHowprintexcept KeyError,e:print "substitute lack key ",eprintfor yu in yuanList:#safe_substitute()在缺少key的情况下#直接原封不动的把字符串显⽰出来。
string的template用法

string的template用法摘要:一、String 的template 用法简介1.String 模板的概念2.为什么使用String 模板二、String 的template 用法详解1.字符串拼接2.字符串替换3.字符串格式化三、String 的template 用法的实际应用1.实例一:字符串拼接2.实例二:字符串替换3.实例三:字符串格式化四、String 的template 用法的注意事项1.字符串安全问题2.性能问题3.编码问题正文:String 的template 用法在编程中经常被使用,它可以帮助开发者更方便地处理字符串。
本文将详细介绍String 的template 用法及其在实际应用中的注意事项。
一、String 的template 用法简介String 模板是Java 中String 的一个重要特性,它允许在字符串中插入变量,从而实现字符串的动态拼接、替换和格式化。
使用String 模板可以提高代码的可读性和可维护性,避免因字符串拼接带来的性能问题和安全问题。
二、String 的template 用法详解1.字符串拼接在Java 中,可以使用加号(+)运算符实现字符串拼接。
然而,这种方法可能会导致性能问题,特别是在大量字符串拼接的情况下。
使用String 模板可以避免这个问题,例如:```String result = "Hello, " + name + "!";```可以使用String.format() 方法实现字符串格式化,将变量插入到指定的位置,例如:```String result = String.format("Hello, %s!", name);```1.字符串替换使用String 的replace() 方法可以实现字符串的替换。
然而,这种方法需要传入一个正则表达式,使用起来不够直观。
使用String 模板可以更方便地实现字符串替换,例如:```String result = original.replace("old", "new");```使用String.format() 方法可以更方便地实现字符串格式化,例如:```String result = String.format("The number is %d", number);```三、String 的template 用法的实际应用1.实例一:字符串拼接在一个电商网站中,需要根据用户的名字生成欢迎信息。
template模板

template模板在现代社会中,技术的发展迅速,信息的传递变得更加高效。
对于程序员来说,template模板是一个非常常见的工具,它可以减少我们的代码量,提高我们的代码质量,让我们在开发中变得更加高效。
什么是template模板?简单来说,template模板就是在编译阶段根据传入的数据类型生成对应的函数或类。
它的优点主要有以下几个:1. 减少代码量使用template模板可以减少我们的代码量,因为我们不需要为每个数据类型都写一个函数或类,只需要根据需要传入不同的数据类型即可。
2. 提高代码质量使用template模板可以提高我们的代码质量,因为我们可以将代码的重复部分封装成一个模板,这样可以减少出错的可能性,也可以让代码更加清晰易懂。
3. 提高开发效率使用template模板可以提高我们的开发效率,因为我们可以快速地生成适合不同数据类型的函数或类,这样可以让我们在开发中更加高效。
下面我们来看一个简单的例子:```c++template<class T>void swap(T& a, T& b){T temp = a;a = b;b = temp;}```在这个例子中,我们定义了一个模板函数,用于交换两个变量的值。
这个函数可以适用于任何类型的变量,这是因为我们使用了template关键字来声明了这个函数是一个模板。
当我们需要交换两个整数的值时,我们可以这样调用这个函数:```c++int x = 1, y = 2;swap(x, y);```当我们需要交换两个浮点数的值时,我们也可以这样调用这个函数:```c++float a = 1.1, b = 2.2;swap(a, b);```可以看到,使用template模板可以让我们的代码具备更加通用的特点,可以适用于不同的数据类型。
除了函数,我们也可以使用template模板来定义类。
下面是一个简单的例子:```c++template<class T>class Stack{private:T* data;int top;int size;public:Stack(int s){size = s;data = new T[size];top = -1;}void Push(T x){if (top == size - 1) return; data[++top] = x;}void Pop(){if (top == -1) return;top--;}T Top(){if (top == -1) return NULL;return data[top];}};```在这个例子中,我们定义了一个Stack类,用于存储任意类型的数据。
antlr stringtemplate 用法

antlr stringtemplate 用法ANTLR是一种流行的语言识别工具,它可以用于生成词法和语法分析器。
StringTemplate则是一种用于生成代码和文本的模板引擎。
这两个工具的结合可以让我们更轻松地生成我们想要的代码或文本。
ANTLR的用法主要分为四个步骤:定义语法、生成识别器、处理语法树和生成目标代码。
首先,我们需要定义我们要识别的语法。
ANTLR使用一种称为ANTLR语法规则的形式来描述语法。
ANTLR提供了丰富的语法规则,例如标记、识别语句、声明、规则等。
语法规则是由语法名称和规则定义组成的。
例如,我们可以定义一个语法规则来识别算术表达式:expr: NUM '+' NUM;这个规则定义了一个名为expr的语法,它由两个NUM和一个“+”符号组成。
识别这个语法规则的ANTLR会生成相应的识别器。
第二步是生成识别器。
我们可以使用ANTLR的命令行工具来生成识别器代码。
例如,我们可以使用以下命令来生成Python的识别器:antlr4 -Dlanguage=Python3 MyGrammar.g4这将生成一个MyGrammarLexer.py和一个MyGrammarParser.py文件,它们包含了识别器的代码。
第三步是处理语法树。
一旦我们有了识别器代码,我们就可以使用它来识别输入的代码,并生成一个语法树。
ANTLR提供了一种称为Visitor模式的API,可以帮助我们遍历和处理语法树的节点。
例如,我们可以使用以下代码来计算算术表达式的结果:class MyVisitor(MyGrammarVisitor):def visitExpr(self, ctx: MyGrammarParser.ExprContext):left = int(ctx.NUM()[0].getText())right = int(ctx.NUM()[1].getText())return left + right这个visitExpr方法会在遍历到expr规则的节点时被调用,它获取两个NUM节点的文本,并将它们相加返回。
java template类用法
Java Template类用法在Java编程中,Template类是一个非常有用的工具。
它允许我们定义一个通用的模板,然后根据具体的需求进行实例化。
Template类提供了一种灵活和可复用的方式来生成代码或文本。
1. 什么是Template类?Template类是一种设计模式,它用于创建可重用的代码模板或文本模板。
它定义了一些可替换的占位符,这些占位符可以在实例化Template对象时动态地替换为实际的值。
这使得我们可以在不改变模板的情况下生成具体的代码或文本。
2. 如何使用Template类?使用Template类的一般步骤如下:•定义一个模板字符串,其中包含一些占位符,如${name}或{{value}}。
•创建一个Template对象,并将模板字符串作为参数传递给构造函数。
•使用Template对象的方法,例如setParameter或fillTemplate,将实际值传递给相应的占位符。
•调用toString方法获取生成的代码或文本。
下面是一个简单的示例,演示了如何使用Template类生成一段代码:String templateString = "public class ${className} {\n" +" public static void main(String[] args) {\n" +" System.out.println(\"Hello, ${name}!\");\n" + " }\n" +"}";Template template = new Template(templateString);template.setParameter("className", "MyClass");template.setParameter("name", "John");String code = template.toString();System.out.println(code);该示例使用一个模板字符串来生成一个Java类的代码。
stringtemplate4语法
stringtemplate4语法StringTemplate 4 是一个强大且灵活的模板引擎,它使用简单明了的模板语法来生成文本输出。
以下将介绍一些StringTemplate 4 的重要语法特性和用法。
1. 模板声明在 StringTemplate 4 中,模板以 `«...»` 来声明。
例如,`«name»` 表示一个名为 "name" 的模板。
模板可以包含任意数量的文本和嵌入式表达式。
2. 属性引用通过使用 `«propertyName»` 的方式,可以在模板中引用对象的属性。
模板引擎会根据属性名称自动查找并替换为相应的属性值。
3. 嵌入式表达式嵌入式表达式用 `«expression»` 的形式嵌入到模板中,它可以是一个简单的属性引用,也可以是一个更复杂的表达式。
例如,`«if(condition) then expression1 else expression2»` 可以用来进行条件判断。
4. 列表循环在 StringTemplate 4 中,可以使用 `«foreach(itemName;list)»...«end»` 语法来进行列表循环。
其中,`itemName` 是一个用于引用当前迭代项的变量名,`list` 代表要循环的列表。
5. 区域定义区域定义允许我们在模板中定义一个局部区域的内容,并通过`«regionName()»...«end»` 的方式来使用。
这对于重复使用相同模板的不同部分非常有用。
6. 条件判断StringTemplate 4 提供了一些用于条件判断的内置函数,如`if(...)`, `elseif(...)`, `else`, `endif` 等。
通过使用这些函数,可以根据条件来控制模板中的输出。
template的作用
template的作用Template的作用一、什么是TemplateTemplate是一种在编程中常用的模板技术,它可以将代码逻辑和数据分离开来,使得程序更易于维护和扩展。
通俗地说,就是将一些常用的代码片段封装起来,以便在需要时直接调用。
二、Template的优点1. 提高开发效率:使用模板可以减少重复的代码编写,提高开发效率。
2. 降低维护成本:通过将代码逻辑和数据分离开来,使得程序更易于维护和扩展。
3. 提高可读性:使用模板可以使代码更加清晰易懂,提高可读性。
4. 方便修改:如果需要修改某个功能或界面,只需要修改模板文件即可。
5. 提高安全性:使用模板可以避免一些安全漏洞,如SQL注入等。
三、Template在Web开发中的应用1. 网页模板:在Web开发中最常见的应用就是网页模板。
通过定义一个网站的通用结构和样式,在不同页面上只需要填充不同的内容即可。
这样做不仅提高了网站制作效率,而且也保证了网站整体风格的统一性。
2. 邮件模板:邮件发送是Web应用中常见的功能之一,而邮件模板则是将邮件的内容和格式进行封装,使得发送邮件时只需要填充相应的内容即可。
3. 表单模板:Web应用中表单是不可避免的,而表单模板则是将表单的HTML代码进行封装,使得在不同页面上只需要调用相应的模板即可。
4. 数据库模板:数据库操作也是Web应用中常见的功能之一,而数据库模板则是将数据库操作封装起来,使得在不同页面上只需要调用相应的函数即可完成对数据库的操作。
四、Template在桌面软件开发中的应用1. 界面模板:桌面软件开发也可以使用界面模板。
通过定义一个软件通用界面样式,在不同页面上只需要填充不同的内容即可。
这样做不仅提高了软件制作效率,而且也保证了软件整体风格的统一性。
2. 报表模板:报表是桌面软件中常见的功能之一,而报表模板则是将报表样式进行封装,使得生成报表时只需要填充相应的数据即可。
3. 打印模板:打印功能也是桌面软件中常见的功能之一,而打印模板则是将打印样式进行封装,使得生成打印内容时只需要填充相应的数据即可。
template使用方法
标题:Template使用方法详解引言:Template(模板)是一种广泛应用于各种文档、文件和编程代码中的工具,它能够提供结构化、标准化的基础框架,帮助用户更高效地创建内容。
本文将详细介绍Template的使用方法,包括概念解析、常见应用场景以及步骤指南,旨在帮助读者充分了解和灵活运用Template。
一、概念解析1.1 什么是Template?Template是一种预先定义好的文档或代码框架,其中包含了固定的格式、样式和占位符。
它可以被复制并填充特定内容,从而快速生成符合特定需求的文档或代码。
1.2 Template的优势- 提高工作效率:使用Template可以减少重复性工作,节省时间和精力。
- 统一标准:Template提供了统一的格式和样式,确保文档或代码的一致性和规范性。
- 灵活性:Template中的占位符可以根据实际需求进行替换和修改,使其适应不同的场景和要求。
二、常见应用场景2.1 文档模板- 合同和协议:使用合同模板可以快速生成符合法律要求的合同文档。
- 报告和演示:使用报告模板可以规范化报告的结构和格式,提高信息传达效果。
- 信函和邮件:使用邮件模板可以快速编写邮件,减少繁琐的重复工作。
2.2 编程代码模板- 网页开发:使用网页模板可以快速搭建网站的基本结构和样式。
- 数据分析:使用数据分析模板可以加速数据处理和统计分析的流程。
- 应用开发:使用应用模板可以快速创建应用程序的基础框架和功能。
三、Template使用步骤指南3.1 确定需求和目标在使用Template之前,首先需要明确自己的需求和目标,了解所需文档或代码的基本结构和内容。
3.2 查找合适的Template根据需求和目标,在各种资源中查找合适的Template。
可以通过搜索引擎、在线模板库、软件应用等途径获取。
3.3 下载或创建Template将找到的Template下载到本地计算机,或者根据自己的需求和目标创建一个新的Template。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
接下来的发展阶段就是引入了JSP [6],大致看来是前进了一大步。JSP文件本质上就是servlets,将Java 代码嵌入在HTML文件中,由服务器自动转化为servlets。前面“hello”页面的JSP版本看起来就是下面这样: <html> <body> <h1>JSP test</h1> Hello, <%=request.getParameter("name")%>. </body> </html>
很不幸,在最终期限的压力下,只要可能,程序员会经常使用这个退路作为权宜之计,导致逻辑和显示 混杂。一个负责公司服务器数据模型的程序员告诉我,离最终期限他只有3天多时间,但如果强制他们的程序 员采用分离原则,修改那些受影响的多语言页面显示需要10天。为将来的维护考虑做正确的事情,他可能面 临被解雇的风险,或者他可以通过数据模型将新的HTML输出到页面,从而保住他的工作,将这种混乱留给 以后或者其它程序员。
我的目的是使对模板引擎的研究形式化,因此提供一个通用的术语,这个术语是一种对模板生成能力分 类的方法,是对形式语言理论(formal language theory)感兴趣的补充。类似 Chomsky 的 1..3 型语法分类, 我把限制性模板(restricted template)分成三种类型,并且形式的定义分离,包括实现分离的规则。
问题在于在Java代码中声明HTML很烦杂,是一种错误导向,HTML无法由界面设计师编写。为了改善 这种状况,程序员可以尝试将普通的HTML输出元素提取成Java呈现对象(Java rendering objects),例如Table、 BulletList,但终究还是在servlets中嵌入HTML方式。
理想是否可能?就是说我们是否可以强制分离却又不消弱模板引擎的生成能力?限制性引擎导致一些
版权归原作者所有 WWW2004, May 17–20, 2004, New York, New York, USA. ACM 158113844X/04/0005.
页面无法处理?通常理论跟实践是不一致的。理论表明一个完全图灵机式的模板引擎能够生成任何页面,并 且比限制性模板引擎更强大。实际中我建立web服务器的经验,例如(11万行),提供了有力的证 据,表明程序员实际上在这两个方面可以获得最好的效果:分离和足够的生成能力。过去五年我在构建站点 和打造我的StringTemplate模板引擎过程中,实际上是进行了一项软件设计的试验,在我的模板中严格的避免 逻辑和运算(译注:对上面例子的解释,完全图灵机式的模板引擎=自由模板引擎,例如JSP、ASP;自由模 板引擎理论上强大,但实际中因模型视图混杂而问题很多;限制性引擎理论上能力弱,但作者的实际经验表 明能够在强制分离和足够的生成能力两方面获得最好的效果)。尽管这些微不足道的证据还不能证明我的限 制性引擎合格,另一方面就算绝大部分模板引擎的能力通过泰勒级数(Taylor series)接近sin(x)(译注:意 指100分?),我不相信一个设计师真的需要。
常规项: 语言
关键词: 模板引擎,Web应用,模型-视图-控制器
1. 简介 对动态生成web页面的需求,例如上的图书显示页面,导致众多模板引擎的开发趋向于使web
应用开发简单化,提高扩展性,降低维护成本,允许编码和HTML的开发并行。这种诱人的好处促进了模板 引擎的发展,这完全来自一个原则:将页面的业务逻辑声明(specification)和数据处理声明,与页面怎样显 示这些信息的声明分离。通过隔离封装的声明,模板引擎促进了组件复用,可插拔的站点外观,通用组件的 单点变化(single-points-of-change),良好的系统清晰度。
尽管JSP模板引擎解决了一些烦人的问题,很多人仍无法定位JSP不适用于大型系统的主要原因1。模板应 当只是呈现数据系列的视图,完全与后台数据处理分开,只是显示后台数据处理的结果。如果模板语言功能 太强,模板设计者可能就会混杂模板和业务逻辑,下面的章节详细说明为什么应当避免这样的混杂。
1尽管的页面URLs以.jsp结束,其实根本就不是JSP文件,去掉JSP后缀后,我们使用页面名字作为向 后链接的替代。
尽管JSP不是最终方案,但它确实将模板概念带进了程序员的思想中。模板是一个HTML文档,拥有一些 填充点,可以使用数据或者是一些简单行为的结果来填充。不幸的是几乎每个模板引擎都在重演JSP的错误, 它们提供一个完全图灵机式工具化的(Turing-complete tool-specific)编程语言,嵌入到HTML中,就像JSP 一样,然后设计师不得不考虑用程序处理各种突发情况,而不顾及页面模型。
到此我提出的观点是严格的强制分离不仅是有用的设计原则,而且通过选择正确的模板结构实际上是可 行的。第2节描述模板引擎怎样从之前的策略发展到目前解决各种实际设计问题,第3节明确的阐述分离的好 处,第4节说明模型-视图-控制器模式怎样自然的运用到服务器端设计,以及怎样实现逻辑(模型)和显示(视 图)的分离。第5和第6节正式的定义模板和三个限制性模板类型,第7和第8节定义严格的模型-视图分离原则, 以及怎样避免混杂,最后第9节演示StringTemplate引擎解决一些重要的HTML生成任务。
关键是不提供允许违背分离的结构,而使模板引擎具备足够的生成能力。在研究了我的站点上几百个模 板文件之后,我确定只需要四种模板结构:属性引用(attribute references),包括判断属性是否存在的条件 模板(conditional template),递归模板引用(recursive template references),以及最重要的类似lambda函数 和LISP的map这样对多值属性操作的模板应用(template application)。
3. 分离动机 使用模板引擎的主要目的是在思想和机制上将逻辑和数据处理与显示分离。Web站点开发情况下,这基
本意味着代码中不存在HTML,HTML中没有代码。下面是程序员和界面设计师需要这种分离的一些原因: 1. 封装:站点外观完全包含在模板中,业务逻辑完全位于数据模型里,每一部分都是完整的实体。 2. 清晰度:模板不是生成HTML页面的程序,它是界面设计师或程序员可以直接阅读的HTML文件。 3. 分工:编码人员开发时界ห้องสมุดไป่ตู้设计师可以并行建立模板,可以通过聘请一个界面设计师(通常不会太 昂贵)降低程序员的负担,还可以节约沟通成本:界面设计师可以不用与程序员交流直接修改 HTML。开发过程中我们不断的验证这种界面设计师和编码人员独立工作的方式。 4. 组件复用:正如程序员为了提高清晰度和复用能力,将大的方法切分成小的方法一样,界面设计师 可以轻松的将模板提取成一系列子模板,例如功能区、导航栏、搜索框、数据列表等。混杂的模板 很难提取,并且很难与其它的数据源一起搭配复用。 5. 单点变化:因为能够提取模板,界面设计师就能够抽象出链接一样小的元素,以及用户记录视图一 样较大一些的项目。假如以后需要改变站点中每个用户列表的样式,界面设计师只需简单的修改一 个模板文件,这也避免某个行为变化时修改多个地方而引入错误。模型中某个行为变化时只需要修 改一个地方也非常重要,需要在模板中避免逻辑,例如“是管理员”这样的逻辑可能会在模板的多 个地方重复。 6. 维护性:更换站点外观只需要修改模板而不是程序,修改程序的风险远远大于修改模板。另外,修 改模板不需要重启正在使用的服务器应用,而代码修改通常需要重新编译和重启。 7. 可更换的视图:将数据模型和显示混杂,页面工程师无法象使用“皮肤”一样轻易的更换新的站点 外观。在,每一种站点外观是一个叫做分组的模板集合,分组之间的外观可能完全不一样 (针对那些简单的更换颜色、字体而言)。显示页面时,一个简单的指示器告诉页面控制器该使用 哪个模板分组。 8. 安全性:模板应用于页面客制化在博客中是一个通用的功能,不过正如微软Word中的宏一样,自由 模板带来严重的安全隐患。的博客在class loader调用方面经受大量的攻击之后,从 Volocity [19]切换到了StringTemplate。人们也会想到一种简单但有效的攻击方式-死循环,正如本文 所支持的观点,严格的将模型和视图隔离,禁止视图中的控制指令,等于安全性的提高。 程序员常常认为也不断的争论,严格的操作花费更多的时间。尽管在小规模情况下也许是这样,例如在
2. 模板引擎的发展 生成动态页面意味着服务器不再将URL映射到磁盘HTML文件,取而代之的是映射到一堆代码,这些代
码丢出正确的HTML,包括内容和相关的显示指令。在这我将描述Java引擎的发展,这些概念同样适用于Perl、 VisualBasic等。
Java从Servlets [15]开始支持服务器开发,它调用那些响应HTTP GET和POST命令的方法,通过输出语句 生成HTML。例如下面是一个简单servlet的主要处理,它生成一个页面,向URL参数传入的姓名问候“hello”。 out.println("<html>"); out.println("<body>"); out.println("<h1>Servlet test</h1>"); String name = request.getParameter("name"); out.println("Hello, "+name+"."); out.println("</body>"); out.println("</html>");