规则编译器为每个被编译的规则定义生成一个类。
匹配规则时执行的正是这段代码。
这意味着
Studio中查看和编辑规则类。当从.csr文件编译规则时,创建的规则类包含一个RenderStartTag方法,如果在规则定义中指定了编译时代码,则包含一个或多个CompilerMethod方法。
如果或标记在规则定义中,RenderEndTag方法也会被添加到类中。
虽然CompilerMethod方法包含要在编译时执行的代码,但RenderStartTag和RenderEndTag方法都由一系列Write方法组成,用于直接写入CSP页面类的代码表达式。
所使用的Write方法的类型取决于表达式。
写方法在。
%CSP.AbstractAtom中定义,并将在本章后面讨论。
下面是一个属于规则的规则类。
它包含一个RenderStartTag和RenderEndTag方法,并有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>
<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方法可以包含其他语句,这取决于规则定义的结构。
如果在操作中指定了标记,导致创建了CompilerMethod方法,则在RenderStartTag方法的开头使用以下命令调用CompilerMethod方法(在CompilerMethod1实例中显示):
Set %statuscode=$$$OK Do ..CompilerMethod1()
Quit:$$$ISERR(%statuscode) %statuscode
除了不同的Write方法和对CompilerMethod方法的调用之外,RenderStartTag方法还可以包含其他命令,这取决于定义中是否使用了一个或多个csr标记。
如果标签在.csr文件中,那么生成的RenderStartTag方法的最后一行是:
Quit $$$PROCESSCHILDREN
这表明在RenderStartTag方法完成后应该处理子元素。
RenderEndTag方法也被显式地写入类,并写入标记被调用之后出现的语句(默认情况下,RenderEndTag方法什么也不做)。
如果在动作定义中使用标签,生成的RenderStartTag方法包含以下命令:
Do ..RenderDefaultStartTag()
Quit $$$PROCESSCHILDREN
CompilerMethod[n]() Method如果为一个或多个标记指定了runat=compiler,则CompilerMethod方法将从.csr文件生成。
它可以在RenderStartTag方法的任何位置调用,这取决于语句的位置。
带有编译时代码的多个标记生成多个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()
}
如果或标记在.csr文件规则定义中,则在规则类中生成RenderEndTag方法。
它在呈现结束标记时被调用。
在标记之后出现的任何语句都将在此方法中写入例程构建器,类似于RenderStartTag方法。
下面是取自条形图的一个规则定义示例。
CSP示例页面中的csr示例。
注意表声明中标记的位置。
<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语句中的子类。
规则文件中标签后的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("",0)
Quit $$$OK
}
Method RenderStartTag() As %Status
{
New element Set element=##this
Do ..WriteText("",1)
Do ..WriteCSPText(
"=0 cellspacing=0"
,1)
Do ..WriteCSPText(
" style='border: ##(..GetAttribute(""BORDER"",""solid blue""))##;'><tr>"
,0)
Quit $$$PROCESSCHILDREN
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
-
相关阅读:
Ubuntu20上离线安装samba
【STM32】标准库的引入
ADAudit Plus:助力企业安全的权威选择
nodejs+vue大学食堂订餐系统elementui
ExceptionLess的安装、配置、使用
Spring整合MyBatis
高并发场景防止超卖的实现
uCOSIII实时操作系统 十一 消息传递
Spring 面向切面编程 第3关:AOP实现原理-JDK动态代理
部署LVS-DR群集【实验】
-
原文地址:https://blog.csdn.net/yaoxin521123/article/details/127914971