ype html public " - // w3c // dtd html 4.0 transitional // en" "http://www.w3.org/tr/rec-html40/loose.dtd">
ype html public " - // w3c // dtd html 4.0 transitional // en" "http://www.w3.org/tr/rec-html40/loose.dtd">
今天爱站小编就为大家带来一篇、asp代码与页面的分离技术、小编觉得挺不错的、现在就分享给大家、也给大家做个参考、一起跟随小编过来看看吧。
每个进行过较大型的asp-web应用程序设计的开发人员大概都有如下的经历:asp代码与页面html混淆难分、业务逻辑与显示方式绞合、使得代码难以理解、难以修改;程序编写必须在美工之后、使得代码难以理解、难以修改;程序编写必须在美工之后、成为项目瓶颈;整合的程序代码和 html静态页面时、花费大量的时间才能得到理想的效果、兼作了美工。的确、兼作了美工。的确、用脚本语言开发、但在多人合作的情况下、但在多人合作的情况下、如果无法将数据和显示分开、将大大影响开发的效率、专业分工的发挥。
其它的脚本语言、如、Jsp、php都有自己的解决方案、asp的后一代产品asp.net也实现了代码与页面、似乎直接过渡到asp是不错的选择。但是总有这样或那样的原因让我们不能或暂时不能放弃asp是不错的选择。但是总有这样或那样的原因让我们不能或暂时不能放弃net大营。从公司角度来看、转换语言是一笔不少的投资、包括雇佣熟手、包括雇佣熟手、包括雇佣熟手、更有可能导致个别程序员出走。由此看来在您决定转换语言之前、在原基础上寻求一种解决方案、才是最好的选择。才是最好的选择。
php通过模板实现代码与页面、可供选择的有fasttemplate、phplib、smarty等多种、其中phplib 的影响最大、使用最多。既然如此、我们直接把它搬到、我们直接把它搬到php和php和asp和:一、美工处理页面时、php还是asp、处理方式是一样、处理方式是一样、两种语言间的思路接近或一致、相同功能在两种语言实现时、只需拷贝过来略作修改即可、保证了工作效率和项目进度。、保证了工作效率和项目进度。
1 、模板类的设计
实现代码封装成为模板类、即是为了与phplib兼容、也使得代码方便管理与扩展。
模板类要实现的目标为:从模板文件中读入显示的HTML代码、将这些显示代码中需要动态数据的地方替换为asp程序运算所得出的数据、然后按照一定的顺序输出。其中、替换的部分可以自由的设定。因此它必须完成如下任务、替换的部分可以自由的设定。因此它必须完成如下任务:
・从模板文件中读取显示用的HTML
・将模板文件和实际生成的数据结合、生成输出的结果。
・允许同时处理多个模板。
・允许模板的嵌套。
・允许对模板中的某个单独的部分进行处理。
实现方法:
采用fso读取模板文件
采用正则替换实现模板文件和数据的结合
处理多个模板用数组存储来实现。
模板的嵌套的实现主要的想法是:将模板和输出(任何中间的分析结果)一视同仁、都可拿来做替换、即可实现。
单独部分的处理的通过在模板文件中设定标注、然后在正则替换中结合标注来控制、实现部分替换。
2 、模板类的实现
给出具体代码之前、先把主要函数列出、用过phplib的朋友应该对此很熟悉了:
1)publicsubset_root(byvalvalue)设定模板默认目录
2 )publicsubset_file(byvalhandle、byvalfilename)读取文件
3)publicsubset_var(byvalname、byvalvalue、byvalappend)设置映射数据-替换变量
4)publicsubunset_var(byvalname)取消数据映射
5 )publicsubset_block(byvalperent、byvalblocktag、byvalname)设置数据块
6)publicsubset_unknowns(byvalunknowns)设定未指定映射的标记处理方式
7)publicsubparse(byvalname、byvalblocktag、byvalappend)执行模板文件与数据的结合
8)publicsubp(byvalname)输出处理结果
实现代码:
'===============================================================================
'className:kkttemplateasp页面模板对象
'Designby:彭国辉
'日付:2004-07-05
'ウェブサイト:http://kacarton.yeah.net/
'メール:[email protected]
'
'本对象中使用了set_var、set_block等命名方法是为了兼容phplib
'===============================================================================
classkkttemplate
privatem_filename、m_root、m_unknowns、m_lasterror、m_haltonerr
privatem_valuelist、m_blocklist
privatem_regexp
'构造函数
privatesubclass_initialize
setm_valuelist = createObject( "Scripting.Dictionary")
setm_blockList = createObject( "Scripting.Dictionary")
setm_regexp = newRegexp
m_regexp.ignorecase = true
m_regexp.global = true
M_FILENAME = ""
m_root = ""
m_unknowns = "remove"
m_lasterror = ""
m_haltonerr = true
Endingub
'析构函数
privatesubclass_terminate
setm_regexp =何も
setm_blockmatches = Nothing
setm_valuematches = Nothing
Endingub
publicPropertygetClassName()
classname = "kkttemplate"
Endproperty
publicPropertyGetVersion()
version = "1.0"
Endproperty
publicsubabout()
Response.Write( "kkttemplateasp页面模板类
"&vbcrlf&_
「程序设计:彭国辉2004-07-05
"&vbcrlf&_
"个人网站:http://kacarton.yeah.net
"&vbcrlf&_
「电子邮件:[email protected]
「)
Endingub
'检查目录是否存在
publicFunctionFolderexist(byvalpath)
dimfso
setFSO = createObject( "Scripting.filesystemObject")
folderexist = fso.folderexists(server.mappath(path))
setfso =何もない
エンド機能
'读取文件内容
privateFunctionLoadFile()
dimfilename、fso、hndfile
filename = m_root
ifright(filename、1) "/" andright(filename、1) "/" thenfilename = filename& "/"
filename = server.mappath(filename&m_filename)
setFSO = createObject( "Scripting.filesystemObject")
ifnotfso.fileexists(filename)thenshowerror( "模板文件"&m_filename& "不存在!")
sethndfile = fso.opentextfile(filename)
loadfile = hndfile.readall
sethndfile =何もない
setfso =何もない
ifloadfile = "" thenshowerror( "不能读取模板文件"&m_filename& "或文件为空!")
エンド機能
'处理错误信息
privatesubshowerror(byvalmsg)
M_LASTERROR = MSG
Response.Write "模板错误:"&msg& "
「
IFM_HALTONERRTHENRESPONSE.END
Endingub
'设置模板文件默认目录
'例:kkttemplate.set_root( "/tmplate")
'kkttemplate.root = "/tmplate"
'root = kkttemplate.get_root()
'root = kkttemplate.root
'使用类似set_root这样的命名方法是为了兼容phplib、以下将不再重复说明
publicsubset_root(byvalvalue)
ifnotfolderexist(value)thenshowerror(value& "不是有效目录或目录不存在!")
M_ROOT =値
Endingub
publicfunctionget_root()
get_root = m_root
エンド機能
publicPropertyletRoot(byvalvalue)
set_root(value)
Endproperty
publicPropertygetRoot()
root = m_root
Endproperty
'设置模板文件
'例:kkttemplate.set_file( "hndtpl"、 "index.htm")
'本类不支持多模板文件、ハンドル为兼容phplib而保留
publicsubset_file(byvalhandle、byvalfilename)
M_FILENAME = FILENAME
m_blocklist.addhandle、loadfile()
Endingub
publicfunctionget_file()
get_file = m_filename
エンド機能
'publicPropertyletfile(ハンドル、ファイル名)
'set_filehandle、filename
'Endproperty
'publicPropertygetFile()
'file = m_filename
'Endproperty
'设置对未指定的标记的处理方式、有、コメントを削除します三种
publicsubset_unknowns(byvalunknowns)
M_UNKNOUNTS =不明
Endingub
publicfunctionget_unknowns()
get_unknowns = m_unknowns
エンド機能
publicPropertyletunknowns(byvalunknown)
m_unknowns =不明
Endproperty
publicPropertyGetuns()
不明= m_unknowns
Endproperty
publicsubset_block(byvalperent、byvalblocktag、byvalname)
調子
m_regexp.pattern = " ([/s/s. ]*) 「
ifnotm_blocklist.exists(parent)thenshowerror( "未指定的块标记"&parent)
setMatches = m_regexp.execute(m_blocklist.item(parent))
foreachmatchinmatches
m_blocklist.addblocktag、match.submatches(0)
m_blocklist.item(parent)= falple(m_blocklist.item(parent)、match.value、 "{"&name& "}")
次
setMatches = Nothing
Endingub
publicsubset_var(byvalname、byvalvalue、byvalappend)
意地悪
ifisnull(value)thenval = "" elseval = value
ifm_valuelist.exists(name)then
ifappendthenm_valuelist.item(name)= m_valuelist.item(name)&val_
elsem_valuelist.item(name)= val
それ以外
m_valuelist.addname、value
endif
Endingub
publicsubunset_var(byvalname)
ifm_valuelist.exists(name)thenm_valuelist.remove(name)
Endingub
privateFunctionInstanceValue(byvalblocktag)
薄暗い、i
instanceValue = m_blockList.item(blocktag)
keys = m_valuelist.keys
fori = 0tom_valuelist.count-1
instanceValue = fack(instanceValue、 "{"&keys(i)& "}"、m_valuelist.item(keys(i)))
次
エンド機能
publicsubparse(byvalname、byvalblocktag、byvalappend)
ifnotm_blocklist.exists(blocktag)thenshowerror( "未指定的块标记"&parent)
ifm_valuelist.exists(name)then
ifappendthenm_valuelist.item(name)= m_valuelist.item(name)&instancevalue(blocktag)_
elsem_valuelist.item(name)= instancevalue(blocktag)
それ以外
m_valuelist.addname、instancevalue(blocktag)
endif
Endingub
privateFunctionFinish(byvalcontent)
selectcasem_unknowns
ケース "Keep" finish = content
ケース「削除」
m_regexp.pattern = "/{[^/t/r/n}]+/}"
仕上げ= m_regexp.replace(content、 "")
ケース「コメント」
m_regexp.pattern = "/{([^/t/r/n}]+)/}"
仕上げ= m_regexp.replace(content、 " 「)
caseelsefinish = content
EndSelect
エンド機能
publicsubp(byvalname)
ifnotm_valuelist.exists(name)thenshowerror( "不存在的标记"&name)
respons.write(finish(m_valuelist.item(name))))
Endingub
エンドクラス
%>
3 、使用例子
下面举三个例子进行说明。
1)简单的值替换
mytemple.tpl、内容:
祝贺!你赢了一辆 {some_color} 法拉利!
下面是asp代码(kkttemplate.inc.asp 就是上面给出的模板类):
dimmy_color、kkt
my_color = "红色的"
setkkt = newkkttemplate '创建模板对象
kkt.set_file "hndkkttemp"、 "mytemple.tpl" '设置并读取模板文件mytemple.tpl
kkt.set_var "some_color"、my_color、false '
kkt.parse "out"、 "hndkkttemp"、false 'out =处理后的文件
kkt.p "out" '输出out的内容
setkkt = Nothing '销毁模板对象
%>
执行后输出为:
祝贺!你赢了一辆红色的法拉利!
2)循环块演示例子
mytemple2.tpl:
| 下面的动物您喜欢哪一种 |
| {動物} |
ASP代码:
Dimanimal、Kkt、i
動物=配列( "小猪"、 "小狗"、 "小强")
setkkt = newkkttemplate
kkt.set_file "hndkkttemp"、 "mytemple2.tpl"
kkt.set_block "hndkkttemp"、 "animallist"、 "list"
fori = 0toubound(動物)
kkt.set_var "動物"、動物(i)、false
kkt.parse "list"、 "animallist"、true
次
kkt.parse "out"、 "hndkkttemp"、false
kkt.p "out"
setkkt =何もない
%>
执行结果:
| 下面的动物您喜欢哪一种 |
| 小猪 |
| 小狗 |
| 小强 |
3)嵌套块演示
mytemple3.tpl:
| {myname}测试 |
| 我的动植物园: |
| {動物} |
| {植物} |
ASP代码:
dimmy_color、kkt、myname、animal、plant
setkkt = newkkttemplate
myname = "kkttemplateblocktest ..."
動物=配列( "动物"、 "植物")
plant = array(array( "小猪"、 "小白"、 "小强")、array( "玫瑰"、 "向日葵"))
kkt.set_file "hndkkttemp"、 "mytemple3.tpl"
kkt.set_var "myname"、myname、false
kkt.set_block "hndkkttemp"、 "animallist"、 "a"
kkt.set_block "animallist"、 "plantlist"、 "p"
fori = 0toubound(動物)
kkt.set_var "動物"、動物(i)、false
kkt.unset_var "p"
'kkt.set_var "p"、 ""、false
forj = 0toubound(plant(i))
kkt.set_var "Plant"、植物(i)(j)、false
kkt.parse "p"、 "plantlist"、true
次
kkt.parse "a"、 "animallist"、true
次
kkt.parse "out"、 "hndkkttemp"、false
kkt.p "out"
%>
执行结果:
| kkttemplateblocktest ...测试 |
| 我的动植物园: |
| 动物 |
| 小猪 |
| 小白 |
| 小强 |
| 植物 |
| 玫瑰 |
| 向日葵 |
4 、小结
本文主要介绍了基于asp利用模板类实现代码与页面分离的方法、当然还有其它更好的解决方案。本文旨在抛砖引玉各位读者、、web开发参与进来、多提宝贵意见、多作交流、共同进步!