以文本方式查看主题

-  W3CHINA.ORG讨论区 - 语义网·描述逻辑·本体·RDF·OWL  (http://bbs.xml.org.cn/index.asp)
--  『 XML源码及示例(仅原创和转载) 』  (http://bbs.xml.org.cn/list.asp?boardid=32)
----  XML在ASP中的一些运用[转帖]  (http://bbs.xml.org.cn/dispbbs.asp?boardid=32&rootid=&id=25170)


--  作者:咖啡心情
--  发布时间:12/9/2005 8:56:00 AM

--  XML在ASP中的一些运用[转帖]
翻译得很蹩脚,望大家谅解,呵呵。
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是不需要这么干的,仅仅是几句代码而已。


--  作者:lunarcy
--  发布时间:5/13/2006 9:45:00 AM

--  
辛苦了~~~不过我刚学很多不懂
--  作者:lunarcy
--  发布时间:5/13/2006 9:45:00 AM

--  
辛苦了~~~不过我刚学很多不懂
--  作者:bruceshen
--  发布时间:6/19/2006 4:02:00 PM

--  
还的我慢慢研究,不是很懂!
--  作者:microking
--  发布时间:7/23/2006 8:52:00 PM

--  
还的我慢慢研究,不是很懂!
--  作者:hedoyu1
--  发布时间:8/7/2006 8:05:00 AM

--  
很多东西看不懂
--  作者:dahaidao
--  发布时间:8/11/2006 11:12:00 AM

--  
打个包下载怎么样?
--  作者:zj2302552
--  发布时间:12/14/2006 5:30:00 PM

--  
LZ有没有聊天室的应用的源码?ASP+XML的
--  作者:hjx_221
--  发布时间:12/31/2006 10:57:00 AM

--  
█ ☆█ ◢◤◥◣ ███◣ ███◣ █ ☆█ 
█▅▅█ █▄▄█ █ ☆█ █ ☆█ ◥███ 
█  █ █  █ ███◤ ███◤    █ 
█  █ █ ☆█ █   ☆█   ☆◥██◤


--  作者:ykrl089
--  发布时间:7/28/2007 4:21:00 PM

--  
基本看不懂,先研究下。。。
--  作者:liuzhijie
--  发布时间:8/2/2008 9:20:00 AM

--  
有没有人发个XML的文章发布系统出来呀。

W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
93.750ms