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 静态页面时 静态页面时, 花费大量的时间才能得到理想的效果 花费大量的时间才能得到理想的效果, 兼作了美工。的确 用脚本语言开发 用脚本语言开发 web 应用不容易将数据的处理和数据的显示分开 应用不容易将数据的处理和数据的显示分开, 但在多人合作的情况下, 如果无法将数据和显示分开 将大大影响开发的效率, 将大大影响开发的效率 专业分工的发挥。 专业分工的发挥。
其它的脚本语言 其它的脚本语言, 如 jsp 、 php 都有自己的解决方案, asp 的后一代产品 asp.net 也实现了代码与页面, 似乎直接过渡到 asp 是不错的选择。但是总有这样或那样的原因让我们不能或暂时不能放弃 asp 直奔 asp 直奔 .net 大营。从公司角度来看 大营。从公司角度来看, 转换语言是一笔不少的投资, 包括雇佣熟手 .net 程序员、培训原有程序员、开发工具的转型、开发风格的转型、界面风格转变、接口风格、软件架构、文档、开发流程等等;这还意味着原有的代码必须在新语言环境里重写以实现最佳的效果和稳定性;同时将直接影响这段时间内项目的进度 程序员、培训原有程序员、开发工具的转型、开发风格的转型、界面风格转变、接口风格、软件架构、文档、开发流程等等;这还意味着原有的代码必须在新语言环境里重写以实现最佳的效果和稳定性;同时将直接影响这段时间内项目的进度, 更有可能导致个别程序员出走。由此看来在您决定转换语言之前, 在原基础上寻求一种解决方案, 才是最好的选择。 才是最好的选择。
php 通过模板实现代码与页面 通过模板实现代码与页面, 通过模板实现代码与页面 fasttemplate 、 phplib 、 smarty 等多种, 其中 phplib 的影响最大、使用最多。既然如此, 我们直接把它搬到 asp 来, 对于同时使用 php 和 asp : 一、美工处理页面时 : 不管将要套用 php 还是 asp, 处理方式是一样, 无须经过培训;二、程序员编写代码时 两种语言间的思路接近或一致, 两种语言间的思路接近或一致, 相同功能在两种语言实现时 相同功能在两种语言实现时 只需拷贝过来略作修改即可 只需拷贝过来略作修改即可 保证了工作效率和项目进度。 保证了工作效率和项目进度。
1 、模板类的设计
实现代码封装成为模板类, 即是为了与 phplib 兼容, 也使得代码方便管理与扩展。
模板类要实现的目标为 : 从模板文件中读入显示的 html 代码 代码, 将这些显示代码中需要动态数据的地方替换为 asp 程序运算所得出的数据, 然后按照一定的顺序输出。其中, 替换的部分可以自由的设定。因此它必须完成如下任务 : :
· 从模板文件中读取显示用的 html 代码。
· 将模板文件和实际生成的数据结合 将模板文件和实际生成的数据结合, 将模板文件和实际生成的数据结合
· 允许同时处理多个模板。
· 允许模板的嵌套。
· 允许对模板中的某个单独的部分进行处理。
实现方法 :
采用 fso 读取模板文件
采用正则替换实现模板文件和数据的结合
处理多个模板用数组存储来实现。
模板的嵌套的实现主要的想法是 : 将模板和输出 : 将模板和输出)) 一视同仁 一视同仁, 都可拿来做替换, 即可实现。 即可实现。
单独部分的处理的通过在模板文件中设定标注 单独部分的处理的通过在模板文件中设定标注, 然后在正则替换中结合标注来控制, 实现部分替换。
2 、模板类的实现
给出具体代码之前 给出具体代码之前, 先把主要函数列出 先把主要函数列出, 用过 phplib 的朋友应该对此很熟悉了 :
1) vallicsubset_root (byvalvalue) 设定模板默认目录
2) plublicsubset_file (byvalhandle, byvalfilename) 读取文件
3) publicsubset_var (ByValName, ByValValue, ByValAppend) 设置映射数据- 替换变量
4) vullicsubunset_var (byvalname) 取消数据映射
5) virticsubset_block (byvalparent, byvalblocktag, byvalname) 设置数据块
6) vullicsubset_unknowns (byvalunknowns) 设定未指定映射的标记处理方式
7) publicubparse (byvalname, byvalblocktag, byvalappend) 执行模板文件与数据的结合
8) 대중 서브프 (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
Endsub
'析构函数
privatesubclass_terminate
setm_regexp = 아무것도 없습니다
setm_blockmatches = 아무것도 없습니다
setm_valuematches = 아무것도
Endsub
PublicPropertygetClassName ()
classname = "kkttemplate"
엔드 프로페티
PublicPropertyGetVersion ()
버전 = "1.0"
엔드 프로페티
대중 소관관 ()
response.write ( "kkttemplateasp 页面模板类
"& vbcrlf & _
"彭国辉 : : 2004-07-05
"& vbcrlf & _
"t : http : //kacarton.yeah.net
"& vbcrlf & _
"art : [email protected]
")
Endsub
'检查目录是否存在
PublicFunctionDerexist (byvalpath)
Dimfso
setfso = createobject ( "Scripting.FilesyStemObject")
Folderexist = fso.dolerexists (Server.mappath (Path))
setfso = 아무것도
최종 기능 장애
'读取文件内容
privateFunctionLoadfile ()
Dimfilename, fso, hndfile
filename = m_root
ifright (filename, 1) "/"및 right (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
Endsub
'设置模板文件默认目录
'예 : kkttemplate.set_root ( "/tmplate")
'kkttemplate.root = "/tmplate"
'루트 = kkttemplate.get_root ()
'root = kkttemplate.root
'这样的命名方法是为了兼容 set_root 这样的命名方法是为了兼容 phplib, 以下将不再重复说明
publicsubset_root (byvalvalue)
ifnotfolderexist (value) Thenshowerror (value & "不是有效目录或目录不存在!")
m_root = 값
Endsub
publicfunctionget_root ()
get_root = m_root
최종 기능 장애
PublicPropertyletRoot (ByValValue)
set_root (값)
엔드 프로페티
PublicPropertygetRoot ()
루트 = m_root
엔드 프로페티
'设置模板文件
'예 : kkttemplate.set_file ( "hndtpl", "index.htm")
'为兼容, 처리 本类不支持多模板文件 phplib 而保留
publicsubset_file (byvalhandle, byvalfilename)
m_filename = filename
m_blocklist.addhandle, loadfile ()
Endsub
publicfunctionget_file ()
get_file = m_filename
최종 기능 장애
'PublicPropertyletfile (핸들, 파일 이름)
'set_filehandle, 파일 이름
'엔드페로티
'PublicProperTygetFile ()
'file = m_filename
'엔드페로티
'有 有, , 、 、 heep 、 주석 三种
publicsubset_unknowns (byvalunknowns)
m_unknowns = 미지의
Endsub
publicFunctionGet_unkNowns ()
get_unknowns = m_unknowns
최종 기능 장애
PublicPropertyLeTunkNowns (ByValunkNown)
m_unknowns = 알 수 없습니다
엔드 프로페티
PublicPropertygetunkNowns ()
미지의 = m_unknowns
엔드 프로페티
publicsubset_block (byvalparent, byvalblocktag, byvalname)
딤섬
m_regexp.pattern = " ([/봄 여름 시즌.]*) "
ifnotm_blocklist.exists (부모) Thenshowerror ( "未指定的块标记"& parent)
setMatches = m_regexp.execute (m_blocklist.item (부모))
foreachMatchInMatches
m_blocklist.addblocktag, match.submatches (0)
m_blocklist.item (부모) = replace (m_blocklist.item (parent), match.value, "{"& name & "}")
다음
setMatches = 아무것도
Endsub
publicsubset_var (byvalname, byvalvalue, byvalappend)
Dimval
ifisnull (value) thenval = ""elseval = value
ifm_valuelist.exists (이름)
ifappendthenm_valuelist.item (name) = m_valuelist.item (name) & val_
elsem_valuelist.item (name) = val
또 다른
m_valuelist.addname, 값
endif
Endsub
publicsubunset_var (byvalname)
ifm_valuelist.exists (이름) them_valuelist.remove (이름)
Endsub
privateFunctionInstanceValue (byvalblocktag)
디키, i
instancevalue = m_blocklist.item (blocktag)
키 = m_valuelist.keys
fori = 0tom_valuelist.count-1
instancevalue = replace (instancevalue, "{"& keys (i) & "}", m_valuelist.item (키 (i)))
다음
최종 기능 장애
publicubparse (byvalname, byvalblocktag, byvalappend)
ifnotm_blocklist.exists (blocktag) Thenshowerror ( "未指定的块标记"& parent)
ifm_valuelist.exists (이름)
ifappendthenm_valuelist.item (name) = m_valuelist.item (name) & instancevalue (blocktag) _
elsem_valuelist.item (name) = instanceValue (blocktag)
또 다른
m_valuelist.addname, instanceValue (blocktag)
endif
Endsub
PrivateFunctionFinish (ByValContent)
SelectCasem_unkNowns
"유지"마감 = 컨텐츠
"제거"사례
m_regexp.pattern = "/{[^/t/r/n}]+/}"
finish = m_regexp.replace (content, "")
사례 "댓글"
m_regexp.pattern = "/{([^/t/r/n}]+)/}"
마무리 = m_regexp.replace (콘텐츠, " ")
CaseElSefinish = 내용
EndSelect
최종 기능 장애
publicsubp (byvalname)
ifnotm_valuelist.exists (이름) Thenshowerror ( "不存在的标记"& name)
response.write (finish (m_valuelist.item (name)))
Endsub
엔드 클래스
%>
3 、使用例子
下面举三个例子进行说明。
1) 简单的值替换
模板文件为 mytemple.tpl, 内容 :
祝贺!你赢了一辆 {일부 _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, i
동물 = 배열 ( "ay", "小狗", "小强")
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, 동물, 식물
setkkt = newkkttemplate
myname = "kkttemplateblocktest ..."
동물 = 배열 ( "ay", "植物")
plant = 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 "식물", 식물 (i) (j), false
kkt.parse "p", "plantlist", true
다음
kkt.parse "a", "animallist", true
다음
kkt.parse "out", "hndkkttemp", false
kkt.p "out"
%>
执行结果 :
| KKTTEMPLATEBLOCKTEST ... 测试 |
| 我的动植物园 : |
| 动物 |
| 小猪 |
| 小白 |
| 小强 |
| 植物 |
| 玫瑰 |
| 向日葵 |
4 、小结
本文主要介绍了基于 asp 利用模板类实现代码与页面分离的方法 利用模板类实现代码与页面分离的方法, 当然还有其它更好的解决方案。本文旨在抛砖引玉各位读者、 웹 开发参与进来 开发参与进来, 多提宝贵意见 多提宝贵意见, 多作交流, 共 同进步!