基本信息
Lite基本语法,命名为LiteXML,是一个基于XML的基本模板语法聚合,包括最基本的模板功能。
名称空间
LiteXML所属名称空间为:http://www.xidea.org/lite/core
推荐前缀是c。支持的标签有 :
支持模式
LiteXML支持标记,属性和文本三种模式,这里为了简单起见,只列出标记模式。
表达式输出语法
自动编码输出
${user.name}。功能: 更具自身在XML文档中出现的位置,自动编码括弧内的表达式值的xml特殊字符并输出。
说明: 这个输出是自动编码的,如果在TextNode中,编码<&(允许>直接输出);如果在XML属性中,还要编码"'。若需要原始文本输出,如果在CDATA中,不会编码;
如果需要直接输出html/xml代码,可以使用:$!{html}语法
- 模版表达式求值行为:
表达式求值过程中是一个读取变量/常量,并可能对其做一些运算处理,返回一个唯一值的过程。
不编码直接输出
$!{user.name}功能: 输出表达式原值(不编码),! 符号提醒您:这是未经过编码的值输出,可能包含危险代码。
说明: 与标准输出方式唯一的区别是:不编码。
因为输出的是未编码的字符串,可以包含危险的html源码,网页上容易引发XSS漏洞。实际编码过程中,应该尽量避免使用,在设计过程中也应该尽量避免不编码输出的需求,以便通过模板语法约束确保网页安全。
属性内表达式
<input type="button"
class="prefix-${className}"
onclick="${clickScript}"
onmouseover="${overScript}"/>功能: 输出表达式值(自动编码),与自动编码输出不同的是,如果属性值不包含静态文本,仅有一个表达式且表达式值为null,则整个节点将不被输出。
说明: 这是基于XML的模板语法的一大亮点:条件输出属性的时候,在XML语法约束下,省去了繁琐条件判断。
控制标签
条件标签
<c:if test="${index == 0}">[${index},</c:if>
<c:else test="${index == end}">${index}]</c:else>
<c:else>${index},</c:else>选择标签
<c:choose >
<c:when test="${type == 1}">分支1</c:when >
<c:when test="${type == 2}">分支2</c:when >
<c:otherwise>分支3</c:otherwise>
</c:choose >功能: 选择第一个条件执行,如果没有命中,执行c:otherwise节点。
说明: 这一系列标签其实和if else系列等价,翻译后的目标代码也万全相同。他们的出现,只是为了更加清晰的语法表现手段,而非内核功能的增加。
循环标签
<c:for var="item" list="${list}">
${for.index}:${item}.
</c:for>
<c:else>没有找到任何记录</c:else>for标签属性: - var : 字符串,且内容为合法变量名(Java/JavaScript)。
- list : EL, 循环数据(早期版本中该属性名为:items),可以是数组或java,util.Collection 实例,也可以是整数(表示循环次数)。
- status : 可选属性,表示状态变量名,是该循环内for状态的别名。
- 功能:
对list表达式中的数据循环,将每个元素依次申明为var中指定的名称的变量。
如果list表达式为整数时,var变量将自1开始,直至list值(可等于)结束。
- for状态数据结构说明
{index:0,lastIndex:6}。循环过程中将维护for的状态(index属性),用户在循环体内使用${for.index}获取当前循环的重复次数(从0开始)。
- else 标记说明:
当其与for循环组合,当for循环执行0次后,与其配合的else节点可以执行(常见于做空循环的友好提示,如没有查询到任何数据)。
变量申明标签
通过属性值申明变量
<c:var name="myName" value="${user.name}" />- 属性表:
- name : 变量名称。
- value : El表达式(非必要,若无,取子节点渲染数据)
- 功能:
定义变量,内容来自value属性。
通过子节点申明变量
<c:var name="myName" >
${user.firstName} ${user.lastName}
</c:var>- 功能:
定义变量,变量名称是name属性,内容来自子节点输出的文本。
模板函数定义标签
模板中常见一些重复的逻辑,我们需要重用代码,编写模板函数是一种有效的用模板来扩充模板系统内置函数,做好代码重用的方法。
<!-- 这里的内容会编译成文本处理函数,将插入到模板的默认变量集中 -->
<c:def name="userRow(user)">
<tr>
<td>${user.name}</td>
<td>${user.city}</td>
</tr>
</c:def>
<!-- 使用函数 -->
<table>
<c:for var="user" list="${users}">
$!{userRow(user)}
</c:for>
</table>属性表: - 功能:
定义一个文本渲染函数,并以函数名为变量名将其添加到模板内置变量集中,以后该模板就可以像其他内置函数一样调用这个自定义函数了。
自定义模板函数中不能访问出内置变量之外的其他模板变量,如需使用其他变量,需要将需要的变量作为参数传入。
编译期标签
包含标签
<c:include path="menu.xhtml"/>
<c:include path="controls.xhtml" xpath="//*[@id='pageList']"/>
<c:include path="${page}" xpath="//xhtml:body"/>属性表: - path :字符串,可选,未指定时代表需要包含的文档为当前文档。可以是表示一个相对路径,也可以指定一个编译上文的变量(如,页面装饰其实现中,先将目标模板文档对象,作为编译上下文的${page}变量,能后解析布局模板)
- xpath :字符串,可选,用于选取文档片段的xpath语句。
- 说明:
xpath确实有点烦琐,但毕竟事标准,标准永远不是最好的,但他是可行的。
继承标签
#标签语法
<c:extends path="parent.xhtml">
<c:block name="member1">....</c:block>
</c:extends>
属性表: - path :用于<c:extends 标签,字符串,必选,用于指定需要继承的父模板路径。
- name :用于<c:block 标签,用于指定区域名称。
- 功能:
从继承父模板开始渲染,遇到c:block节点时,从子页面寻找同名替代节点,取代父模板的同名节点。
<c:for var="item" list="${list}"> ${for.index}:${item}. </c:for> <c:else>没有找到任何记录</c:else>for的list属性好像不行,应该是items,不知道从什么版本开始的。在这个地方被折腾了好几个小时了。
2.0开始用list取代items, 原因是list 这个名字更常见,也好写.