第五十章 开发自定义标签 - 使用Rule类

简介: 第五十章 开发自定义标签 - 使用Rule类

第五十章 开发自定义标签 - 使用Rule类

使用Rule类

规则编译器为每个被编译的规则定义生成一个类。 匹配规则时执行的正是这段代码。 这意味着

  1. 规则可以更强大
  2. 可以直接将规则创建为类,并且
  3. 可以在Studio中查看和编辑规则类。

生成的规则类的结构

当从.csr文件编译规则时,创建的规则类包含一个RenderStartTag方法,如果在规则定义中指定了编译时代码,则包含一个或多个CompilerMethod方法。 如果<csr:children><csr:default>标记在规则定义中,RenderEndTag方法也会被添加到类中。 虽然CompilerMethod方法包含要在编译时执行的代码,但RenderStartTagRenderEndTag方法都由一系列Write方法组成,用于直接写入CSP页面类的代码表达式。 所使用的Write方法的类型取决于表达式。 写方法在。%CSP.AbstractAtom中定义,并将在本章后面讨论。

下面是一个属于<csr:if>规则的规则类。 它包含一个RenderStartTagRenderEndTag方法,并有CompilerMethod的两个实例。 下面将进一步详细解释每一种方法。

Import User
Class %csr.csp.IF Extends %CSP.RuleBlock
{
Parameter CSRURL = "w:/csp/rules/Control.csr";
Method CompilerMethod1() [ Language = cache ]
{
 Do ..NewBlock()
 Set ..NextLabel=..GetNewLabel()
 Do ..WriteServer(
   " If '("
     _ $$UnEscapeHTML^%cspQuote(..GetAttribute("condition","0"))
     _ ") Goto "
     _ ..NextLabel
     _" ;{"
   )
}
Method CompilerMethod2() [ Language = cache ]
{
 New comment Set comment=" ;}"
 If ..EndLabel'="" Do ..WriteServer(..EndLabel_comment) Set comment=""
 If ..NextLabel'="" Do ..WriteServer(..NextLabel_comment)
 Do ..RemoveBlock()
}
Method RenderEndTag() As %Status
{
 New element Set element=##this
 Set %statuscode=$$$OK Do ..CompilerMethod2()
 Quit:$$$ISERR(%statuscode) %statuscode
 Quit $$$OK
}
Method RenderStartTag() As %Status
{
 New element Set element=##this
 Set %statuscode=$$$OK Do ..CompilerMethod1()
 Quit:$$$ISERR(%statuscode) %statuscode
 Quit $$$PROCESSCHILDREN
}
}
复制代码

RenderStartTag方法

RenderStartTag方法在呈现CSP页面中的开始标记时被调用。RenderStartTag将代码写入呈现该元素的例程构建器对象中。 在<csr:action>的主体中,出现在<csr:children>标记之前的文本将使用一系列不同的写方法写入例程构建器对象,具体取决于要写入的文本类型。

例如,以下代码:

<csr:action>
<script language="Cache" runat=server>
   Set myfile="c:\temp.txt"
   Open myfile:("FR":100)
   Use myfile:()
   Read var1
   Close myfile
</script>
</csr:action>
复制代码

结果是在编译时在创建的规则类中生成以下RenderStartTag方法:

Method RenderStartTag() As %Status
{
 New element Set element=##this
 Do ..WriteCSPServer(" Set myfile=""c:\temp.txt""",0)
 Do ..WriteCSPServer(" Open myfile:(""FR"":100)",1)
 Do ..WriteCSPServer(" Use myfile:() ",1)
 Do ..WriteCSPServer(" Read var1",1)
 Do ..WriteCSPServer(" Close myfile",1)
 Quit $$$SKIPCHILDREN
}
复制代码

RenderStartTag方法可以包含其他语句,这取决于规则定义的结构。 如果在操作中指定了<script runat=compiler>标记,导致创建了CompilerMethod方法,则在RenderStartTag方法的开头使用以下命令调用CompilerMethod方法(在CompilerMethod1实例中显示):

Set %statuscode=$$$OK Do ..CompilerMethod1()
Quit:$$$ISERR(%statuscode) %statuscode
复制代码

除了不同的Write方法和对CompilerMethod方法的调用之外,RenderStartTag方法还可以包含其他命令,这取决于<csr:action>定义中是否使用了一个或多个csr标记。

Quit语句 <csr:children>

如果<csr:children>标签在.csr文件中,那么生成的RenderStartTag方法的最后一行是:

Quit $$$PROCESSCHILDREN
复制代码

这表明在RenderStartTag方法完成后应该处理子元素。RenderEndTag方法也被显式地写入类,并写入<csr:children>标记被调用之后出现的语句(默认情况下,RenderEndTag方法什么也不做)。

Quit语句 <csr:default>

如果在动作定义中使用<csr:default>标签,生成的RenderStartTag方法包含以下命令:

Do ..RenderDefaultStartTag()
Quit $$$PROCESSCHILDREN
复制代码

CompilerMethod[n]() Method

如果为一个或多个<script>标记指定了runat=compiler,则CompilerMethod方法将从.csr文件生成。 它可以在RenderStartTag方法的任何位置调用,这取决于<script runat=compiler>语句的位置。 带有编译时代码的多个<script>标记生成多个CompilerMethod方法(CompilerMethod1()CompilerMethod2()等)。 与其他两个方法不同,.csr文件中的编译时ObjectScript语句被逐行复制到该方法的主体中。

例如,考虑.csr规则文件中的以下编译时代码:

<script language="Cache" runat=compiler>
   SET ^client(2,1,1)=..InnerText()
   </script>
复制代码

编译.csr文件时,在关联规则类中生成如下方法:

Method CompilerMethod1() [ Language = cache ]
{
    SET ^client(2,1,1)=..InnerText()
}
复制代码

RenderEndTag Method

如果<csr:children><csr:default>标记在.csr文件规则定义中,则在规则类中生成RenderEndTag方法。 它在呈现结束标记时被调用。 在<csr:children>标记之后出现的任何语句都将在此方法中写入例程构建器,类似于RenderStartTag方法。

下面是取自条形图的一个规则定义示例。CSP示例页面中的csr示例。 注意表声明中<csr:children>标记的位置。

<csr:rule name="iscbarchart" match="isc:barchart" language="any">
<csr:action>
<table bgcolor='##(..GetAttribute("BGCOLOR"))##' border=0 cellspacing=0
 style='border: ##(..GetAttribute("BORDER","solid blue"))##;'><tr>
<csr:children>
</tr></table>
</csr:action>
</csr:rule>
复制代码

编译之后,生成一个iscbarchart规则类,并调用处理RenderStartTag方法的Quit语句中的子类。 规则文件中<csr:children>标签后的HTML是用RenderEndTag方法编写的:

Import User
Class csr.csp.iscbarchart Extends %CSP.Rule
{
Parameter CSRURL = "w:/csp/samples/barchart.csr";
Method RenderEndTag() As %Status
{
 New element Set element=##this
 Do ..WriteText("",1)
 Do ..WriteCSPText("</tr></table>",0)
 Quit $$$OK
}
Method RenderStartTag() As %Status
{
 New element Set element=##this
 Do ..WriteText("",1)
 Do ..WriteCSPText(
  "<table bgcolor='##(..GetAttribute(""BGCOLOR""))##' border=0 cellspacing=0"
  ,1)
 Do ..WriteCSPText(
  " style='border: ##(..GetAttribute(""BORDER"",""solid blue""))##;'><tr>"
  ,0)
 Quit $$$PROCESSCHILDREN
}
}


相关文章
使用自定义的类CSetODBC(一)
使用自定义的类CSetODBC(一)
|
SQL 数据库连接 数据库
使用自定义的类CSetODBC(二)
使用自定义的类CSetODBC(二)
|
XML Java 数据格式
自定义jsp标签1
自定义jsp标签1
37 0
|
XML Java 程序员
自定义JSP标签
自定义JSP标签
|
Java
自定义jsp标签进阶
自定义jsp标签进阶
35 2
|
XML Java API
自定义JSP标签【上】
自定义JSP标签【上】
53 0
|
存储 安全 Java
自定义JSP标签【下】
自定义JSP标签【下】
48 0
|
安全 Java
自定义JSP标签01
自定义JSP标签01
33 0
|
Java
自定义JSP标签02
自定义JSP标签02
34 0
|
XML Java 数据格式
自定义jsp标签2
自定义jsp标签2
43 0