用户界面已经在 Dreamweaver 和更高版本中做了简化。 因此,您可能在 Dreamweaver 和更高版本中找不到本文中描述的一些选项。 有关详细信息,请参阅此文章。
关于自定义服务器行为
Dreamweaver 附带一套内置服务器行为,让您可以轻松为网站添加动态功能。您可以通过创建服务器行为来满足您的开发需求,或者从 Dreamweaver Exchange 网站获取服务器行为,从而扩展 Dreamweaver 功能。
在创建您自己的服务器行为之前,您应该检查 Dreamweaver Exchange 网站,查看是否已有其他方创建了提供您想要添加到网站的功能的服务器行为。通常,第三方开发者已经创建并测试了能够满足您需求的服务器行为。
访问 Dreamweaver Exchange
选择“帮助”>“Dreamweaver Exchange”。
选择"窗口">"服务器行为",单击加号 (+) 按钮,然后选择"获取更多服务器行为"。
在浏览器中会打开 Dreamweaver Exchange网页。
在 Dreamweaver 中安装服务器行为或其他扩展
有关详细信息,请参阅使用功能扩展管理器。
自定义服务器行为工作流程
如果您是精通 ColdFusion、JavaScript、VBScript 或 PHP 的 Web 开发者,您可以编写自己的服务器行为。创建服务器行为的步骤包括以下任务:
编写一个或多个执行所需操作的代码块。
指定代码块应在页面的 HTML 代码中的何处插入。
如果服务器行为要求为参数指定值,请创建一个对话框,提示应用该行为的 web 开发者提供适当的值。
在将该服务器行为提供给他人使用之前,对其进行测试。
使用服务器行为创建器
使用服务器行为构建器添加行为插入到页面中的一个或多个代码块。
显示“服务器行为创建器”对话框。
您输入的名称会显示在服务器行为构建器中,并在"代码块"框中显示相应的脚本标记。
在"代码块"框中输入代码时,您只能为每个命名代码块插入单个标记或代码块(例如 myBehavior_block1、myBehavior_block2、myBehavior_blockn 等)。如果您必须输入多个标记或代码块,请为每个标记或代码块创建单独的代码块。您还可以从其他页面复制和粘贴代码。
参数将插入到代码块中您在定义参数之前放置插入点的位置。\n如果您选择了字符串,代码块中所选字符串的每个实例都将被参数标记替换(例如 @@Session@@)。
“服务器行为”面板会列出该服务器行为。
高级选项
指定每个代码块的源代码和插入位置后,服务器行为就完全定义好了。在大多数情况下,您无需指定任何其他信息。
如果您是高级用户,可以设置以下任意选项:
标识符
指定是否应将代码块视为标识符。
默认情况下,所有代码块都是标识符。 如果 Dreamweaver 在文档中的任何位置找到标识符代码块,它会在"服务器行为"面板中列出该行为。\n使用"标识符"选项指定是否应将代码块视为标识符。
服务器行为的至少一个代码块必须是标识符。如果以下条件之一适用,代码块就不应为标识符:相同的代码块被其他某个服务器行为使用;或者代码块非常简单,可能在页面上自然出现。
服务器行为标题
指定“服务器行为”面板中行为的标题。
当页面设计师单击"服务器行为"面板上的加号 (+) 按钮时,新服务器行为的标题将显示在弹出菜单中。当设计师将服务器行为的实例应用到文档时,该行为将显示在"服务器行为"面板的已应用行为列表中。使用"服务器行为标题"框指定加号 (+) 弹出菜单和已应用行为列表的内容。
框中的初始值是您在"新建服务器行为"对话框中提供的名称。定义参数后,名称会自动更新,使参数显示在服务器行为名称后面的括号内。
设置会话变量 (@@Name@@, @@Value@@)
如果用户接受默认值,括号前的所有内容将显示在加号 (+) 弹出菜单中(例如"设置会话变量")。\n名称加参数将显示在已应用行为列表中,例如"设置会话变量 (\"abcd\", \"5\")"。
要选择的代码块
指定当用户在"服务器行为"面板中选择\n行为时要选择的代码块。
当您应用\n服务器行为时,该行为中的其中一个代码块会被指定为\n"要选择的代码块"。如果您应用服务器行为,然后\n在"服务器行为"面板中选择该行为,指定的\n代码块会在"文档"窗口中被选中。默认情况下,Dreamweaver 选择不在 html 标记之上的第一个代码块。如果所有代码\n块都在 html 标记之上,则选择第一个\n代码块。高级用户可以指定选中的代码块。
创建代码块
您在"服务器行为生成器"\n中创建的代码块会封装在服务器行为中,该行为会显示在"服务器\n行为"面板中。代码可以是针对\n指定服务器模型的任何有效运行时代码。例如,如果您选择 ColdFusion 作为自定义服务器行为的文档类型,您编写的代码必须是能够在 ColdFusion 应用程序服务器上运行的有效 ColdFusion 代码。
您可以直接在"服务器\n行为生成器"中创建代码块,也可以从其他\n来源复制和粘贴代码。您在"服务器行为生成器"\n中创建的每个代码块必须是单个标记或脚本块。如果必须插入多个\n标记块,请将它们拆分为单独的代码块。
代码块中的条件
Dreamweaver 让您能够开发包含\n条件执行控制语句的代码块。\n服务器行为生成器使用 if、elseif 和 else 语句,还可能包含服务器行为参数。这让您能够\n根据服务器行为参数之间的或关系值\n插入替换文本块。
以下示例展示了\nif、elseif 和 else 语句。\n方括号 ([ ]) 表示可选代码,星号\n(*) 表示零个或多个实例。要仅在满足某个条件或某些条件时执行代码块的一部分或整个代码块,请使用以下语法:
<@ if (expression1) @> 条件
text1[<@ elseif (expression2) @> 条件 text2]*[<@ else @>
条件 text3]<@ endif @>
条件\n表达式可以是任何可以使用\nJavaScript eval() 函数求值的 JavaScript 表达式,并且可能包含\n以 @@ 标记的服务器行为参数。(@@ 用于区分\n参数与 JavaScript 变量和关键字。)
有效使用条件表达式
在\ninsertText XML 标记内使用 if、else 和 elseif 指令\n时,参与者\n文本会被预处理以解析 if 指令\n并确定要在结果中包含哪些文本。if 和 elseif 指令\n将表达式作为参数。条件表达式与\nJavaScript 条件表达式相同,也可以\n包含服务器行为参数。此类指令允许您\n根据服务器行为参数的值\n或参数之间的关系在备选代码块中进行选择。
例如,\n以下 JSP 代码来自使用条件\n代码块的 Dreamweaver 服务器行为:
@@rsName@@.close();
<@ if (@@callableName@@ != '') @>
@@callableName@@.execute();
@@rsName@@ = @@callableName@@.getResultSet();<@ else @>
@@rsName@@ = Statement@@rsName@@.executeQuery();
<@ endif @>
@@rsName@@_hasData = @@rsName@@.next();
条件代码块以 <@ if (@@callableName@@ != '') @> 开始,以 <@ endif @> 结束。根据代码,如果用户为服务器行为的参数对话框中的 @@callableName@@ 参数\n输入值,换句话说,如果\n@@callableName@@ 参数值不为空,\n即 (@@callableName@@ != ''),则条件代码\n块会被以下语句替换:
@@callableName@@.execute();
@@rsName@@ = @@callableName@@.getResultSet();
否则,\n代码块会被以下语句替换:
@@rsName@@ = Statement@@rsName@@.executeQuery();
放置代码块
使用\n服务器行为生成器创建代码块时,您必须指定在页面的 HTML 代码中插入代码块的位置。
例如,如果您在开始 <html> 标记上方插入代码块,\n则必须指定代码块相对于该页面\nHTML 代码该部分中其他\n标记、脚本和服务器行为的位置。典型示例包括将行为定位在\n可能也存在于\n页面代码中开始 <html> 标记上方的任何记录集查询之前或之后。
当您从插入代码弹出\n菜单中选择定位选项时,相对位置弹出菜单\n中的可用选项\n会发生更改,以提供该页面部分的相关选项。例如,\n如果您在插入代码弹出菜单中选择"在 <html> 标记上方",\n则相对位置弹出菜单中的可用定位选项\n会反映出该页面部分的相关选择。
下表显示了代码块插入选项,\n以及每个选项可用的相对定位选项:
|
插入代码选项 |
相对位置选项 |
|
<html> 标签上方 |
|
|
</html> 标签下方 |
|
|
相对于特定标签 |
从"标记"弹出菜单中选择一个标记,\n然后从标记定位选项中进行选择。 |
|
相对于选定内容 |
选定内容之前 选定内容之后 替换\n选择 环绕选定内容 |
要指定自定义位置,您必须为代码块分配权重。当您需要\n按特定顺序插入多个代码块时,请使用"自定义位置"选项。例如,\n要在打开记录集的代码\n块之后插入 3 个有序的代码块,您需要为\n第一个块输入粗细值 60,第二个块输入 65,第三个块输入 70。
默认情况下,Dreamweaver 为所有插入到 <html> 标记上方的记录集打开代码块分配粗细值\n50。\n如果两个或多个块的权重相同,Dreamweaver 将随机设置这些块之间的顺序。
定位代码块(常规\n说明)
服务器行为会列在"服务器行为"面板中\n("窗口">"服务器行为");单击加号 (+) 按钮\n可查看服务器行为。
将代码块相对于\n页面上的另一个标记定位
如果输入标签,请不要包括尖括号 (< >)。
将代码块相对于由页面设计器选择的标记定位
您可以在选择内容之前或之后\n插入代码块。您也可以用代码\n块替换选择内容,或者可以将代码块包装在选择内容周围。
要\n将代码块包装在选择内容周围,选择内容必须由\n开始标记和结束标记组成且其间不包含任何内容,如下所示:
<CFIF Day=\"Monday\"></CFIF>
在选择内容的\n开始标记之前插入代码块的开始标记片段,在选择内容的\n结束标记之后插入代码块的结束标记片段。
使用循环指令重复代码块
要重复代码块的一部分或整个代码\n块若干次,请使用以下语法:
<@ loop (@@param1@@,@@param2@@) @> code
block<@ endloop @>
在创建服务器行为时,您可以使用循环构造\n重复执行指定次数的代码块。<@ loop (@@param1@@,@@param2@@,@@param3@@,@@param_n@@) @> 代码块 <@ endloop @>循环指令接受以逗号分隔的参数数组列表作为参数。在此情况下,参数数组参数允许用户为单个参数提供多个值。重复的文本被复制 n 次,其中 n 是\n参数数组参数的长度。如果指定了多个参数\n数组参数,所有数组必须具有相同的长度。在\n循环的第 i 次评估中,参数数组的第 i 个\n元素会替换代码块中关联的参数\n实例。
当您为服务器行为创建对话框时,您可以\n向对话框添加控件,让页面设计人员创建\n参数数组。Dreamweaver 包含一个\n简单的数组控件,您可以使用它来创建对话框。此\n控件称为"文本字段逗号分隔列表",可通过\nServer Behavior Builder 获得。要创建更复杂的用户界面元素,请参阅 API 文档以创建带有用于创建数组的控件(例如网格控件)的对话框。
您可以在\n条件指令中嵌套任意数量的条件或循环指令。例如,您可以指定如果表达式为真时执行循环。
以下示例显示了如何使用此类重复代码块来创建服务器行为(该示例是用于访问存储过程的 ColdFusion 行为):
<@ loop (@@param1@@,@@param2@@,@@param3@@,@@param_n@@) @> code block
<@ endloop @>
<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 标记可以包含零个或多个 CFPROCPARAM 标记。但是,如果不支持循环指令,则无法在插入的 CFSTOREDPROC 标记中包含 CFPROCPARAM 标记。如果在不使用循环指令的情况下将其创建为服务器行为,则需要将此示例分开为两个参与方:主 CFSTOREDPROC 标记和参与方类型为多个的 CFPROCPARAM 标记。
使用循环指令,您可以按以下方式编写相同的过程:
<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 变量
循环 指令包含两个内置变量,您可以将它们用于 嵌入的 if 条件。这两个变量为:_length 和 _index。 _length 变量的值为循环指令所处理数组的长度,而 _index 变量的值为循环指令的当前索引。为确保 变量只被识别为指令,而不是要传递到循环中的实际 参数,请不要将这两个变量 包含在 @@ 中。
使用内置变量 的一个示例是将它们应用于页面指令的 import 属性。import 属性要求用逗号分隔各个包。如果 loop 指令扩展 到整个 import 属性,您只会 在循环的第一次迭代时输出属性名称 import=(包括结束双引号(")) ,并且不会在循环的最后一次迭代时输出逗号。使用 内置变量,您可以按如下方式表达:
<@loop (@@Import@@)@>
<@ if(_index == 0)@>import="
<@endif@>@@Import@@<@if (_index == _length-1)@>"<@else@>,
<@ endif @>
<@endloop@>
请求服务器行为参数
服务器行为通常 要求页面设计器提供参数值。必须在将服务器行为代码插入页面之前插入此值。
您通过在代码中定义设计器提供的 参数来创建对话框。然后您为服务器行为生成一个对话框,该对话框提示页面设计器输入参数值。
如果您指定代码应相对于页面设计者选择的特定标记插入(即,您在"插入代码"弹出菜单中选择了"相对于特定标记"),则会在您不进行干预的情况下将参数添加到代码块中。该参数会向行为的对话框添加标记菜单,以便页面设计者选择标记。
在服务器行为代码中定义参数
@@parameterName@@
<% Session("lang_pref") = Request.Form("@@formParam@@"); %>
例如,如果服务器行为包含以下代码块:
<% Session("lang_pref") = Request.Form("Form_Object_Name"); %>
要求页面设计者提供 Form_Object_Name 的值,请将字符串括在参数标记(@@)中:<% Session(\"lang_pref\") = Request.Form(\"@@Form_Object_Name@@\"); %>
<% Session("lang_pref") = Request.Form("@@Form_Object_Name@@"); %>
也可以高亮显示该字符串,然后单击“在代码块中插入参数”按钮。 输入一个参数名称,然后单击“确定”。 Dreamweaver 会将高亮显示的字符串的每个实例替换为以参数标记括起来的指定参数名称。
Dreamweaver 使用以参数标记括起来的字符串标注其生成的对话框中的控件(请参阅以下步骤)。 在上个示例中,Dreamweaver 使用以下标签创建了一个对话框:
服务器行为代码中的参数名称不能有任何空格。 因此,对话框标签不能有任何空格。 如果要在标签中包含空格,可以编辑生成后的 HTML 文件。
为服务器行为创建对话框以请求参数值
Dreamweaver 生成带有标记控件的对话框,用于您定义的每个设计者提供的参数。
查看对话框
编辑您为服务器行为创建的对话框
此时将显示对话框,列出您在代码中定义的所有设计者提供的参数。
编辑和修改服务器行为
您可以编辑使用服务器行为生成器创建的任何服务器行为,包括从 Dreamweaver Exchange 网站下载的服务器行为以及其他第三方开发者的服务器行为。
如果您将服务器行为\n应用于页面,然后在 Dreamweaver 中编辑该行为,\n旧行为的实例将不再出现在"服务器行为"\n面板中。"服务器行为"面板会在页面中搜索与\n已知服务器行为代码匹配的代码。如果服务器行为的代码发生更改,\n该面板将无法识别该页面上\n该行为的早期版本。
在面板中保留行为的\n旧版本和新版本
编辑使用服务器行为生成器\n创建的服务器行为的代码
"编辑服务器行为"对话框将显示\n当前服务器技术的所有行为。
Dreamweaver 将在没有对话框的情况下重新生成服务器\n行为。新服务器行为将出现在\n"服务器行为"面板的加号 (+) 弹出菜单中。
Dreamweaver 将询问您是否\n要创建新对话框,覆盖旧的对话框。进行\n更改并单击"确定"。
Dreamweaver 会将所有更改保存在服务器行为的 EDML 文件中。
编码指导原则
一般而言,您的服务器\n行为代码应该紧凑且稳健。Web 应用程序开发人员对添加到其页面的代码非常敏感。遵循文档类型语言(ColdFusion、\nJavaScript、VBScript 或 PHP)普遍\n接受的编码惯例。编写注释时,应考虑可能需要理解代码的不同技术受众,例如 Web 和交互设计师,或其他 Web 应用程序开发人员。添加注释,准确描述代码用途以及将其包含在页面中的任何特殊说明。
创建服务器行为时,请牢记以下编码指南:
错误检查
一项重要的要求。 服务器行为的代码应该优雅地处理错误情况。尝试预见所有的可能性。 例如,\n如果参数请求失败会怎样?如果从问题中未返回\n任何记录会怎样?
唯一名称
有助于确保您的代码清晰可标识并 避免与现有代码发生名称冲突。例如,如果页面 包含一个名为 hideLayer() 的功能和一个名为 ERROR_STRING 的全局 变量,而您的服务器行为 插入的代码也使用这些名称,则该服务器行为可能与 现有代码冲突。
代码前缀
允许您在页面中标识自己的运行时函数和全局变量。约定之一就是使用首字母大写。 切勿使用 MM_ 前缀, 因为它专用于 Dreamweaver。Dreamweaver 在 所有功能和全局变量前添加前缀 MM_,以 防止它们与您编写的任何代码冲突。
var MM_ERROR_STRING = "...";
function MM_hideLayer() {
避免相似的代码块
使您所编写的代码与\n其他块中的代码不会过于相似。如果某个代码块看起来与页面上的另一个\n代码块过于相似,"服务器行为"面板可能会错误地\n将第一个代码块识别为第二个代码块的实例\n(或相反)。一个简单的解决方案是向\n代码块添加注释以使其更具独特性。
测试服务器行为
Dreamweaver Exchange 建议对您创建的每个服务器行为执行以下测试:
从“服务器行为”面板应用行为。 如果\n有对话框,请在每个字段中输入有效数据并单击"确定"。\n验证在应用该行为时没有错误发生。 验证服务器行为的运行时代码出现在代码检查器中。
再次应用服务器行为,并在对话框的各个字段中输入无效数据。尝试将字段留空、使用较大或负数、使用无效字符(如 /、?、:、* 等)以及在数值字段中使用字母。您可以编写表单验证程序来处理无效数据(验证程序涉及手动编码,超出了本书的范围)。
成功将服务器行为应用到页面后,请验证以下内容:
检查"服务器行为"面板,确保服务器行为的名称出现在添加到页面的行为列表中。
如果适用,请验证服务器端脚本图标显示在页面上。一般服务器端脚本图标是金色的盾牌。 要查看图标,请启用"不可见元素"("视图">"可视化辅助">"不可见元素")。
在"代码"视图("视图">"代码")中,验证没有生成无效代码。
此外,如果您的服务器行为在文档中插入建立数据库连接的代码,请创建一个测试数据库来测试插入到文档中的代码。通过定义生成不同数据集和不同数据集大小的查询来验证连接。
最后,将页面上传到服务器并在浏览器中打开。查看页面的 HTML 源代码,并验证服务器端脚本未生成无效的 HTML。