当然也有很多缺点:
1、本地代码和页面之间的交互比较困难;
2、有时候本地代码很简单可以实现的,在Html中可能很复杂或者基本无法实现,对于这部分代码可以在本地代码中实现,由Html来调用;
3、页面的局部刷新比较困难(如果要解决可以参考AJAX的思路)。
Script.NET从1.0版本开始就已经大量采用了这种编程方法,并封装了一个简单的Tcl库,我在自己负责开发的几个项目中都应用了这种方
法。Script.NET 2.0版本中对这种方法进一步完善,封装了一整套本地web界面开发的类库(TclFace),关于TclFace的详细原
理和用法以后会详细说明,下面主要介绍Script.NET 1.0中的TPageMake界面生成类。
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脚本来访问各
种数据库。用户脚本负责将模板和用户数据组合在一起生成最终的页面,页面生成器则负责最终的页面生成,是被用户脚本来调用的。
一般来说一个页面对应了两个模板文件,后缀分别是.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
点击 http://groups.google.com/group/scriptnet/web/script-net-1-0tcl-html?hl=zh-CN
- 如果链接不起作用,请复制该链接并将其粘贴到您浏览器的地址栏中。