![]() |
|
Script.NET页面编程是指在Script.NET环境下编写基于Html页面的应用,这和动态网页(ASP/PHP/JSP等) 的概念有些类似,不同的是动态网页是基于网络的应用,动态网页脚本是在服务器端运行的,由服务器 端脚本生成WEB页面之后送到客户端浏览。Script.NET页面编程则是完全在客户端运行的一种动态网页, 由Script.NET客户端的某种脚本(目前只支持Tcl脚本)直接在客户端生成页面,然后在Script.NET中浏览。 这种客户端动态生成页面的好处是可以不用花费很大的精力去编写各种复杂的界面,而是一律用页面的 形式来表示各种界面,因为Html页面内容非常丰富,可以满足各种复杂界面需求,而且界面风格统一, 可以象做网页那样做出非常好看的界面,修改起来也非常方便,工作量相比C++来说应该会小一些。
Script.NET页面编程的原理是将通过Html模板和用户数据来生成页面,生成一个页面需要由模板文件、 用户脚本、用户数据、页面生成器几个部分来配合完成。模板文件就是Html页面的模板,一般是由网页 开发人员先创作一个原型页面,然后将原型页面改造为模板,改造的方法是按照Script.NET页面模板 的要求在页面中加一些特殊标记。用户数据可能是来源于用户的某个数据库或别的地方,例如做一个 日志的页面应用,则用户数据就是日志数据库,对数据库的读写操作可以通过ADO等方式,Script.NET 中封装了一个Tcl的ADO模块,可以方便的通过Tcl脚本来访问各种数据库。用户脚本负责将模板和用户 数据组合在一起生成最终的页面,页面生成器则负责最终的页面生成,是被用户脚本来调用的。
注:Script.NET V2.0对页面编程库进行了优化,使用TclFace扩展包代替原来的编程方式,使页面编程更加方便, 具体TclFace库的用法请参考html目录下的一些页面脚本源代码。下面的介绍是V1.1版本提供的方法,仅供参考。
一般来说一个页面对应了两个模板文件,后缀分别是.tph和.tpf,.tph文件是原型页面经过改造后的 文件,生成的页面就是在tph文件的基础上替换其中一些标记和生成的,tpf文件是一些标记的替换集 合,存储的是每一种标记对应的一段替换文本,这些替换文本也可以存在其他的标记,实际上如果不 要tpf文件也是可行的,但是这样就要把替换内容都写到生成脚本中,灵活性就会降低,因为如果写到 tpf文件中,则只要修改tpf文件中的替换内容,就可以修改生成的页面的风格。
tph文件中替换标记的格式为"%标记名%",也就是用两个%包围的一个标记名字,例如下面这一段中的 %TABLE_ALL%:
<TABLE cellSpacing=0 cellPadding=5 width="100%" border=0> %TABLE_ALL% </TABLE>
tpf文件中每一个用于替换的段落用[替换名]...内容...[/替换名]来表示,在各个替换段之间可以有 注释,注释的格式为#开头的文字,例如下面这一段就是tpf文件中的一个替换段,替换名为TR_VAR_LINE, 并且其中还可以有替换标记:
# 用于表示变量的表格行 [TR_VAR_LINE] <TR> <TD class=text_all bgColor=#ffffff>%NAME%</TD> <TD class=text_all bgColor=#ffffff>%VALUE%</TD> </TR> [/TR_VAR_LINE]
可以参考FtpClient演示工程中的FTP页面的模板文件。
页面生成器为一个iTcl类,类定义如下:
#------------------------------------------------------------- # TPageMake class define #------------------------------------------------------------- ::itcl::class TPageMake { constructor {targetHtml templateHtml templateFile} {}; destructor {}; ### data member ### private variable _targetHtml; #目标页面 private variable _templateHtml; #模板页面 private variable _templateFile; #模板文件 private variable _tclTr; #存储Tr的Tcl内部变量 private variable _targetVarList;#存储目标页面中所有变量 ### public methods ### #添加表格项到内部标记变量_tclTr public method AppendItemFromTpf {tagTr {names ""} {values ""}} #标记段存储到目标缓冲区中 public method SaveToTargetBuf {tagTr {cleartag "-cleartag"}} #替换目标缓冲区中的一个标记 public method ReplaceTargetTr {tagTr replaceTr} #创建目标页面 public method MakeTargetHtml {} #从目标页面中读取所有变量信息 public method LoadTargetHtmlVar {} #将指定变量信息写入目标缓冲区 public method SaveTargetVar {varName varValue} #获取目标页面中指定变量的值 public method GetTargetVar {varName} }
构造函数的参数有3个,分别为要生成的目标页面文件、tph文件和tpf文件。除了一些用于生成页面 的函数之外,这个类还有一些函数用于存取目标页面中存储的一些变量,这些变量存放在html文件的 注释中,这样对页面是没有任何影响的,之所以提供在页面中存储变量的方法,是因为这种页面编程 中,脚本的作用创建页面,一旦一个页面创建完成,则脚本就会结束,而脚本解释器中的内部状态信 息等变量也会随着脚本的结束而消失,下一次生成页面再调用脚本的时候也就无法记住以前的信息, 但有时候我们确实需要获得以前的信息,例如FTP应用中需要记住FTP的地址和上一次的访问路径,因此 才提供了这种在页面中保存变量的方法,在脚本结束之前把变量存储在目标页面的注释中,下一次启动 脚本以后就可以从页面中读取上一次存储的信息。存储的变量的格式为如下:
<!-- varName=varValue -->
下面是一个页面编程的应用实例,tph模板文件如下:
<HTML><HEAD><TITLE>表格演示</TITLE> <BODY> <TABLE> %TABLE_ALL% </TABLE> </BODY> </HTML>
其中%TABLE_ALL%是用于替换的标记,这个例子中tph文件已经搭了一个表格的框架,只要填内容 就可以了,因此我们的目的就是将%TABLE_ALL%替换为一个表格的内容。
tpf模板文件如下:
# 表格的标题行 [TABLE_WITH_TITLE] <TR> <TD>%COL1%</TD> <TD>%COL2%</TD> </TR> %ROW% [/TABLE_WITH_TITLE] # 表格行 [TABLE_ROW] <TR> <TD>%COL1%</TD> <TD>%COL2%</TD> </TR> [/TABLE_ROW]
这里有两种替换段,分别是表格的标题和内容。
生成脚本的例子如下:
source "$platform_path/lib/plat/pagemake.tcl"; #------------------------------------------------------------- # main #------------------------------------------------------------- if {[itcl_info objects pageMake -class TPageMake] != "pageMake"} { set _htmlCurrentFile "$platform_path/Samples/page/demo1.htm" TPageMake pageMake "$_htmlCurrentFile" \ "$platform_path/Samples/page/demo1.tph" \ "$platform_path/Samples/page/demo1.tpf"; } # 创建标题行 set value [list "列1" "列2" "%TABLE_ROW%"]; pageMake AppendItemFromTpf "TABLE_WITH_TITLE" {"COL1" "COL2" "ROW"} $value; pageMake SaveToTargetBuf "TABLE_ALL" -append; # 创建表格内容行 set value [list "1-1" "1-2"]; pageMake AppendItemFromTpf "TABLE_ROW" {"COL1" "COL2"} $value; set value [list "2-1" "2-2"]; pageMake AppendItemFromTpf "TABLE_ROW" {"COL1" "COL2"} $value; pageMake SaveToTargetBuf "TABLE_ROW"; # 存储到缓冲区 pageMake SaveToTargetBuf "TABLE_ALL"; # 生成页面 pageMake MakeTargetHtml; # 释放生成器 ::itcl::delete object pageMake; ::itcl::delete class TPageMake; # 设置页面转移 set _htmlNewURL "$platform_path/Samples/page/demo1.htm";
最后创建的页面如下所示:
列1 | 列2 |
1-1 | 1-2 |
2-1 | 2-2 |