文章探索:   分类:    关键字:  
  + 栏目导航
  + 相关文章
Ajax核心:XMLHTTP组件相关技术资料
远程获取内容,并将内容存在本地电脑..
xmlhttp组件获取远程文件并筛选出目标..
XMLHTTP对象及其方法
把HTML表单提交的数据转化成XML文件
利用XMLHTTP无刷新添加数据之Post篇
Js+Xml:不刷新页面获取对应网址的网页..
xml(元标记语言)学习基础一
Java语言编程中更新XML文档的常用方法..
简析JAVA中的XML编程
XML及其技术指南
XML教程(2)--XML元素与XML属性值
XML教程(1)--严格的语法
从XML到Java代码的数据绑定之一
神奇的XML--突破CGI权限的约束
基于XML的数据库总体分析
XML 中的常见问题(3)
XML 中的常见问题(2)
XML 中的常见问题(1)
一个简单的XML Schema的例子
Web设计中如何使用XML数据3
Web设计中如何使用XML数据2
Web设计中如何使用XML数据1
大话XML(3)XML的语法
构造未来Web页面的工具语言-- XML
不离开页面刷新数据
文件上传的实现
XML的产生
将XML文件链接至HTML网页
动态产生XML文档的几种方式


技术教程 -> XML教程 ->  
XML在ASP中的一些运用
来源:转载   人气:846   录入时间:2007-11-8
    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是不需要这么干的,仅仅是几句代码而已。
   




Copyright(C)2007-2024 广州市佳沛数码科技有限公司 版权所有
公司地址: 广州市荔湾区东漖北路560号511室
电话:020-81803473 传真:020-81544987