翻译得很蹩脚,望大家谅解,呵呵。
scriptlets – 一个更好的组织你的asp代码的方法
使用可扩展标志语言(xml)编写的脚本和组件和.xml被用来定义对象,方法,属性等等。
同时脚本还提供函数。脚本语言可以是javascript, vbscript等等。运用在网站的运用程序和网站的
普通例子,现在都可以被转换成scriptlets. 只要使用scriptlets 来写组件,
他们可以再被从新使用在网站或则运用程序各部分,既可以使用在服务端(例如asp代码)
也能够被使用在客户端(例如浏览器)
这里将集中讨论服务端的用来组件asp代码的scriptlets。
早些时候,asp开发者习惯写include文件。用来做公共的服务端例行程序,
还用在他们的网站运用程序中。从功能上说,include文件被局限在仅仅是在页面中引用。
完成传递参数的功能。
现在同样的公共例行程序能够中添加了scriptlet方法和并且有助与在运用程序中使用组件。
这个方法现在非常普遍的运用在网站运用程序中,能够被运行在同一个服务器上的运用程序重用。
这个方法使得从数据库中获取(pull-down)数据将变得非常通俗化。
例子:建立scriptlet方法和属性,使得很通俗的从数据库中获取数据。
并且使得运行在同一个服务器上所有的运用程序使用这个同样的scriptlet,而不用重新写代码了。
代码如下:
scriptlet文件名为scp_query2list.sct
<?xml version="1.0"?>
<scriptlet>
<registration
description="scp_query2list"
progid="scpquery2list.scriptlet"
version="1.00"
classid="{e32d2a70-4e11-11d3-a9f0-0080c8034244}"
>
</registration>
<public>
<method name="query2list">
<parameter name="objconn"/>
<parameter name="query"/>
</method>
</public>
<implements type="asp" id="asp"/>
<script language="vbscript">
<![cdata][
sub query2list(objconn, query)
dim objrs
set objrs = objconn.execute(query)
if objrs.eof and objrs.bof then
response.write "<option value=none>没有找到记录。</option>"
else
do while not objrs.eof
response.write "<option value=" & objrs(0) & ">" & objrs(0) & "</option>"
objrs.movenext
loop
end if
objrs.close
set objrs = nothing
end sub
]]>
</script>
</scriptlet>
其中在scriptlets中使用的各种元素的具体说明可以在http://msdn.microsoft.com/scripting处找到。
下面是怎么具体调用scriptlets的代码:(只要是在同一个服务器上注册了scriptlets的运用程序,都可以使用这段代码)
query2list.asp 文件:
<%@ language=vbscript %>
<%
option explicit
dim objconn
dim dbpath
dim sql
dim objscpquery2list
set objconn = server.createobject ("adodb.connection")
dbpath="dbq=" & server.mappath("techpapers_test.mdb")
objconn.open "driver={microsoft access driver (*.mdb)}; " & dbpath
— query required for pull down
sql = "select authorfirst from papers"
set objscpquery2list = server.createobject ("scpquery2list.scriptlet")
%>
<html>
<body>
<center>
<form name = "fr1">
<select>
<option value="none" selected>选择发行人</option>
<% call objscpquery2list.query2list(objconn, sql) %>
</select>
</form>
</center>
</body>
</html>
<%
objconn.close
set objconn = nothing
set objscpquery2list = nothing
%>
出现的问题:
第一次使用scriptlets有可能会出现这样的问题,就是内存浪费现象,改进方法如下:
将asp对象传递给scriptlets,而代替使用asp接口。(就是不使用 <implements type="asp" id="asp"/>申明)
testscp.sct:
<?xml version="1.0"?>
<scriptlet>
<?scriptlet error="true" debug="true"?>
<registration
description="testscp"
progid="testscp.scriptlet"
version="1.00"
classid="{78a33aa0-335d-11d3-a9a9-0080c8034244}"
>
</registration>
<public>
<property name="cnnstate">
<get/>
</property>
<method name="testwrite">
<parameter name="shtml"/>
</method>
<method name="testwriteline">
<parameter name="shtml"/>
</method>
<method name="aspconnect">
<parameter name="oserver"/>
<parameter name="oapplication"/>
<parameter name="osession"/>
<parameter name="orequest"/>
<parameter name="oresponse"/>
</method>
</public>
<script language="vbscript">
<![cdata][
private cnnstate, server, application, session, request, response
cnnstate = false
function get_cnnstate()
get_cnnstate = cnnstate
end function
sub aspconnect(oserver, oapplication, osession, orequest, oresponse)
set server = oserver
set application = oapplication
set session = osession
set request = orequest
set response = oresponse
cnnstate = true
end sub
sub testwrite(shtml)
response.write shtml
end sub
sub testwriteline(shtml)
response.write shtml & "<br>"
end sub
]]>
</script>
</scriptlet>
传递asp对象的asp程序如下:
testscp.asp代码
<%
set scrip=server.createobject("testscp.scriptlet")
if err then
response.write "<br>error:" & err.number
response.write "<br>" & err.description
response.write "<br>" & err.source
response.end
end if
response.write "<br> cnnstate=" & scrip.cnnstate
if err then
response.write "<br>error:" & err.number
response.write "<br>" & err.description
response.write "<br>" & err.source
response.end
end if
response.write "<br>connecting…"
scrip.aspconnect server, application, session, request, response
if err then
response.write "<br>error" & err.number
response.write "<br>" & err.description
response.write "<br>" & err.source
response.end
end if
response.write "<br>cnnstate=" & scrip.cnnstate & "<br>"
response.write "<br>testing …write<br>"
scrip.testwriteline ""
scrip.testwrite "this is the first part "
scrip.testwrite "and this is the second."
response.write "<br>testing …writeline<br>"
scrip.testwriteline "this is text with a line break."
scrip.testwriteline "and so is this."
%>
上面的代码没有包括<implement type = "asp"/>, 但是仍然可以访问asp对象。
因为他们是被当成对象传递给scriptlet.
下面再给出一个很常用的取时间的狸子:
scp_dmy.sct
<?xml version="1.0"?>
<scriptlet>
<?scriptlet error="true" debug="true"?>
<registration
description="scp_dmy"
progid="scpdmy.scriptlet"
version="1.00"
classid="{bba68a50-3ae0-11d3-a9c0-0080c8034244}"
>
</registration>
<public>
<method name = "option_num">
<parameter name = "num"/>
</method>
<method name = "option_month">
</method>
<method name = "option_year">
</method>
</public>
<implements type="asp" id="asp"/>
<script language="vbscript">
<![cdata][
sub option_num(num)
for i = 1 to num
if i<10 then
x = 0 & i
else
x = i
end if
response.write "<option value = " & x & ">" & x & "</option>"
next
end sub
sub option_month()
for i = 1 to 12
if i<10 then
x = 0 & i
else
x = i
end if
response.write "<option value = " & x & ">" & monthname(x,true) & "</option>"
next
end sub
sub option_year()
for i = -1 to 3
yy = year(dateadd("yyyy",i,date()))
response.write "<option value = " & yy & ">" & yy & "</option>"
next
end sub
]]>
</script>
</scriptlet>
dmy_check.asp: 文件
<%
set scrip = server.createobject("scp_dmy.scriptlet")
%>
<html>
<head></head>
<body>
<form name = "form1">
从 :
<select name = "d1">
<option value="">dd</option>
<% call scrip.option_num(31) %>
</select>
<select name = "m1">
<option value="">mm</option>
<% call scrip.option_month() %>
</select>
<select name = "y1">
<option value="">yy</option>
<% call scrip.option_year() %>
</select>
<br><br>
到 :
<select name = "d2">
<option value="">dd</option>
<% call scrip.option_num(31) %>
</select>
<select name = "m2">
<option value="">mm</option>
<% call scrip.option_month() %>
</select>
<select name = "y2">
<option value="">yy</option>
<% call scrip.option_year() %>
</select>
</form>
<%
set scrip = nothing
%>
</body>
</html>
要记住的是,现在服务器上所有的程序都能够使用这个scriptlet,这能够减少include文件的使用。
上面的代码还能够增加一些功能,例如使用不同的格式显示日期。
也就是说如果一个运用程序需要显示dd-mm-yyyy的日期格式,可以在scriptlet中调用各自的函数。
最后,使用scriptlet的还有一个好处就是,它不象真正的asp组件,因为真正的asp组件在注册和取消注册的
时候都需要你重新启动iis,而使用scriptlet是不需要这么干的,仅仅是几句代码而已。
