posts - 176, comments - 240, trackbacks - 0, articles - 7

tpl标签定义

Posted on 2005-11-27 20:32 canonical 阅读(1097) 评论(0)  编辑  收藏 所属分类: Witrix开发平台
    tpl自定义标签的设计目标之一是尽量减少配置说明项. 在tpl标签库中, 标签定义格式如下
    <标签库名称>
        <自定义标签名 demandArgs="argA, argB"
            importVars="varA, varB"
            otherArgs="optionalArgA, optionalArgB" localScope="trueOrFalse" >

            自定义标签的内容, 可以是任何tpl代码
        </自定义标签名>

    </标签库名称>

    demandArgs中指定调用时必须给定的参数的名称列表, importVars指定从调用环境中导入的变量的名称列表,otherArgs指定可选参数的名称列表. demandArgs, importVars和otherArgs这三者的集合包含了所有该自定义标签能够接受的参数. tpl编译器会检查这些调用规则是否被满足. 在运行的时候, 未指定的可选参数会被初始化为null.

    在调用时明确的指定的变量值会覆盖importVars导入的变量值. 例如
    <c:set var="varA" value="a" />
    <MyLib:自定义标签名 /> // 根据importVars设定, 在此标签内varA的值为a
    <MyLib:自定义标签名 varA="b" /> // args设定会覆盖importVars导入的值,因此在标签内部 varA的值为b
    // 调用标签完成后, varA的值恢复为a

    tpl中的参数声明方式是非常简化的,但是它仍然保留了最关键的信息:变量名称. 而在弱类型的Expresison Language中, 变量类型本来就不重要. 与jsp tag中的标签声明作个对比.
     <tag>
        <name>template</name>
        <tagclass>edu.thu.web.tags.TemplateTag</tagclass>
        <bodycontent>JSP</bodycontent>
        <attribute>
            <name>src</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
    </tag>
    jsp tag这种标签声明方式非常冗长, 提供的有效信息密度很低, 而相对于tpl标签的声明方式所能够提供的附加信息也没有很大的意义. 这种设计上的问题也深深的影响到JSF等派生技术.

    localScope参数指定了此自定义标签是否具有局部变量环境, 如果为true(缺省值),  则调用此标签的时候会自动进行变量压栈处理, 在标签内部无法访问参数列表之外的变量, 运行中所产生的临时变量也不会影响到外部环境. tpl中的变量堆栈与webwork的ValueStack机制是有一些差异的. webwork2中的ognl语言在访问OgnlValueStack中的对象的时候缺省采用的是一种递归查找机制, 即在当前环境中找不到对象, 则自动查找上一层环境中的变量. tpl中的标签结构可以多重嵌套, 产生非常复杂的结构, 所以缺省情况下tpl标签采用了类似于函数堆栈的设计, 在子标签中的代码一般情况下是无法访问父标签环境中的变量的(除非指定了localScope参数为true). localScope支持与importVars机制相结合之后, 我们可以实现比OgnlValueStack更加灵活也更加稳健的变量访问策略.  


只有注册用户登录后才能发表评论。


网站导航: