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 大营。从公司角度来看 , 转换语言是一笔不少的投资 包括雇佣熟手 .net 程序员、培训原有程序员、开发工具的转型、开发风格的转型、界面风格转变、接口风格、软件架构、文档、开发流程等等;这还意味着原有的代码必须在新语言环境里重写以实现最佳的效果和稳定性;同时将直接影响这段时间内项目的进度 , 更有可能导致个别程序员出走。由此看来在您决定转换语言之前 , 在原基础上寻求一种解决方案 才是最好的选择。
Php 通过模板实现代码与页面 , 可供选择的有 Fasttemplate 、 Phplib 、 Smarty 等多种 , 其中 phplib 的影响最大、使用最多。既然如此 我们直接把它搬到 asp 来 , 对于同时使用 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 (byvalparent, 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 = "Удалить"
m_lasterror = ""
m_haltonerr = true
Заканчивая
'析构函数
PrivateBclass_terminate
Setm_regexp = ничего
Setm_blockmatches = ничего
Setm_valuematches = ничего
Заканчивая
PublicpropertygetClassName ()
Classname = "kkttemplate"
EndProperty
Publicpropertygetversion ()
Версия = "1.0"
EndProperty
Publicsubabout ()
Response.write ("kkttemplateasp 页面模板类
"& vbcrlf & _
«程序设计 : 彭国辉 2004-07-05
"& vbcrlf & _
«: : Http: //kacarton.yeah.net
"& vbcrlf & _
": : [email protected]
")
Заканчивая
'检查目录是否存在
PublicfunctionForderExist (byvalpath)
Dimfso
Setfso = createObject ("scripting.filesystemobject")
Folderexist = fso.folderexists (server.mappath (path))
Setfso = ничего
Конечная функция
'读取文件内容
PrivateFunctionLoadFile ()
Dimfilename, FSO, Hndfile
Filename = m_root
Ifright (имя файла, 1) "/" andright (filename, 1) "/" thenfilename = имя файла и "/"
Filename = server.mappath (filename & m_filename)
Setfso = createObject ("scripting.filesystemobject")
Ifnotfso.fileexists (имя файла) Thenshowerror ("模板文件" & m_filename & "不存在!")
sethndfile = fso.opentextfile (имя файла)
Loadfile = hndfile.readall
Sethndfile = ничего
Setfso = ничего
Ifloadfile = "" Thenshowerror ("不能读取模板文件" & m_filename & "或文件为空!")
Конечная функция
'处理错误信息
Privatesubshowerror (byvalmsg)
m_lasterror = msg
Response.write "模板错误 :" & msg & "
"
Ifm_haltonerrthenresponse.end
Заканчивая
'设置模板文件默认目录
'Ex: kkttemplate.set_root ("/tmplate")
'kkttemplate.root = "/tmplate"
'root = kkttemplate.get_root ()
'root = kkttemplate.root
'使用类似 set_root 这样的命名方法是为了兼容 phplib , 以下将不再重复说明
Publicsubset_root (byvalvalue)
Ifnotfolderexist (значение) ThenshowerRor (Value & "不是有效目录或目录不存在!")
m_root = значение
Заканчивая
Publicfunctionget_root ()
get_root = m_root
Конечная функция
Publicpropertyletroot (byvalvalue)
set_root (значение)
EndProperty
Publicpropertygetroot ()
Root = m_root
EndProperty
'设置模板文件
'Ex: kkttemplate.set_file ("hndtpl", "index.htm")
'本类不支持多模板文件 , ручка 为兼容 phplib 而保留
Publicsubset_file (byvalhandle, byvalfilename)
M_FILENAME = имя файла
m_blocklist.addhandle, loadfile ()
Заканчивая
Publicfunctionget_file ()
get_file = m_filename
Конечная функция
'PublicPropertyletFile (ручка, имя файла)
'set_filehandle, имя файла
'Endproperty
'PublicpropertygetFile ()
'File = m_filename
'Endproperty
'设置对未指定的标记的处理方式 , 有 Держите 、 Удалить 、 Комментарий 三种
Publicsubset_unknowns (byvalunknowns)
m_unknowns = неизвестные
Заканчивая
Publicfunctionget_unknowns ()
get_unknowns = m_unknowns
Конечная функция
Publicpropertyletunknowns (byvalunknown)
m_unknowns = неизвестно
EndProperty
Publicpropertygetunknowns ()
Неизвестные = m_unknowns
EndProperty
Publicsubset_block (byvalparent, byvalblocktag, byvalname)
Dimmatches
m_regexp.pattern = " ([/SS.]*) "
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) = replace (m_blocklist.item (parent), match.value, "{" & name & "}")
Следующий
setMatches = ничего
Заканчивая
Publicsubset_var (byvalname, byvalvalue, byvalappend)
Dimval
Ifisnull (значение) thenval = "" elseval = значение
Ifm_valuelist.exists (имя) затем
Ifappendthenm_valuelist.item (name) = m_valuelist.item (name) и val_
Elsem_valuelist.item (name) = val
Еще
m_valuelist.addname, значение
Эндиф
Заканчивая
Publicsubunset_var (byvalname)
Ifm_valuelist.exists (имя) thenm_valuelist.remove (имя)
Заканчивая
PrivateFunctionInStanceValue (byvalblocktag)
Dimkeys, я
Exancevalue = m_blocklist.item (blocktag)
Keys = m_valuelist.keys
Fori = 0tom_valuelist.count-1
Exancevalue = replace (exantevalue, "{" & keys (i) & "}", m_valuelist.item (keys (i))))))
Следующий
Конечная функция
Publicsubparse (byvalname, byvalblocktag, byvalappend)
Ifnotm_blocklist.exists (blocktag) thenshowerror ("未指定的块标记" & parent)
Ifm_valuelist.exists (имя) затем
Ifappendthenm_valuelist.item (name) = m_valuelist.item (name) & exantemvalue (blocktag) _
Elsem_valuelist.item (name) = exancevalue (blocktag)
Еще
m_valuelist.addname, exancevalue (blocktag)
Эндиф
Заканчивая
PrivatefunctionFinish (byvalcontent)
SELECTCASEM_UNKNOWNS
Case "Keep" Finish = Content
Случай "удалить"
m_regexp.pattern = "/{[^/t/r/n}]+/}"
finish = m_regexp.replace (content, "")
Дело "комментарий"
m_regexp.pattern = "/{[[^/t/r/n}]+)/}"
finish = m_regexp.replace (Content " ")
Caseelsefinish = content
Endselect
Конечная функция
Publicsubp (byvalname)
Ifnotm_valuelist.exists (имя) thenshowerror ("不存在的标记" & name)
Response.write (finish (m_valuelist.item (name)))))
Заканчивая
Endclass
%>
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 '设置模板变量 some_color = my_color 的值
kkt.parse "out", "hndkkttemp", false '模板变量 out = 处理后的文件
kkt.p "Out" '输出 out 的内容
setkkt = ничего '销毁模板对象
%>
执行后输出为 :
祝贺!你赢了一辆红色的法拉利!
2) 循环块演示例子
模板文件 mytemple2.tpl :
| 下面的动物您喜欢哪一种 |
| {животное} |
Asp : :
Dimanimal, KKT, я
Animal = array ("小猪", "小狗", "小强")
setkkt = newkkttemplate
kkt.set_file "hndkkttemp", "mytemple2.tpl"
kkt.set_block "hndkkttemp", "Animallist", "List"
fori = 0toubound (животное)
kkt.set_var "Animal", Animal (i), ложь
kkt.parse "список", "animallist", true
следующий
kkt.parse "Out", "hndkkttemp", false
kkt.p "Out"
setkkt = ничего
%>
执行结果 :
| 下面的动物您喜欢哪一种 |
| 小猪 |
| 小狗 |
| 小强 |
3) 嵌套块演示
模板文件 mytemple3.tpl :
| {myName} 测试 |
| 我的动植物园 : |
| {животное} |
| {растение} |
Asp : :
dimmy_color, kkt, myname, животное, растение
setkkt = newkkttemplate
myname = "kkttemplateblocktest ..."
Animal = Array ("动物", "植物")
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 "Animal", Animal (i), ложь
kkt.unset_var "p"
'kkt.set_var "p", "", false
forj = 0toubound (plant (i))
kkt.set_var "plant", 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 开发参与进来 , 多提宝贵意见 , 多作交流 同进步! 同进步!同进步!