关于自定义服务器行为
Dreamweaver 提供了一组内置的服务器行为,使您能够方便地向站点添加动态功能。您可以扩展 Dreamweaver 功能,方法是创建满足开发需要的服务器行为,或者从 Dreamweaver Exchange Web 站点获取服务器行为。
在创建您自己的服务器行为之前,请查看 Dreamweaver Exchange Web 站点,了解是否有人已经创建了能提供您希望添加到 Web 站点的功能的服务器行为。通常,第三方开发人员已经创建了能解决您需要的服务器行为并进行了测试。
访问 Dreamweaver Exchange
在 Dreamweaver 中安装服务器行为或其它功能扩展
自定义服务器行为工作流程
如果您是一位精通 ColdFusion、JavaScript、VBScript 或 PHP 的开发人员,则可以编写自己的服务器行为。创建服务器行为的步骤包括下列任务:
编写一个或多个执行所需动作的代码块。
指定代码块在页面的 HTML 代码内的插入位置。
如果服务器行为要求为参数指定值,则创建一个对话框,提示使用该行为的 Web 开发人员提供一个适当的值。
在将该服务器行为提供给他人使用之前,对其进行测试。
使用服务器行为创建器
使用“服务器行为创建器”可以添加由服务器行为插入到页中的代码块。
高级选项
为每个代码块指定源代码和插入位置之后,服务器行为就被完全定义了。在大多数情况下,不必再指定其它任何信息。
如果您是高级用户,则可以设置以下任何选项:
标识符
指定代码块是否应被视为标识符。
默认情况下,所有代码块都是标识符。如果 Dreamweaver 在文档的任何地方发现标识符代码块,则会将该行为列在“服务器行为”面板中。“标识符”选项用于指定代码块是否应视为标识符。
服务器行为的代码块中至少有一个必须为标识符。如果为下列情况之一,则代码块不应为标识符:同一个代码块被其它服务器行为使用;或者代码块非常简单,可能会在页面上自然发生。
服务器行为标题
指定“服务器行为”面板中行为的标题。
当页面设计者单击“服务器行为”面板上的加号 (+) 按钮时,新服务器行为的标题将出现在弹出菜单中。当设计者将服务器行为的实例应用于文档时,该行为将出现在“服务器行为”面板中的已应用行为列表中。“服务器行为标题”框用于指定加号 (+) 弹出菜单和已应用行为列表的内容。
该文本框中的初始值为在“新建服务器行为”对话框中提供的名称。定义参数后,该名称会自动更新,这些参数即会出现在服务器行为名称后面的括号中。
Set Session Variable (@@Name@@, @@Value@@)
如果用户接受默认值,括号前面的所有内容(例如,设置会话变量)都将出现在加号 (+) 弹出菜单中。带有参数的名称将出现在已应用行为列表中,例如,设置会话变量 ("abcd", "5")。
选定代码块
指定当用户在“服务器行为”面板中选择该行为时将选定的代码块。
在应用服务器行为时,行为中的一个代码块被指定为“选定代码块”。如果应用某个服务器行为,然后在“服务器行为”面板中选择该行为,将会在“文档”窗口选中所指定的块。默认情况下,Dreamweaver 将选择不在 html 标签上方的第一个代码块。如果所有代码块都在 html 标签上方,将选择第一个代码块。高级用户可以指定哪个代码块是选定的代码块。
创建代码块
在“服务器行为创建器”中创建的代码块封装在服务器行为中,服务器行为显示在“服务器行为”面板中。代码可以是指定服务器模型的任何有效的运行时代码。例如,如果选择 ColdFusion 作为自定义服务器行为的文档类型,则编写的代码必须是能在 ColdFusion 应用程序服务器上运行的有效的 ColdFusion 代码。
可以直接在“服务器行为创建器”中创建代码块,也可以从其它来源复制并粘贴代码。在“服务器行为创建器”中创建的每个代码块都必须为单个标签或脚本块。如果必须插入多个标签代码块,请将它们拆分为单独的代码块。
代码块中的条件
Dreamweaver 使您能够开发包含控制语句的代码块,使这些代码块按条件执行。“服务器行为创建器”使用 if、elseif 和 else 语句,并可能包含服务器行为参数。这允许您根据服务器行为参数间的 OR 关系值来插入备选文本块。
下例显示 if, elseif 和 else 语句。方括号 ([ ]) 表示可选代码,星号 (*) 表示零个或更多实例。若要仅在某个或某些条件适用时才执行部分代码块或整个代码块,请使用以下语法:
<@ if (expression1) @> conditionaltext1[<@ elseif (expression2) @> conditional text2]*[<@ else @> conditional text3]<@ endif @>
条件表达式可以是任何能够使用 JavaScript eval() 函数进行计算的 JavaScript 表达式,并可能包含用 @@ 标记的服务器行为参数。(@@ 用于区分参数和 JavaScript 变量与关键字。)
有效使用条件表达式
在 insertText XML 标签中使用 if、else 和 elseif 指令时,将对参与的文本进行预处理,以解析 if 指令,并确定在结果中包含哪一文本。if 和 elseif 指令采用表达式作为参数。条件表达式与 JavaScript 条件表达式情况相同,而且也可以包含服务器行为参数。诸如此类的指令使您可以根据服务器行为参数的值或者这些参数相互之间的关系来选择备选代码块。
例如,下面的 JSP 代码来自使用条件代码块的 Dreamweaver 服务器行为:
@@rsName@@.close(); <@ if (@@callableName@@ != ') @> @@callableName@@.execute(); @@rsName@@ = @@callableName@@.getResultSet();<@ else @> @@rsName@@ = Statement@@rsName@@.executeQuery(); <@ endif @> @@rsName@@_hasData = @@rsName@@.next();
条件代码块以 <@ if (@@callableName@@ != '') @>开头并以 <@ endif @> 结尾。根据代码,如果用户为服务器行为的“参数”对话框中的 @@callableName@@ 参数输入一个值,即如果 @@callableName@@ 参数值不为空或者 (@@callableName@@ != ''),那么条件代码块将由以下语句取代:
@@callableName@@.execute(); @@rsName@@ = @@callableName@@.getResultSet();
否则,条件代码块会由以下语句取代:
@@rsName@@ = Statement@@rsName@@.executeQuery();
定位代码块
在使用“服务器行为创建器”创建代码块时,必须指定这些代码块在页面的 HTML 代码中的插入位置。
例如,如果将代码块插入到开始 <html> 标签上方就必须随后指定代码块相对于相应页面 HTML 代码部分的其它标签、脚本和服务器行为的位置。典型示例包括将一个行为定位到也位于开始 <html> 标签上方的页面代码中的任何记录集查询之前或之后。
从“插入代码”弹出菜单选择定位选项时,“相对位置”弹出菜单中的可用选项会随之更改,以提供与该页面部分相关的选项。例如,如果在“插入代码”弹出菜单中选择“<html> 标签上方”,“相对位置”弹出菜单中的可用定位选项将反映该页面部分的相关选项。
下表显示了代码块插入选项以及每个插入选项可用的相对定位选项:
插入代码选项 | 相对位置选项 |
---|---|
<html> 标签上方 |
|
</html> 标签下方 |
|
相对于特定标签 | 从“标签”弹出菜单中选择一个标签,然后从标签定位选项中进行选择。 |
相对于选定内容 | 选定内容之前 选定内容之后 替换选定内容 环绕选定内容 |
若要指定自定义位置,必须为代码块指定一个高度。如果需要按照特定顺序插入多个代码块,请使用“自定义位置”选项。例如,若要在打开记录集的代码块后依次插入三个代码块,可以为第一个代码块输入高度 60,为第二个代码块输入 65,为第三个代码块输入 70。
默认情况下,Dreamweaver 为插入到 <html> 标签上方的所有打开记录集的代码块指定高度 50。如果两个或更多代码块的“高度”相当,则 Dreamweaver 将随机设置代码块间的顺序。
定位代码块(一般性说明)
相对于页面上的另一个标签定位代码块
相对于页面设计者选定的标签定位代码块
使用 loop 指令重复代码块
若要使部分代码块或整个代码块重复一定的次数,请使用以下语法:
<@ loop (@@param1@@,@@param2@@) @> codeblock<@ endloop @>
创建服务器行为时,可以使用循环结构将某个代码块重复指定的次数。
<@ loop (@@param1@@,@@param2@@,@@param3@@,@@param_n@@) @> code block <@ endloop @>
Loop 指令采用一列由逗号分隔的参数数组作为参数。在这种情况下,参数数组参数使用户能够为单个参数提供多个值。重复文本将被复制 n 次,其中的 n 代表参数数组参数的长度。如果指定多个参数数组参数,则所有数组的长度必须相同。在进行第 i 次循环计算时,参数数组的第 i 个元素将替换代码块中的相关参数实例。
在为服务器行为创建对话框时,可以向该对话框添加控件,从而使页面设计者能够创建参数数组。Dreamweaver 包括一个可用来创建对话框的简单数组控件。这个称作“文本域逗号分隔列表”的控件可以通过“服务器行为创建器”获得。若要创建更为复杂的用户界面元素,请参阅 API 文档,以创建包含可创建数组的控件(例如,网格控件)的对话框。
可以在条件指令中嵌套任意数量的条件或循环指令。例如,可以指定如果表达式为真,则执行循环。
下例显示如何使用这样的重复代码块来创建服务器行为(该示例为用于访问预存过程的 ColdFusion 行为):
<CFSTOREDPROC procedure="AddNewBook" datasource=#MM_connection_DSN# username=#MM_connection_USERNAME# password=#MM_connection_PASSWORD#> <CFPROCPARAM type="IN" dbvarname="@CategoryId" value="#Form.CategoryID#" cfsqltype="CF_SQL_INTEGER"> <CFPROCPARAM type="IN" dbvarname="@ISBN" value="#Form.ISBN#" cfsqltype="CF_SQL_VARCHAR"> </CFSTOREDPROC>
在本例中,CFSTOREDPROC 标签可以包含 0 个或更多 CFPROCPARAM 标签。但是,如果不支持 loop 指令,则没有办法在插入的 CFSTOREDPROC 标签内包括 CFPROCPARAM 标签。如果要在不使用 loop 指令的情况下,将此示例创建为服务器行为,则需要将此示例分成两部分:主 CFSTOREDPROC 标签和 CFPROCPARAM 标签,后者的成员类型为 multiple(多个)。
使用 loop 指令,可以按如下方式编写同一过程:
<CFSTOREDPROC procedure="@@procedure@@" datasource=#MM_@@conn@@_DSN# username=#MM_@@conn@@_USERNAME# password=#MM_@@conn@@_PASSWORD#> <@ loop (@@paramName@@,@@value@@,@@type@@) @> <CFPROCPARAM type="IN" dbvarname="@@paramName@@" value="@@value@@" cfsqltype="@@type@@"> <@ endloop @> </CFSTOREDPROC>
注: 忽略每个“@>”后的新行。
如果用户在“服务器行为创建器”对话框中输入下列参数值:
procedure = "proc1" conn = "connection1" paramName = ["@CategoryId", "@Year", "@ISBN"] value = ["#Form.CategoryId#", "#Form.Year#", "#Form.ISBN#"] type = ["CF_SQL_INTEGER", "CF_SQL_INTEGER", "CF_SQL_VARCHAR"]
则服务器行为将在页面中插入下列运行时代码:
<CFSTOREDPROC procedure="proc1" datasource=#MM_connection1_DSN# username=#MM_connection1_USERNAME# password=#MM_connection1_PASSWORD#> <CFPROCPARAM type="IN" dbvarname="@CategoryId" value="#Form.CategoryId#" cfsqltype="CF_SQL_INTEGER"> <CFPROCPARAM type="IN" dbvarname="@Year" value="#Form.Year#" cfsqltype="CF_SQL_INTEGER"> <CFPROCPARAM type="IN" dbvarname="@ISBN" value="#Form.ISBN#" cfsqltype="CF_SQL_VARCHAR"> </CFSTOREDPROC>
注: 除非是作为条件指令表达式的一部分,否则,参数数组不能在循环外使用。
使用 loop 指令的 _length 和 _index 变量
loop 指令包括两个内置变量,可用于嵌入的 if 条件。这两个变量为:_length 和 _index。_length 变量计算 loop 指令处理的数组长度,而 _index 变量计算 loop 指令的当前索引。为了确保这两个变量仅被识别为指令,而不是作为传递到循环中的实际参数,请不要将这两个变量中的任何一个包含在 @@ 对中。
使用内置变量的一个示例是将它们应用于 Page 指令的 import 属性。import 属性要求使用由逗号分隔的包。如果 loop 指令围绕整个 import 属性展开执行,您可能希望只在第一次循环迭代中输出属性名称 import=(这将包含右双引号 (")),而在最后一次循环迭代中不输出逗号。使用内置变量可将这一需要表示如下:
<@loop (@@Import@@)@> <@ if(_index == 0)@>import=" <@endif@>@@Import@@<@if (_index == _length-1)@>"<@else@>, <@ endif @> <@endloop@>
请求服务器行为的参数
服务器行为经常要求页面设计者提供参数值。该值必须在将服务器行为代码插入到页面之前插入。
通过在代码中定义由设计者提供值的参数,可以创建该对话框。然后,为服务器行为生成对话框,以提示页面设计者输入参数值。
注: 如果指定代码应当相对于页面设计者选择的特定标签进行插入(即,在“插入代码”弹出菜单中选择了“相对于特定标签”),系统将向代码块添加一个参数,而不需要您的干预。该参数向行为的对话框添加一个标签菜单,供页面设计者选择标签。
定义服务器行为代码中的参数
也可以高亮显示该字符串,然后单击“在代码块中插入参数”按钮。输入一个参数名称,然后单击“确定”。Dreamweaver 用包含在参数标记内的指定参数名称替换高亮显示字符串的每个实例。
Dreamweaver 使用参数标记中包含的字符串作为所生成对话框中控件的标签(请参阅下面的过程)。在前面的示例中,Dreamweaver 创建包含以下标签的对话框:
注: 服务器行为代码中的参数名称不能有任何空格。因此,对话框标签不能有任何空格。如果要在标签中包含空格,可以编辑生成后的 HTML 文件。
为服务器行为创建一个对话框,以请求参数值
查看对话框
单击“服务器行为”面板(“窗口”>“服务器行为”)中的加号 (+) 按钮,然后从弹出菜单中选择您的自定义服务器行为。
编辑为服务器行为创建的对话框
编辑和修改服务器行为
您可以编辑用“服务器行为创建器”创建的任何服务器行为,其中包括从 Dreamweaver Exchange 网站下载的服务器行为以及由其他第三方开发商提供的服务器行为。
如果您将一个服务器行为应用于页面,然后在 Dreamweaver 中编辑该行为,则原有行为的实例将不再出现在“服务器行为”面板中。“服务器行为”面板将搜寻页面,查找与已知服务器行为代码相匹配的代码。如果服务器行为代码发生了更改,则面板不会识别页面上该行为的以前版本。
在面板中保留行为的原有版本和新版本
单击“服务器行为”面板(“窗口”>“服务器行为”)中的加号 (+) 按钮,选择“新建服务器行为”,创建原有服务器行为的副本。
编辑用服务器行为创建器创建的服务器行为的代码
编码指导原则
一般说来,服务器行为代码应当紧凑、可靠。Web 应用程序开发人员对添加到他们页面中的代码非常敏感。请遵照广泛接受的文档类型语言(ColdFusion、JavaScript、VBScript 或 PHP)的编码惯例。在编写注释时,请考虑可能需要理解代码的不同技术用户,如 Web 和交互程序的设计者或者其它 Web 应用程序开发人员。请包含正确描述代码目的的注释以及有关将代码包含在页面内的任何特定说明。
创建服务器行为时要切记以下代码指导原则:
错误检查
一项重要的要求。服务器行为代码应当妥善处理错误情况。尝试预见所有的可能性。例如,如果参数请求失败怎么办? 如果查询没有返回记录怎么办?
唯一名称
帮助确保能够清楚标识代码并且避免与现有代码出现名称冲突。例如,如果页面包含一个名为 hideLayer() 的函数和名为 ERROR_STRING 的全局变量,而服务器行为插入的代码也使用了这两个名称,则该服务器行为可能与现有代码冲突。
代码前缀
允许您在页面中标识您自己的运行时函数和全局变量。约定之一就是使用首字母大写。请不要使用 MM_ 前缀,因为它是仅为 Dreamweaver 使用而保留的。Dreamweaver 会在所有函数和全局变量之前添加前缀 MM_,以避免与您编写的任何代码冲突。
var MM_ERROR_STRING = "..."; function MM_hideLayer() {
避免相似的代码块
以便您编写的代码不会与其它代码块中的代码过于相似。如果某代码块看起来与页面上的另一个代码块非常类似,“服务器行为”面板可能会错误地将前者标识为后者的一个实例(或反之)。一个简单的解决方法是给代码块添加注释,使它更具有唯一性。
测试服务器行为
Dreamweaver Exchange 建议对所创建的每个服务器行为执行下列测试:
从“服务器行为”面板应用行为。如果该行为有对话框,请在每个域中输入有效数据,然后单击“确定”。验证在应用该行为时没有错误发生。验证该服务器行为的运行时代码是否出现在“代码”检查器中。
再次应用该服务器行为,并在每个对话框域中输入无效数据。尝试下列操作:将域保留为空白,使用大数或负数,使用无效字符(例如 /、?、:、* 等等),以及在数字域中使用字母。可以编写格式验证例程来处理无效数据(验证例程涉及到手工编码,这超出了本书的范围)。
在将服务器行为成功地应用于页面后,请验证下列内容:
检查“服务器行为”面板,确保该服务器行为名称出现在添加到页面的行为的列表中。
验证服务器端脚本图标是否出现在页面上(如果适用)。一般服务器端脚本图标是金色的盾牌。若要查看该图标,请启用“不可见元素”(“查看”>“可视化助理”>“不可见元素”)。
在“代码”视图(“查看”>“代码”)中,验证没有生成任何无效代码。
另外,如果服务器行为将代码插入到与数据库建立连接的文档,请创建一个测试数据库来测试插入到文档中的代码。通过定义查询来验证连接,这些查询应生成不同的数据集以及不同大小的数据集。
最后,将页面上传到服务器并在浏览器中打开。查看页面的 HTML 源代码并验证服务器端脚本未生成任何无效的 HTML。
,