针对有网友说看不见文章内容, 现提示如下: 点击每一个标题行任一地方都会展开和隐藏此文章内容(不要点击标题). 目前展开隐藏功能只支持IE浏览器,虽然可以改成支持FF浏览器,不过现在一直没时间去弄,等有时间再修改了。 |
blog名称:乱闪Blog 日志总数:267 评论数量:1618 留言数量:-26 访问次数:2669055 建立时间:2005年1月1日 |
|

| |
ASP + XML + JavaScript 实现动态无限级联动菜单
|
作者:Jockey 来源:Jockey's Blog 结合ASP来完成对数据库值的读取,然后写入XML文件,再用JavaScript读出来并且控制它的联动。 这儿的关键是把数据库内的N层数据类读出来: 我的数据库表结构是这样的: 'tbl_Class 列名 数据类型 长度 说明 ClassID int 4 类ID ModuleID int 4 模块ID GroupID int 2 标识一个组 ClassName nvarchar 50 类别名称 ParentID int 2 连接到组(0表示是父类)
'##################我的ASP代码如下#################### '我把连接数据库的代码忽略。
'函数名字:OpenXml(FileName) '入口参数: filename 需要连接或打开的xml文件名 '返回值 :XmlDoc就是一个成功装载XML文档的对象了。 ' 有错误则打印错误信息strError '------------------------------------------------
function OpenXml(filename) dim strSourceFile ,XmlDoc,strError strSourceFile = filename Set XmlDoc = Server.CreateObject("Microsoft.XMLDOM") '创建XMLDOM实例 XmlDoc.async = false XmlDoc.load(strSourceFile) OpenXml=XmlDoc.parseerror.errorcode if XmlDoc.parseerror.errorcode<>0 then strError="<h2>error"&XmlDoc.parseerror.errorcode&"</h2>" strError=strError&XmlDoc.parseerror.reason&"<br>" strError=strError&XmlDoc.parseerror.url&"<br>" strError=strError&XmlDoc.parseerror.line&"<br>" strError=strError&XmlDoc.parseerror.filepos&"<br>" strError=strError&XmlDoc.parseerror.srcText&"<br>" response.write strError '输出错误 else set OpenXml=XmlDoc '返回实例 end if end function
'------------------------------------------------ '函数名字:CloseXml() '参数: XmlDoc XML组件实例 '------------------------------------------------ function CloseXml(XmlDoc) if IsObject(XmlDoc) then set XmlDoc=nothing end if end function
'------------------------------------------------ '函数名字:SelectXmlNode '参数:XmlDoc XML组件实例 ' e 元素的名字 '返回元素实例 '------------------------------------------------ function SelectXmlNode(XmlDoc,e) dim n
set n=XmlDoc.selectSingleNode("//" & e ) set selectXmlNode= n
end function
Dim n,np,MaxGroup,root,xmlDoc,nt,filename,s,ss,TorF filename=server.mappath("demo.xml") set xmlDoc=openXML(filename)'打开XML RemoveAllNodes xmlDoc,"Root"'把Root和它下面的子项清除,这样可以多次方便读写 set root= xmlDoc.createElement("Root") xmlDoc.appendChild root'创建一个顶层元素 sql="select Max(GroupID) from tbl_Class " '读出最大的层次 set rs=cn.execute(sql) if isnull(rs(0)) then MaxGroup=0 else MaxGroup=rs(0) '如果为null 表示没有数据 s="":ss="" set nt=xmldoc.createElement("item") nt.setAttribute "text", "请选择" root.appendChild nt '创建一个元素 for i=1 to MaxGroup '开始循环 sql="select * from tbl_Class where GroupID=" & i '由底层向顶层读取 set rs=cn.execute(sql) TorF=False '为了每一个层上都创建一个“请选择”的空取。 do while rs.eof =false '开始读取下层的数据 Set n = xmlDoc.createElement("item" & rs("ClassID")) '创建一个命名为item + ID号的标记元素 n.setAttribute "text",rs("ClassName")'把它的属性“text”设置为数据库表内的
ClassName n.setAttribute "value",rs("ClassID")'把它的属性“value”设置为数据库表内的
ClassID if rs("ParentID")>0 then '是有上层数据的 set np=selectXmlNode(xmlDoc,"item" & rs("ParentID")) '把它的上层数据元素先读出保存在np if TorF=false then '如果TorF为False值时 set nt=xmldoc.createElement("item") '创建一个元素保存在nt nt.setAttribute "text", "请选择"'把它的text属性设置为“请选择” np.appendChild nt 'np把它加为子元素 end if TorF=true '设置true np.appendChild n 'np 把n加为子元素 else root.appendChild n '如果是第一层数据就把它加入为root下的一个子元素 end if rs.movenext '下一条指针 loop ss=ss & "<SELECT id=Select" & i & " width=1 ></SELECT></span>" '每有一层就创建一个
<select> s=s & ",'Select" & i & "'" '把每个<select>的id 保存在变量s,它的格式为:id1,id2,id3,id4 next xmlDoc.save filename '正式保存Xml文件 CloseXml xmlDoc '关闭Xml文件 response.write ss '直接把<select>输出到文档 s=mid(s,2)
//在HTM文件内调用xmlselect.js <SCRIPT language=JavaScript src="xmlselect.js"></SCRIPT> <SCRIPT language=JavaScript> <!--//** power by fason function init() { var Sel = [<%=s%>]; attachSelect("demo.xml", Sel,["论坛导航"]); };//--> </SCRIPT> init();
//#########我把它的JS代码贴出来,作者叫:蒲佛信,http://fason.nease.net/samples/xmlselect/这儿有示例和代码。
//-----------------------------xmlselect.js文件开始-------------------------------
//-----------------------------------------------------/ // NichName :fason // Autho :Forbes Pu(蒲佛信) // Email :fason_pfx@hotmail.com // HomePage :http://fason.nease.net // Blog :http://blog.mvpcn.net/fason/ // http://blog.csdn.net/fason/ // // function :attachSelect(sXMLSrc, aSel[, sStore]) // param1 :sXMLSrc(URL of XML data source) // param2 :aSel(array of SELECT controls's ID) // param3 :array of default value when display //-----------------------------------------------------/
function attachSelect(sXMLSrc, aSel, sStore) { var oXML = CreateXmlDocument(); var oDocument = null; var store = sStore ? sStore : []; var Sel = new Array();
for (var i=0; i<aSel.length; i++) Sel[i] = document.getElementById(aSel[i]); if (!oXML){ throw new Error('Not support!\nplease install a XML parser');return; } oXML.onreadystatechange = function () { if (oXML.readyState == 4) { attachXML(); } }; oXML.load(sXMLSrc);
function CreateXmlDocument() { if (document.implementation && document.implementation.createDocument) { var doc = document.implementation.createDocument("", "", null); if (doc.readyState == null) { doc.readyState = 1; doc.addEventListener("load", function () { doc.readyState = 4; if (typeof doc.onreadystatechange == "function") doc.onreadystatechange(); }, false); } return doc; } else if (window.ActiveXObject) { var prefix = ["MSXML3","MSXML2","MSXML","Microsoft"]; for (var i=0;i<prefix.length;i++) { try { var doc = new ActiveXObject(prefix[i] +
".DomDocument"); doc.setProperty("SelectionLanguage","XPath"); return doc; } catch (e) {} } } return null; };
function attachXML() { oDocument = oXML.documentElement; if (!oDocument) { throw new Error('No XML data!'); return; } for (var i=0;i<aSel.length-1;i++){ addEvent(Sel[i], "onchange", function(x) { return function () { doChange(x); } }(i+1)); } doChange(0); };
function selectXMLNode(x) { var sPath = "/*"; var oDoc = oDocument; for (var i=0;i<x;i++) sPath += "/*[" + (Sel[i].selectedIndex+1) + "]"; if (typeof(oDoc.selectSingleNode)!='undefined') return
oDoc.selectSingleNode(sPath); else { var doc=oDoc.nodeType==9?oDoc:oDoc.ownerDocument; var res = doc.createNSResolver(oDoc.nodeType==9?
oDoc.documentElement:oDoc); return doc.evaluate(sPath,oDoc, res, 9, null).singleNodeValue; } };
function addEvent(el, sHandler, fnc) { if (el.attachEvent) { el.attachEvent(sHandler, fnc); } else if (el.addEventListener) { el.addEventListener(sHandler.replace(/on/i, ''), fnc, false); } else { el[sHandler] = fnc; } };
function doChange(n) { var el = selectXMLNode(n); var nodes = el ? el.childNodes :[]; var s = Sel[n]; var f = 0; if (nodes.length>0) { with (s){ length = 0; for (var i = 0,j = 0;i<nodes.length;i++) { if (nodes[i].nodeType!=1)continue; var t = nodes[i].getAttribute("text"); var v = nodes[i].getAttribute("value") ? nodes
[i].getAttribute("value") : t; if (v == store[n]) f = j; options[j++] = new Option(t, v); } options[f].selected = true; } if (++n<Sel.length) doChange(n); } else { for (var i=n; i<Sel.length; i++) { with (Sel[i]) { length = 0; options[0] = new Option('--'); options[0].selected = true; } } } }; };
//-----------------------------xmlselect.js文件结束-------------------------------
由于Xml的操作简便直接,使用起来得心应手。 |
|
将指定的asp文件内容生成HTML文件
|
<% Function GetPage(url) dim Retrieval Set Retrieval = CreateObject("Microsoft.XMLHTTP") With Retrieval .Open "Get", url, False ', "", "" .Send GetPage = BytesToBstr(.ResponseBody) End With Set Retrieval = Nothing End Function
Function BytesToBstr(body) dim objstream set objstream = Server.CreateObject("adodb.stream") objstream.Type = 1 objstream.Mode =3 objstream.Open objstream.Write body objstream.Position = 0 objstream.Type = 2 objstream.Charset = "GB2312" BytesToBstr = objstream.ReadText objstream.Close set objstream = nothing End Function on error resume next Url="http://www.taiang.com.cn/index.asp" response.write "开始更新首页..." wstr = GetPage(Url)
Set fs=Server.CreateObject("Scripting.FileSystemObject")
'if not MyFile.FolderExists(server.MapPath("/html/")) then 'MyFile.CreateFolder(server.MapPath("/html/"))' 'end if
If (fs.FileExists(server.MapPath("./")&"\index.htm")) Then fs.DeleteFile(server.MapPath("./")&"\index.htm") End If
Set CrFi=fs.CreateTextFile(server.MapPath("./")&"\index.htm") Crfi.Writeline(wstr) set CrFi=nothing set fs=nothing response.write "...<font color=red>更新完成!</font>" %> |
|
用ASP及VML实现股票走势图
|
作者:NB联盟-小竹 <HTML xmlns:v> <HEAD> <STYLE> v\:*{behavior:url(#default#VML);} *{font-size:12px} </STYLE> </HEAD> <BODY topmargin=0 leftmargin=0 bgcolor=#D7EEFF>
<DIV id=showdiv style="font-size:12px; Color:RED; DISPLAY: none; LEFT: 0px; PADDING-BOTTOM: 2px; PADDING-LEFT: 2px; PADDING-RIGHT: 2px; PADDING-TOP: 2px; POSITION: absolute; TABLE-LAYOUT: fixed; TOP: 0px; WHITE-SPACE: nowrap; Z-INDEX: 500"></DIV> <script language="javascript"> <!-- //加速alt,title的显示 var oldtext="abc";
function window.onload(){ try{myid2.height=window.document.body.scrollHeight} catch(e){} }
function document.onmousemove(){ try{ if(event.srcElement.getAttribute('onMOver')){ showdiv.style.left=event.x-3;showdiv.style.top=event.y+document.body.scrollTop+18;if(event.srcElement.onMOver!=oldtext){oldtext=event.srcElement.onMOver;showdiv.innerText=oldtext;showdiv.style.backgroundColor='#FFF6FF'};if(showdiv.style.display=='none')showdiv.style.display='' if(showdiv.style.posLeft+300>screen.width){showdiv.style.posLeft=520} } else{ if(showdiv.style.display=='')showdiv.style.display='none';} } catch(e){} } //--> </SCRIPT>
<?xml:namespace prefix=v /> <% '连接数据库 set conn=Server.CreateObject("Adodb.Connection") connStr="Provider=SQLOLEDB;Data Source=(local);database=DBName;uid=user;pwd=pass;" conn.Open connStr
'初始化,定义变量 BoardID=int(Request("BoardID")) if Request("BoardID")="" then BoardID=1 PicWidth=720 PicHeight=300
'显示股票列表下拉菜单 sql="Select * from Board where BoardID in (Select BoardID From Stocks)" set RsBoard=conn.execute(sql) StockStr="<select onchange=""location.replace('Trend.asp?BoardID='+this.value)"">" do while not RsBoard.eof if RsBoard("BoardID")=BoardID then ChkStr=" selected" else ChkStr="" end if StockStr=StockStr&"<option value="&RsBoard("BoardID")&ChkStr&">"&RsBoard("BoardName")&"</option>" RsBoard.movenext loop set RsBoard=nothing StockStr=StockStr&"<select>" response.write StockStr
'打开股票走势表 sql="Select * from StocksTrend where BoardID="&BoardID&" and CalTime>getDate()-1 and Day(CalTime)=Day(getDate()) order by ID" set rs=Server.CreateObject("Adodb.Recordset") rs.Open sql,conn,1,1
'获取股票价格列表至数组,并计算最高最低价 Rec=rs.RecordCount redim Price(Rec) Highest=0 Lowest=9999 for i=1 to Rec Price(i)=rs("Price") if Price(i)>Highest then Highest=Price(i) if Price(i)<Lowest then Lowest=Price(i) rs.movenext next set rs=nothing
'画时间点,间隔6小时 for i=0 to 24 step 6 X=Round(i/24*PicWidth) DrawLine X,PicHeight,X,PicHeight+5,"#808080" PrintWord X,PicHeight+15,i&":00" next
'画走势图边框 DrawLine 0,0,PicWidth,0,"#000000" DrawLine 0,0,0,PicHeight,"#000000" DrawLine PicWidth,0,PicWidth,PicHeight,"#000000" DrawLine 0,PicHeight,PicWidth,PicHeight,"#000000"
'画四等分线 DrawLine 0,PicHeight*1/4,PicWidth,PicHeight*1/4,"#AAAAAA" DrawLine 0,PicHeight*2/4,PicWidth,PicHeight*2/4,"#AAAAAA" DrawLine 0,PicHeight*3/4,PicWidth,PicHeight*3/4,"#AAAAAA"
'标明四等分线价格 PrintWord PicWidth+15, 0/4*PicHeight, FormatNumber(Highest-(Highest-Lowest)*0/4,2,-1,0,0) PrintWord PicWidth+15, 1/4*PicHeight, FormatNumber(Highest-(Highest-Lowest)*1/4,2,-1,0,0) PrintWord PicWidth+15, 2/4*PicHeight, FormatNumber(Highest-(Highest-Lowest)*2/4,2,-1,0,0) PrintWord PicWidth+15, 3/4*PicHeight, FormatNumber(Highest-(Highest-Lowest)*3/4,2,-1,0,0) PrintWord PicWidth+15, 4/4*PicHeight, FormatNumber(Highest-(Highest-Lowest)*4/4,2,-1,0,0)
'画走势图 for i=1 to Rec if i=1 then SX=0 SY=0 else SX=X SY=Y end if Y=PicHeight-Round((Price(i)-Lowest)/(Highest-Lowest)*PicHeight) X=Round((i-1)*5) DrawPrice SX,SY,X,Y,Price(i),"#000000" next
'自定义函数:画线 function DrawLine(SX,SY,X,Y,C) %><v:line style="POSITION:absolute;LEFT:10;TOP:10" from="<%=SX%>,<%=SY%>" to="<%=X%>,<%=Y%>" strokecolor="<%=C%>" strokeweight="1pt"></v:line><% response.write vbcrlf end function
'自定义函数:画线(带alt提示功能) function DrawPrice(SX,SY,X,Y,Price,C) %><v:line onMOver="<%=Price%>" style="POSITION:absolute;LEFT:10;TOP:10" from="<%=SX%>,<%=SY%>" to="<%=X%>,<%=Y%>" strokecolor="<%=C%>" strokeweight="1pt"></v:line><% response.write vbcrlf end function
'显示文本(默认红色) function PrintWord(X,Y,Word) %><SPAN style="LEFT:<%=X%>;TOP:<%=Y%>;COLOR:RED;FONT-FAMILY:宋体;POSITION:absolute"><%=Word%></SPAN><% response.write vbcrlf end function %> |
|
asp查询xml的代码,实现了无刷新、模糊查询功能
|
比较笨的办法,最好是先把数据存入xml文件再进行操作速度应该还要更快
<html> <head> <title>不刷新页面查询的方法</title> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> </head> <script language="javascript"> <!--初始化,将数据岛中数据装入列表框中--> function loadinsel() { var employeeid,employeelastname; //分别存放雇员ID和雇员名字 root=document.all.xmlemployees.childNodes.item(0); //返回第一个元素--employee for(i=0;i<root.childNodes.length;i++){ getnode=root.childNodes(i); //得到empolyee的一个子节点 employeeid=root.childNodes(i).getAttribute("emid");//得到雇员ID for(j=0;j<getnode.childNodes.length;j++){ employeeinf=getnode.childNodes(j).nodeName; if(employeeinf=="lastname"){ employeelastname=getnode.childNodes(j).text; //得到雇员名字 } } //将得到的employeeid和employeelastname写进select中 if(employeeid!="" && employeelastname!=""){ option1=document.createElement("option"); option1.text=employeelastname; option1.value=employeeid; employeelist.add(option1); } } } <!--初始化,从数据岛中检索数据,装入列表框中--> function findemployee(){ var employeelastname,employeeid; //分别存放雇员名字和雇员ID employeelastname=""; employeeid=""; findtext=window.findcontent.value; //得到检索条件 //清除列表框 employeecount=employeelist.length for(i=employeecount-1;i>=0;i--){ employeelist.remove(i); } root=window.xmlemployees.childNodes(0); for(i=0;i<root.childNodes.length;i++){ getitem=root.childNodes(i); //得到empolyee的一个子节点 employeeid=root.childNodes(i).getAttribute("emid"); //得到雇员ID for(j=0;j<getitem.childNodes.length;j++){ if(getitem.childNodes(j).nodeName=="lastname"){ employee_temp=getitem.childNodes(j).text; if(employee_temp.indexOf(findtext)!=-1){ //查找匹配项 employeelastname=employee_temp; //找到名字匹配的雇员 } }
} //将符合条件的雇员信息写进select中 if(employeeid!="" && employeelastname!=""){ option1=document.createElement("option"); option1.value=employeeid; option1.text=employeelastname; window.employeelist.add(option1); employeeid=""; employeelastname=""; } } } </script> <body bgcolor="#FFFFFF" text="#000000" onload="javascript:loadinsel()"> <table width="80%" border="1"> <tr> <td> 请输入查询条件: <input type="text" name="findcontent"> <input type="button" name="Submit" value="查找" onclick="javascript:findemployee()"> </td> </tr> <tr> <td> 查询结果: <select name="employeelist"> </select> </td> </tr> </table> <?xml version="1.0" encoding="gb2312"?> <% servername="wyb" '服务器名 user="sa" '用户名 pw="" '用户密码 databasename="northwind" '数据库名 set conn=server.CreateObject("adodb.connection") conn.Open "DRIVER=SQL Server;SERVER="&servername&";UID="&user&";pwd="&pw&";DATABASE="&databasename set rs=server.CreateObject("adodb.recordset") sql="Select employeeid,lastname from employees order by employeeid" rs.Open sql,conn%> <!--将数据库中信息放入数据岛中--> <xml id="xmlemployees"> <employee> <%do while not rs.eof%> <employeeitem emid="<%=rs("employeeid")%>"> <lastname><%=rs("lastname")%></lastname> </employeeitem> <%rs.movenext%> <%loop%> </employee> </xml> <%rs.close set rs=nothing %> </body> </html> |
|
Access 2000 数据库 80 万记录通用快速分页类
|
作者:未知 来源:xiaoyuehen 的 Blog 主要思路: 用一条语句统计(Count)出记录数(而不在查询时获得 RecordCount 属性), 缓存在 Cookies 中, 跳转时就不用再次统计. 使用 ADO 的 AbsolutePage 属性进行页面跳转即可. 为方便调用而写成类, 代码主要地方已有说明
硬件环境: AMD Athlon XP 2600+, 256 DDR 软件环境: MS Windows 2000 Advanced Server + IIS 5.0 + Access 2000 + IE 6.0 测试结果: 初次运行在 250(首页) - 400(末页)毫秒, (记录数缓存后)在页面间跳转稳定在 47 毫秒以下.第1页跳到最后一页不多于 350 毫秒
适用范围: 用于普通分页. 不适用于有较复杂的查询时: 如条件为"[Title] Like '%最爱%'", 查询的时间大大增加, 就算 Title 字段作了索引也没用. <%@LANGUAGE = "VBScript" CODEPAGE="936"%> <%Option Explicit%> <% Dim intDateStart intDateStart = Timer() Rem ## 打开数据库连接 Rem ################################################################# function f__OpenConn() Dim strDbPath Dim connstr strDbPath = "../db/test.mdb" connstr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" connstr = connstr & Server.MapPath(strDbPath) Set conn = Server.CreateObject("Adodb.Connection") conn.open connstr End function Rem ################################################################# Rem ## 关闭数据库连接 Rem ################################################################# function f__CloseConn() If IsObject(conn) Then conn.close End If Set conn = nothing End function Rem ################################################################# Rem 获得执行时间 Rem ################################################################# function getTimeOver(iflag) Dim tTimeOver If iflag = 1 Then tTimeOver = FormatNumber(Timer() - intDateStart, 6, true) getTimeOver = " 执行时间: " & tTimeOver & " 秒" Else tTimeOver = FormatNumber((Timer() - intDateStart) * 1000, 3, true) getTimeOver = " 执行时间: " & tTimeOver & " 毫秒" End If End function Rem ################################################################# Class Cls_PageView Private sbooInitState Private sstrCookiesName Private sstrPageUrl Private sstrPageVar Private sstrTableName Private sstrFieldsList Private sstrCondiction Private sstrOrderList Private sstrPrimaryKey Private sintRefresh Private sintRecordCount Private sintPageSize Private sintPageNow Private sintPageMax Private sobjConn Private sstrPageInfo Private Sub Class_Initialize Call ClearVars() End Sub Private Sub class_terminate() Set sobjConn = nothing End Sub Public Sub ClearVars() sbooInitState = False sstrCookiesName = "" sstrPageUrl = "" sstrPageVar = "page" sstrTableName = "" sstrFieldsList = "" sstrCondiction = "" sstrOrderList = "" sstrPrimaryKey = "" sintRefresh = 0 sintRecordCount = 0 sintPageSize = 0 sintPageNow = 0 sintPageMax = 0 End Sub Rem ## 保存记录数的 Cookies 变量 Public Property Let strCookiesName(Value) sstrCookiesName = Value End Property Rem ## 转向地址 Public Property Let strPageUrl(Value) sstrPageUrl = Value End Property Rem ## 表名 Public Property Let strTableName(Value) sstrTableName = Value End Property Rem ## 字段列表 Public Property Let strFieldsList(Value) sstrFieldsList = Value End Property Rem ## 查询条件 Public Property Let strCondiction(Value) If Value <> "" Then sstrCondiction = " WHERE " & Value Else sstrCondiction = "" End If End Property Rem ## 排序字段, 如: [ID] ASC, [CreateDateTime] DESC Public Property Let strOrderList(Value) If Value <> "" Then sstrOrderList = " ORDER BY " & Value Else sstrOrderList = "" End If End Property Rem ## 用于统计记录数的字段 Public Property Let strPrimaryKey(Value) sstrPrimaryKey = Value End Property Rem ## 每页显示的记录条数 Public Property Let intPageSize(Value) sintPageSize = toNum(Value, 20) End Property Rem ## 数据库连接对象 Public Property Let objConn(Value) Set sobjConn = Value End Property Rem ## 当前页 Public Property Let intPageNow(Value) sintPageNow = toNum(Value, 1) End Property Rem ## 页面参数 Public Property Let strPageVar(Value) sstrPageVar = Value End Property Rem ## 是否刷新. 1 为刷新, 其他值则不刷新 Public Property Let intRefresh(Value) sintRefresh = toNum(Value, 0) End Property Rem ## 获得当前页 Public Property Get intPageNow() intPageNow = singPageNow End Property Rem ## 分页信息 Public Property Get strPageInfo() strPageInfo = sstrPageInfo End Property Rem ## 取得记录集, 二维数组或字串, 在进行循环输出时必须用 IsArray() 判断 Public Property Get arrRecordInfo() If Not sbooInitState Then Exit Property End If Dim rs, sql sql = "SELECT " & sstrFieldsList & _ " FROM " & sstrTableName & _ sstrCondiction & _ sstrOrderList Set rs = Server.CreateObject("Adodb.RecordSet") rs.open sql, sobjConn, 1, 1 If Not(rs.eof or rs.bof) Then rs.PageSize = sintPageSize rs.AbsolutePage = sintPageNow If Not(rs.eof or rs.bof) Then arrRecordInfo = rs.getrows(sintPageSize) Else arrRecordInfo = "" End If Else arrRecordInfo = "" End If rs.close Set rs = nothing End Property Rem ## 初始化记录数 Private Sub InitRecordCount() sintRecordCount = 0 If Not(sbooInitState) Then Exit Sub Dim sintTmp sintTmp = toNum(request.Cookies("_xp_" & sstrCookiesName), -1) If ((sintTmp < 0) Or (sintRefresh = 1))Then Dim sql, rs sql = "SELECT COUNT(" & sstrPrimaryKey & ")" & _ " FROM " & sstrTableName & _ sstrCondiction Set rs = sobjConn.execute(sql) If rs.eof or rs.bof Then sintTmp = 0 Else sintTmp = rs(0) End If sintRecordCount = sintTmp response.Cookies("_xp_" & sstrCookiesName) = sintTmp Else sintRecordCount = sintTmp End If End Sub Rem ## 初始化分页信息 Private Sub InitPageInfo() sstrPageInfo = "" If Not(sbooInitState) Then Exit Sub Dim surl surl = sstrPageUrl If Instr(1, surl, "?", 1) > 0 Then surl = surl & "&" & sstrPageVar & "=" Else surl = surl & "?" & sstrPageVar & "=" End If If sintPageNow <= 0 Then sintPageNow = 1 If sintRecordCount mod sintPageSize = 0 Then sintPageMax = sintRecordCount \ sintPageSize Else sintPageMax = sintRecordCount \ sintPageSize + 1 End If If sintPageNow > sintPageMax Then sintPageNow = sintPageMax If sintPageNow <= 1 then sstrPageInfo = "首页 上一页" Else sstrPageInfo = sstrPageInfo & " <a href=""" & surl & "1"">首页</a>" sstrPageInfo = sstrPageInfo & " <a href=""" & surl & (sintPageNow - 1) & """>上一页</a>" End If If sintPageMax - sintPageNow < 1 then sstrPageInfo = sstrPageInfo & " 下一页 末页 " Else sstrPageInfo = sstrPageInfo & " <a href=""" & surl & (sintPageNow + 1) & """>下一页</a> " sstrPageInfo = sstrPageInfo & " <a href=""" & surl & sintPageMax & """>末页</a> " End If sstrPageInfo = sstrPageInfo & " 页次:<strong><font color=""#990000"">" & sintPageNow & "</font> / " & sintPageMax & " </strong>" sstrPageInfo = sstrPageInfo & " 共 <strong>" & sintRecordCount & "</strong> 条记录 <strong>" & sintPageSize & "</strong> 条/页 " End Sub Rem ## 长整数转换 Private function toNum(s, Default) s = s & "" If s <> "" And IsNumeric(s) Then toNum = CLng(s) Else toNum = Default End If End function Rem ## 类初始化 Public Sub InitClass() sbooInitState = True If Not(IsObject(sobjConn)) Then sbooInitState = False Call InitRecordCount() Call InitPageInfo() End Sub End Class Dim strLocalUrl strLocalUrl = request.ServerVariables("SCRIPT_NAME") Dim intPageNow intPageNow = request.QueryString("page") Dim intPageSize, strPageInfo intPageSize = 30 Dim arrRecordInfo, i Dim Conn f__OpenConn Dim clsRecordInfo Set clsRecordInfo = New Cls_PageView clsRecordInfo.strTableName = "[myTable]" clsRecordInfo.strPageUrl = strLocalUrl clsRecordInfo.strFieldsList = "[ID], [Title], [LastTime]" clsRecordInfo.strCondiction = "[ID] < 10000" clsRecordInfo.strOrderList = "[ID] ASC" clsRecordInfo.strPrimaryKey = "[ID]" clsRecordInfo.intPageSize = 20 clsRecordInfo.intPageNow = intPageNow clsRecordInfo.strCookiesName = "RecordCount" clsRecordInfo.strPageVar = "page" clsRecordInfo.intRefresh = 0 clsRecordInfo.objConn = Conn clsRecordInfo.InitClass arrRecordInfo = clsRecordInfo.arrRecordInfo strPageInfo = clsRecordInfo.strPageInfo Set clsRecordInfo = nothing f__CloseConn %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>分页测试</title> <style type="text/css"> <!-- .PageView { font-size: 12px; } .PageView td { border-right-style: solid; border-bottom-style: solid; border-right-color: #E0E0E0; border-bottom-color: #E0E0E0; border-right-width: 1px; border-bottom-width: 1px; } .PageView table { border-left-style: solid; border-top-style: solid; border-left-color: #E0E0E0; border-top-color: #E0E0E0; border-top-width: 1px; border-left-width: 1px; } tr.Header { background: #EFF7FF; font-size: 14px; font-weight: bold; line-height: 120%; text-align: center; } --> </style> <style type="text/css"> <!-- body { font-size: 12px; } a:link { color: #993300; text-decoration: none; } a:visited { color: #003366; text-decoration: none; } a:hover { color: #0066CC; text-decoration: underline; } a:active { color: #000000; text-decoration: none; } table { font-size: 12px; } --> </style> </head> <body> <table width="100%" border="0" cellspacing="0" cellpadding="4"> <tr> <td> <%= strPageInfo%></td> </tr> </table> <div class="PageView"> <table width="100%" border="0" cellspacing="0" cellpadding="4"> <tr class="Header"> <td>ID</td> <td>描述</td> <td>日期</td> </tr> <% If IsArray(arrRecordInfo) Then For i = 0 to UBound(arrRecordInfo, 2) %> <tr> <td> <%= arrRecordInfo(0, i)%></td> <td> <%= arrRecordInfo(1, i)%></td> <td> <%= arrRecordInfo(2, i)%></td> </tr> <% Next End If %> </table> </div> <table width="100%" border="0" cellspacing="0" cellpadding="4"> <tr> <td> <%= strPageInfo%></td> </tr> </table> <table width="100%" border="0" cellspacing="0" cellpadding="4"> <tr> <td align="center"> <%= getTimeOver(1)%></td> </tr> </table> </body> </html> |
|
不刷新页面的情况下调用ASP
|
RS技术的一个具体例子 在前面的帖子中,我介绍了RS的基本工作原理,显然如果将RS技术运用在一个网站的设计中将会有很多非凡的作用(尤其是它的那个最大的优点,可以在不刷新页面的情况下调用服务端的代码)。正是因为这个特点,你就可以象在编写一个传统的C/S模式的程序一样,对数据库的数据进行处理了(我想大家一定很想知道具体应该如何来实现了,下面将给出一个具体的例子,调试这个破程序几乎快把我给累死,呵呵。) 从前面的描述可以看到,要使用RS技术就需要客户端和服务端满足下面两个条件:
1。客户端只需要支持Java applet即可
2。而服务端只需要支持ASP即可 换句话说,就是RS技术是完全独立与浏览器的(当然浏览器至少需要满足支持Java和JavaScript),你可以在IE中使用,也可以完全在NC中使用,这也是区别与RDS技术的一个显著特点。 在能够灵活运用RS技术前,先要说明一个问题,就是前面也曾经提到过的“异步调用”的问题。也正是因为有异步调用,才能够实现你只刷新页面的某一部分而不用刷新整个页面。 由于它的这个特点,你可以让服务端来实现在你浏览页面的同时对你输入数据的合法性检查(当然这可以是一系列很复杂的合法性检查,例如需要将用户输入的数据和数据库内已有的数据进行对比等,这个可不是客户端的JS能够解决的),然后当服务端返回检查结果后,你再进行相应的操作(例如弹出一个对话框告诉用户输入出错等等).异步调用时的语法如下:
RSExecute(serverURL, functionname, param_list)
第一个参数是你想调用的asp页面的完整的URL路径
第二个参数是你想调用函数的名称
后面的就是该函数需要的输入参数了 如果你想调用的函数需要两个输入参数的话,就是这样的写法:
RSExecute(serverURL, functionname, f_arg_1, f_arg_2)
当进行调用时有两种写法,
一种是有返回结果的调用方式:
objResult = RSExecute(serverURL, functionname, f_arg_1, f_arg_2);
另外一种则是没有返回结果的调用方式:
RSExecute(url, func_name, f_arg_1, f_arg_2, CallbackFunction);
这种调用方式要特别的注意,其中的CallbackFunction是客户端的一个JS函数它表示一但RS执行完毕服务端上的调用,就会马上调用这个函数,并把结果返回到这个函数中去。
一个典型的CallbackFunction函数应该是这样的结构:
function CallbackFunction(objResult) { //你自己的处理过程 }
其中唯一的输入参数objResult就是RS调用的返回值.
下面我们假设这样一种情况:
用户在浏览器中输入了用户的e-mail地址,然后用户离开了e-mail地址输入框进入接下来的输入过程,这个时候就是RS该上场了,它根据用户输入的地址在服务端的数据库中查询这个地址,就可以判断出这个用户是否已经存在,然后把结果返回给客户端,在客户端再使用DHTML技术在一个叫"ShowResult"的输入框里面提示用户以前输入的信息。
function CallbackFunc(objResult) { // 提示用户的信息 window[objResult.context].value = objResult.return_value; } 而RSExecute()应该这么调用RSExecute(serverURL, functionname, f_arg_1, CallbackFunc,
"ShowResult");
不说了,不说了,上面罗嗦了这么多,我想大家也都看得头大了,下面还是让具体的代码来发言把:
(请在使用代码前在你的服务器上建立一个叫NW的系统DSN文件,该文件使用了Northworld即中文ACCESS97自带的示例数据库)
下面的例子是这么进行的,default.htm中分为两祯,在main.html页面中使用了RS技术,大家可以注意到在main.html中没有使用到submit所以如果你在该页面中直接敲回车键的话什么都不会出现,你必须通过鼠标单击那个"获取信息"按扭来使用这个局部页面刷新技术。在单击完该按扭后,页面会有一段小小的延迟(这段时间内java applet在后台建立了和服务端的连接)然后马上页面回复正常的鼠标,你可以在该页面中继续进行其他的操作。而不必象普通页面刷新时,你只有等待数据。而info.asp大家一眼就能够看明白,其实就是一个很简单的处理字符串的程序。
如果大家要是对DHTML技术熟悉的话,完全可以在客户端完成这些操作。至于EmpData.asp就是服务端处理数据的程序了。好了,其中的好处大家可以自己去体会。
特别注意,不要改变太多代码,不然很容易出错,毕竟是在使用JavaScript编程.
Default.htm文件代码如下: <HTML> <HEAD> <TITLE>RS技术的实现例子</TITLE> </HEAD> <FRAMESET id=fset rows="70%,30%"> <FRAME name=main src="main.html"> <FRAME name=info src="info.asp"> </FRAMESET> </HTML>
Maim.html文件代码如下 <HTML> <HEAD> <TITLE>RS技术的实现例子</TITLE> </HEAD> <BODY> <script language="JavaScript" src="http://YourServer/_ScriptLibrary/rs.htm"></script> <script language="JavaScript"> RSEnableRemoteScripting("http://YourServer/_ScriptLibrary"); </script> <h1>雇员信息</h1> <hr> <form name=MyForm> 请输入你想查询的名字: <br><input type=text name="empLastName" size=40> <input type=button name=btnExecute style="width=150" value="获取信息" onclick="execAsynch(empLastName.value)"> </form> <hr>
<SCRIPT LANGUAGE="javascript"> var serverURL = "http://yourserver/"; var pageURL = "/batman/EmpData.asp"; function refreshPage(co) { if (co.status != 0) { alert("发生异常错误\n" + message); } strText = co.return_value; top.info.location = "info.asp?info=" + escape(strText); } function execAsynch(empLastName) { RSExecute(serverURL+pageURL, "GetEmpInfoAsArray", empLastName, refreshPage); } </SCRIPT> </BODY> </HTML>
info.asp文件代码 <HTML> <BODY> <% Response.Write Request.ServerVariables("REMOTE_USER") strText = Request.QueryString("info") If strText = "" Then Response.End arrData = split(strText, "|") arrLabels = split("职工,头衔,城市,雇佣日期", ",") %> <table border=0> <% for i=0 to 3 Response.Write "<tr>" Response.Write "<td><b>" & arrLabels(i) & "</b></td>" Response.Write "<td><i>" & arrData(i) & "</i></td>" next %> </table> </BODY> </HTML>
EmpData.asp文件 <%@ LANGUAGE=VBSCRIPT %> <% RSDispatch %>
<SCRIPT RUNAT=SERVER Language=javascript> <!--#INCLUDE VIRTUAL="/_ScriptLibrary/RS.ASP"-->
function Description() { this.GetEmpInfoAsArray = DoGetData; } public_description = new Description();
function DoGetData(empName) { sql = "select * from 雇员 where [名字]="" + empName + """; rst = new ActiveXObject("ADODB.Recordset"); rst.CursorLocation = 3; rst.Open(sql, "NW"); i = 0; strText = ""; if (rst.RecordCount == 1) { strText += rst.Fields("雇员ID").Value + " - " + rst.Fields("尊称").Value + " " + rst.Fields("姓氏").Value + " " + rst.Fields("名字").Value; strText += "|"; strText += rst.Fields("头衔").Value; strText += "|"; strText += rst.Fields("城市").Value + " " + rst.Fields("地区").Value + ", " + rst.Fields("国家").Value; strText += "|"; d = new Date(rst.Fields("雇用日期").Value); strText += (1+d.getMonth()) + "/" + d.getDate() + "/" +d.getYear(); } return strText; } </SCRIPT> |
|
无组件生成BMP验证码
|
作者:Layen 来源:动网论坛
<% Call Com_CreatValidCode("ValidCode") Sub Com_CreatValidCode(pSN)
' 禁止缓存 Response.Expires = -9999 Response.AddHeader "Pragma","no-cache" Response.AddHeader "cache-ctrol","no-cache" Response.ContentType = "Image/BMP"
Randomize
Dim i, ii, iii
Const cOdds = 2 ' 杂点出现的机率 Const cAmount = 36 ' 文字数量 Const cCode = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
' 颜色的数据(字符,背景) Dim vColorData(1) vColorData(0) = ChrB(0) & ChrB(0) & ChrB(0) ' 蓝0,绿0,红0(黑色) vColorData(1) = ChrB(250) & ChrB(236) & ChrB(211) ' 蓝250,绿236,红211(浅蓝色)
' 随机产生字符 Dim vCode(4), vCodes For i = 0 To 3 vCode(i) = Int(Rnd * cAmount) vCodes = vCodes & Mid(cCode, vCode(i) + 1, 1) Next
Session(pSN) = vCodes '记录入Session
' 字符的数据 Dim vNumberData(35) vNumberData(0) = "1110000111110111101111011110111101001011110100101111010010111101001011110111101111011110111110000111" vNumberData(1) = "1111011111110001111111110111111111011111111101111111110111111111011111111101111111110111111100000111" vNumberData(2) = "1110000111110111101111011110111111111011111111011111111011111111011111111011111111011110111100000011" vNumberData(3) = "1110000111110111101111011110111111110111111100111111111101111111111011110111101111011110111110000111" vNumberData(4) = "1111101111111110111111110011111110101111110110111111011011111100000011111110111111111011111111000011" vNumberData(5) = "1100000011110111111111011111111101000111110011101111111110111111111011110111101111011110111110000111" vNumberData(6) = "1111000111111011101111011111111101111111110100011111001110111101111011110111101111011110111110000111" vNumberData(7) = "1100000011110111011111011101111111101111111110111111110111111111011111111101111111110111111111011111" vNumberData(8) = "1110000111110111101111011110111101111011111000011111101101111101111011110111101111011110111110000111" vNumberData(9) = "1110001111110111011111011110111101111011110111001111100010111111111011111111101111011101111110001111" vNumberData(10) = "1111011111111101111111101011111110101111111010111111101011111100000111110111011111011101111000100011" vNumberData(11) = "1000000111110111101111011110111101110111110000111111011101111101111011110111101111011110111000000111" vNumberData(12) = "1110000011110111101110111110111011111111101111111110111111111011111111101111101111011101111110001111" vNumberData(13) = "1000001111110111011111011110111101111011110111101111011110111101111011110111101111011101111000001111" vNumberData(14) = "1000000111110111101111011011111101101111110000111111011011111101101111110111111111011110111000000111" vNumberData(15) = "1000000111110111101111011011111101101111110000111111011011111101101111110111111111011111111000111111" vNumberData(16) = "1110000111110111011110111101111011111111101111111110111111111011100011101111011111011101111110001111" vNumberData(17) = "1000100011110111011111011101111101110111110000011111011101111101110111110111011111011101111000100011" vNumberData(18) = "1100000111111101111111110111111111011111111101111111110111111111011111111101111111110111111100000111" vNumberData(19) = "1110000011111110111111111011111111101111111110111111111011111111101111111110111110111011111000011111" vNumberData(20) = "1000100011110111011111011011111101011111110001111111010111111101101111110110111111011101111000100011" vNumberData(21) = "1000111111110111111111011111111101111111110111111111011111111101111111110111111111011110111000000011" vNumberData(22) = "1000100011110010011111001001111100100111110101011111010101111101010111110101011111010101111001010011" vNumberData(23) = "1000100011110011011111001101111101010111110101011111010101111101100111110110011111011001111000110111" vNumberData(24) = "1110001111110111011110111110111011111011101111101110111110111011111011101111101111011101111110001111" vNumberData(25) = "1000000111110111101111011110111101111011110000011111011111111101111111110111111111011111111000111111" vNumberData(26) = "1110001111110111011110111110111011111011101111101110111110111011111011101001101111011001111110001011" vNumberData(27) = "1000001111110111011111011101111101110111110000111111010111111101101111110110111111011101111000110011" vNumberData(28) = "1110000011110111101111011110111101111111111001111111111001111111111011110111101111011110111100000111" vNumberData(29) = "1000000011101101101111110111111111011111111101111111110111111111011111111101111111110111111110001111" vNumberData(30) = "1000100011110111011111011101111101110111110111011111011101111101110111110111011111011101111110001111" vNumberData(31) = "1000100011110111011111011101111101110111111010111111101011111110101111111010111111110111111111011111" vNumberData(32) = "1001010011110101011111010101111101010111110101011111001001111110101111111010111111101011111110101111" vNumberData(33) = "1000100011110111011111101011111110101111111101111111110111111110101111111010111111011101111000100011" vNumberData(34) = "1000100011110111011111011101111110101111111010111111110111111111011111111101111111110111111110001111" vNumberData(35) = "1100000011110111011111111101111111101111111110111111110111111111011111111011111111101110111100000011"
' 输出图像文件头 Response.BinaryWrite ChrB(66) & ChrB(77) & ChrB(230) & ChrB(4) & ChrB(0) & ChrB(0) & ChrB(0) & ChrB(0) &_ ChrB(0) & ChrB(0) & ChrB(54) & ChrB(0) & ChrB(0) & ChrB(0) & ChrB(40) & ChrB(0) &_ ChrB(0) & ChrB(0) & ChrB(40) & ChrB(0) & ChrB(0) & ChrB(0) & ChrB(10) & ChrB(0) &_ ChrB(0) & ChrB(0) & ChrB(1) & ChrB(0)
' 输出图像信息头 Response.BinaryWrite ChrB(24) & ChrB(0) & ChrB(0) & ChrB(0) & ChrB(0) & ChrB(0) & ChrB(176) & ChrB(4) &_ ChrB(0) & ChrB(0) & ChrB(18) & ChrB(11) & ChrB(0) & ChrB(0) & ChrB(18) & ChrB(11) &_ ChrB(0) & ChrB(0) & ChrB(0) & ChrB(0) & ChrB(0) & ChrB(0) & ChrB(0) & ChrB(0) &_ ChrB(0) & ChrB(0)
For i = 9 To 0 Step -1 ' 历经所有行 For ii = 0 To 3 ' 历经所有字 For iii = 1 To 10 ' 历经所有像素 ' 逐行、逐字、逐像素地输出图像数据 If Rnd * 99 + 1 < cOdds Then ' 随机生成杂点 Response.BinaryWrite vColorData(0) Else Response.BinaryWrite vColorData(Mid(vNumberData(vCode(ii)), i * 10 + iii, 1)) End If Next Next Next End Sub %>
|
|
ASP操作XML数据小结
|
NO.1--建立一个XML数据库data.xml <?xml version="1.0"?> <records> <record> <name>caca</name> <qq>154222225</qq> <email>root@3ney.com</email> </record> <records> NO.2--建立对象CreateObject 建立data.xml的对象先 set xmldoc=server.createobjcet("microsoft.xmldom") xmldoc.load(server.mappath("data.xml")
NO.3--选定节点SelectNode 你想操作哪个Node,必须定位到这个节点是不是,先看看这个data.xml有几个Node?? 用一个递归函数搞定: getnodes(xmldoc)
sub getnodes(node) dim i response.write("<br><b>NodeName:</b>"&node.nodename&"<br><b>NodeTypeString:</b>"&node.nodetypestring&"<br><b>NodeValue:</b>"&node.nodevalue&"<br><b>Text:</b>"&node.text&"<br><b>node.childnodes.length:</b>"&node.childnodes.length&"<p>")
if node.childnodes.length<>0 then for i=0 to node.childnodes.length-1 getnodes(node.childnodes(i)) next end if end sub 用这个函数后,可以看到这个data.xml有10个Node 这些Node可以很简单的定位: xmldoc xmldoc.childnodes(0) xmldoc.childnodes(1) xmldoc.childnodes(1).childnodes(0) xmldoc.childnodes(1).childnodes(0).childnodes(0) xmldoc.childnodes(1).childnodes(0).childnodes(0).text xmldoc.childnodes(1).childnodes(0).childnodes(1) xmldoc.childnodes(1).childnodes(0).childnodes(1).text xmldoc.childnodes(1).childnodes(0).childnodes(2) xmldoc.childnodes(1).childnodes(0).childnodes(2).text 是不是定位很简单呀,还有个方法,比如定位<name> xmldoc.selectsinglenode("//name") 还有: xmldoc.getelementsbytagname("name").item(0) NO.4--给节点赋值(修改节点的值) 学会了定位节点,利用其属性,就可以修改或者赋值了 例如,把<name>的值caca改为wawa xmldoc.selectsinglenode("//name").text="wawa" xmldoc.save(server.mappath("data.xml")) 搞定! NO.5--创建新的节点CreatenewNode 用createelement或者createnode("","","") 例如:在record下新建个<age>,只需要一句就搞定: xmldoc.selectsinglenode("//record").appendchild(xmldoc.createelement("<age>")) 给<age>赋值 xmldoc.selectsinglenode("//age").text="20" xmldoc.save(server.mappath("data.xml")) 搞定! NO.6--删除一个节点DeleteNode 你必须明确你想删除的这个节点的父节点,以及这个节点的特征 例如:删除<qq>节点 xmldoc.selectsinglenode("//record").removechild(xmldoc.selectsinglenode("//qq")) 例如:删除那个<name>=caca的<record> xmldoc.selectsinglenode("//records").removechild(xmldoc.selectsinglenode("//record[name='caca'])) xmldoc.save(server.mappath("data.xml")) 搞定! 只有能熟练这6条code,用asp控制xml数据库,也就差不多了...
|
|
Global.asa编程完全参考手册
|
Global.asa 文件是一隹裳∥募没Э梢栽诟梦募兄付ㄊ录疟荆⑸骶哂谢峄昂陀τ贸绦蜃饔糜虻亩韵蟆8梦募哪谌?nbsp; 给用户显示的,而是用来存储事件信息和由应用程序全局使用的对象。该文件的名称必须是 Global.asa 且必须存放在应用程序的 根目录中。每个应用程序只能有一个 Global.asa 文件。
Global.asa 文件只能包含如下内容:
1.应用程序事件
2.会话事件
3.<OBJECT> 声明
TypeLibrary 声明 如果包含的脚本没有用 <SCRIPT> 标记封装,或定义的对象没有会话或应用程序作用域,则服务器将返回错误。服务器会忽略已标 记的但未被应用程序或会话事件使用的脚本以及文件中的 HTML 语句。
可以用任何支持脚本的语言编写 Global.asa 文件中包含的脚本。如果多个事件使用同一种脚本语言,就可以将它们组织在一组 <SCRIPT> 标记中。
当用户保存对 Global.asa 文件所做的更改时,在重新编译 Global.asa 文件之前,服务器会结束处理当前应用程序的所有请 求。在此期间,服务器拒绝其他请求并返回一个错误消息,说明正在重启动应用程序,不能处理请求。
当用户当前的所有请求处理完之后,服务器对每个会话调用 Session_OnEnd 事件,删除所有活动会话,并调用 Application_OnEnd 事件关闭应用程序,然后编译 Global.asa 文件。接下来,用户的请求将启动应用程序并创建新的会话,触 发 Application_OnStart 和 Session_OnStart 事件。
但是,保存 Global.asa 文件中所包含的文件的更改并不能使服务器重新编译 Global.asa。为了让服务器识别包含文件的改动, 必须再保存一下 Global.asa 文件。
在 Global.asa 文件中声明的过程只能从一个或多个与 Application_OnStart、Application_OnEnd、Session_OnStart 和 Session_OnEnd 事件相关的脚本中调用。在基于 ASP 的应用程序中的 ASP 页中,它们是不可用的。
要在应用程序之间共享过程,可在单独的文件中声明这些过程,然后使用服务器端的包含 (SSI) 语句将该文件包含在调用该过程 的 ASP 页中。通常,包含文件的扩展名应为 .inc。
基于 ASP 的应用程序由在其根目录及其子目录中所有文件组成。应用程序在用户首次打开应用程序中的某一 Web 页时启动,在服 务器关闭时终止。应用程序有两个事件,即 Application_OnStart 事件和 Application_OnEnd 事件。
用户可以在 Global.asa 文件中为这些事件指定脚本。当应用程序启动时,服务器在 Global.asa 文件中查找并处理 Application_OnStart 事件脚本。当应用程序终止时,服务器处理 Application_OnEnd 事件脚本。
1.Application_OnStart Application_OnStart 事件在首次创建新的会话(即 Session_OnStart 事件)之前发生。只有 Application 和 Server 内建 对象是可用的。在 Application_OnStart 事件脚本中引用 Session、Request 或 Response 对象将导致错误。
语法 <SCRIPT LANGUAGE=ScriptLanguage RUNAT=Server> Sub Application_OnStart. . . End Sub
</SCRIPT>
参数 ScriptLanguage 指定用于编写事件脚本的脚本语言。它可以是任何支持脚本编写的语言,例如 VB Script 或 JScript。如果多个事件使用同一种 脚本语言,就可以将它们组织在一个 <SCRIPT> 标记下。
2.Application_OnEnd Application_OnEnd 事件在应用程序退出时于 Session_OnEnd 事件之后发生,只有 Application 和 Server 内建对象可用。
语法 <SCRIPT LANGUAGE=ScriptLanguage RUNAT=Server> Sub Application_OnEnd. . . End Sub
</SCRIPT>
参数 ScriptLanguage 指定用于编写事件脚本的脚本编写语言。可以是任何一种支持脚本的语言,例如 VBScript 或 JScript。如果有多个事件使用同 一种脚本编写语言,就可以将它们组织在一组 <SCRIPT> 标记下。 注释 不能在 Application_OnEnd 脚本中调用 MapPath 方法。
当没有会话的用户在打开应用程序中的 Web 页时,Web 服务器会自动创建会话。当超时或服务器调用 Abandon 方法时,服务器 将终止该会话。
会话有两个事件,即 Session_OnStart 事件和 Session_OnEnd 事件。
可以在全局文件 Global.asa 中为这两个事件指定脚本。当会话开始时,服务器在 Global.asa 文件中查找并处理 Session_OnStart 事件脚本。该脚本将在处理用户请求的 Web 页之前处理。在会话结束时,服务器将处理 Session_OnEnd 事件 脚本。
1.Session_OnStart Session_OnStart 事件在服务器创建新会话时发生。服务器在执行请求的页之前先处理该脚本。Session_OnStart 事件是设置会 话期变量的最佳时机,因为在访问任何页之前都会先设置它们。所有内建对象 (Application、ObjectContext、Request、 Response、Server 和 Session) 都可以在 Session_OnStart 事件脚本中使用和引用。
语法 <SCRIPT LANGUAGE=ScriptLanguage RUNAT=Server> Sub Session_OnStart. . .End Sub
</SCRIPT>
参数 ScriptLanguage 指定用于编写事件脚本的脚本编写语言。可以是任何一种支持脚本的语言,例如 VBScript 或 JScript。如果有多个事件使用同 一种脚本编写语言,就可以将它们组织在一组 <SCRIPT> 标记下。 示例 尽管在 Session_OnStart 事件包含 Redirect 或 End 方法调用的情况下 Session 对象仍会保持,然而服务器将停止处理 Global.asa 文件并触发 Session_OnStart 事件的文件中的脚本。
举一个例子,为了确保用户在打开某个特定的 Web 页时始终启动一个会话,就可以在 Session_OnStart 事件中调用 Redirect 方法。当用户进入应用程序时,服务器将为用户创建一个会话并处理 Session_OnStart 事件脚本。您可以将脚本包含在该事件中 以便检查用户打开的页是不是启动页,如果不是,就指示用户调用 Response.Redirect 方法启动网页。其演示如下例所示。
<SCRIPT RUNAT=Server Language=VBScript> Sub Session_OnStart ' Make sure that new users start on the correct ' page of the ASP application.
' Replace the value given to startPage below ' with the virtual path to your application's ' start page.
startPage = "/MyApp/StartHere.asp" currentPage = Request.ServerVariables("SCRIPT_NAME")
' Do a case-insensitive compare, and if they ' don't match, send the user to the start page. if strcomp(currentPage,startPage,1) then Response.Redirect(startPage) end ifEnd Sub</SCRIPT> 上述示例只能在支持 cookie 的浏览器中运行。因为不支持 cookie 的浏览器不能返回 SessionID cookie,所以,每当用户请 求 Web 页时,服务器都会创建一个新会话。这样,对于每个请求,服务器都将处理 Session_OnStart 脚本并将用户重定向到启 动页中。如果您要使用下面的脚本,建议您在启动页上放一个通知,告诉用户该站点要求支持 cookie 的浏览器。
注释 请注意,在 Redirect 方法之后的任何 Session_OnStart 事件脚本都不会执行。因此,应该在您的事件脚本的最后再调用 Redirect 方法。其演示如下例所示。
<SCRIPT LANGUAGE=VBScript RUNAT=Server> Sub Session_OnStart ' Session initialization script Response.Redirect "http:/server/app/StartHere.asp" End sub </SCRIPT> 在上面的例子中,Redirect 方法在执行会话初始化脚本期间隐藏所有显示给客户的文字。
2.Session_OnEnd Session_OnEnd 事件在会话被放弃或超时发生。在服务器内建对象中,只有 Application、Server 和 Session 对象可用。
语法 <SCRIPT LANGUAGE=ScriptLanguage RUNAT=Server> Sub Session_OnEnd. . . End Sub
</SCRIPT>
参数 ScriptLanguage 指定用于编写事件脚本的脚本编写语言。可以是任一支持脚本编写的语言,例如 VBScript 或 JScript。如果有多个事件使用同 一种脚本编写语言,则可以将其组织在一组 <SCRIPT> 标记下。 注释 在 Session_OnEnd 脚本中不能调用 MapPath 方法。
<OBJECT> 声明 用户可以在 global.asa 文件中通过使用扩展的 <OBJECT> 标记创建带有会话或应用程序作用域的对象。该标记是自包含的,且 在任何 <SCRIPT> 标记之外。
在 Global.asa 文件中声明的对象在服务器处理调用该对象之前是不会创建的。这样就只会创建必需的对象,从而节约了资源。
服务器对带有应用程序作用域参数创建的对象不调用 OnStartPage 和 OnEndPage 方法。
语法 <OBJECT RUNAT=Server SCOPE=Scope ID=Identifier {PROGID="progID"¦CLASSID="ClassID"}>. . .
</OBJECT>
参数 Scope 指定对象的作用域。在 Global.asa 文件中,Scope 将被设置为 Session 或 Application。
Identifier 指定对象实例的名称。
ProgID 与类标识相关的标识。无论 ProgID 还是 ClassID 都必须在 <OBJECT> 中指定。ProgID 的格式为 [Vendor.]Component [.Version]。
ClassID 指定 COM 类对象的唯一标识。 无论 ProgID 还是 ClassID 都必须在 <OBJECT> 中指定。 示例 下面的第一个示例使用 ProgID 参数创建一个对象,其会话作用域名为 MyConnection。第二个示例使用 ClassID 参数。
<OBJECT RUNAT=Server SCOPE=Session ID=MyConnection PROGID="ADODB.Connection"> REM Object Script </OBJECT>
<OBJECT RUNAT=Server SCOPE=Session ID=MyConnection CLASSID="Clsid:8AD3067A-B3FC-11CF-A560-00A0C9081C21"> REM Object Script </OBJECT>
注释 在 Global.asa 文件中声明的对象可被应用程序中的任何脚本使用。例如,在声明了下列对象的情况下。
---GLOBAL.ASA--- <OBJECT RUNAT=Server SCOPE=Session ID=MyAd PROGID="MSWC.AdRotator"> </OBJECT>
可以从应用程序中的任何一页引用 MyAd 对象:
---SOME.ASP--- <%= MyAd.GetAdvertisement("/ads/adrot.txt") %>
TypeLibrary 声明
ActiveX 组件常常要描述类型库中该组件支持的常量。类型库是一个文件,其中包含有关 ActiveX 组件所支持的对象和类型的信 息。如果用户的 Web 应用程序依赖于已在类型库中声明了类型的 ActiveX 对象,就可以在 Global.asa 文件中声明其类型。这 样做以后,就可以在应用程序范围内从任何脚本引用已在类型库中声明了的数据类型。
有关在 ASP 中使用常量的详细信息,请参阅“使用变量和常量”。
语法 <!--METADATA TYPE="TypeLib" FILE="file" UUID="typelibraryuuid" VERSION="majorversionnumber.minorversionnumber" LCID="localeid" --> 参数 file 类型库的绝对路径。如果提供了该参数和 typelibraryuuid 参数,则 file 将用于标识类型库。file 参数和 typelibraryuuid 参数都是必选项。
typelibraryuuid 类型库统一的唯一标识。file 参数和 typelibraryuuid 参数都是必选项。
majorversionnumber 用于选择版本。如果找不到所需的版本,将返回错误。该参数是可选项。
minorversionnumber 用于选择版本。如果找不到所需的版本,将返回错误。该参数是可选项。
localeid 现场标识,用于类型库。如果找不到所需的现场,将返回错误。该参数是可选项。 错误信息 服务器可返回下列错误消息。
错误 说明 ASP 0222 指定的类型库无效。METADATA 标记包含无效的类型库指定。 ASP 0223 找不到类型库。METADATA 包含的类型库指定与注册表项不符。 ASP 0224 类型库无法加载。ASP 无法加载 METADATA 标记中指定的类型库。 ASP 0225 类型库不能重叠。ASP 无法从在 METADATA 标记中指定的类型库中创建 Type Library Wrapper 对象。
注释 最好将 METADATA 标记写在 Global.asa 文件的开始位置。但是,无论是内部和外部 SCRIPT 标记,都可以出现在 Global.asa 文件中的任何位置。
通过将类型库的名称加在该常量的前面,可以避免对常量的不明确引用。例如,ADODB.adErrItemNotFound 会比 adErrItemNotFound 更明确。
如果使用 Microsoft Visual InterDev 创建 global.asa 文件,则 METADATA 标记将包含可选的 STARTSPAN 和 ENDSPAN 关 键字。而 IIS 则会忽略这两个关键字。
示例 下面示例中的 MyComponent 是用 Visual Basic 5.0 编写的。MyComponent 使用下列语句定义常量 MyError。
Public Const MyError = "You are not using MyComponent correctly."
类型库包含在 mycomponent.lib 中,该文件安装在下面的目录中。
C:\MyComponent
下面的 METADATA 标记包含在 MyApp 应用程序的 global.asa 文件中。该示例使用可选的 STARTSPAN 和 ENDSPAN 标记。而 IIS 则不需要这两个标记。
<!--METADATA TYPE="TypeLib" FILE="MyComponent.lib" -->
现在,MyApp 应用程序中的任何 ASP 都包含如下脚本:
<% Dim MyVar Set MyVar = Server.CreateObject("MyComponent.MyClass") Currentreturn = MyVar.MyMethod If Currentreturn = False Response.Write(MyError) End If %> |
|
ASP中取得图片宽度和高度的类(无组件)
|
<% Class ImgWHInfo '获取图片宽度和高度的类,支持JPG,GIF,PNG,BMP Dim ASO Private Sub Class_Initialize Set ASO=Server.CreateObject("ADODB.Stream") ASO.Mode=3 ASO.Type=1 ASO.Open End Sub Private Sub Class_Terminate Err.Clear Set ASO=Nothing End Sub Private Function Bin2Str(Bin) Dim I, Str For I=1 To LenB(Bin) clow=MidB(Bin,I,1) If ASCB(clow)<128 Then Str = Str & Chr(ASCB(clow)) Else I=I+1 If I <= LenB(Bin) Then Str = Str & Chr(ASCW(MidB(Bin,I,1)&clow)) End If Next Bin2Str = Str End Function Private Function Num2Str(Num,Base,Lens) Dim Ret Ret = "" While(Num>=Base) Ret = (Num Mod Base) & Ret Num = (Num - Num Mod Base)/Base Wend Num2Str = Right(String(Lens,"0") & Num & Ret,Lens) End Function Private Function Str2Num(Str,Base) Dim Ret,I Ret = 0 For I=1 To Len(Str) Ret = Ret *base + Cint(Mid(Str,I,1)) Next Str2Num=Ret End Function Private Function BinVal(Bin) Dim Ret,I Ret = 0 For I = LenB(Bin) To 1 Step -1 Ret = Ret *256 + AscB(MidB(Bin,I,1)) Next BinVal=Ret End Function Private Function BinVal2(Bin) Dim Ret,I Ret = 0 For I = 1 To LenB(Bin) Ret = Ret *256 + AscB(MidB(Bin,I,1)) Next BinVal2=Ret End Function Private Function GetImageSize(filespec) Dim bFlag Dim Ret(3) ASO.LoadFromFile(filespec) bFlag=ASO.Read(3) Select Case Hex(binVal(bFlag)) Case "4E5089": ASO.Read(15) ret(0)="PNG" ret(1)=BinVal2(ASO.Read(2)) ASO.Read(2) ret(2)=BinVal2(ASO.Read(2)) Case "464947": ASO.read(3) ret(0)="gif" ret(1)=BinVal(ASO.Read(2)) ret(2)=BinVal(ASO.Read(2)) Case "535746": ASO.read(5) binData=ASO.Read(1) sConv=Num2Str(ascb(binData),2 ,8) nBits=Str2Num(left(sConv,5),2) sConv=mid(sConv,6) While(len(sConv)<nBits*4) binData=ASO.Read(1) sConv=sConv&Num2Str(AscB(binData),2 ,8) Wend ret(0)="SWF" ret(1)=Int(Abs(Str2Num(Mid(sConv,1*nBits+1,nBits),2)-Str2Num(Mid(sConv,0*nBits+1,nBits),2))/20) ret(2)=Int(Abs(Str2Num(Mid(sConv,3*nBits+1,nBits),2)-Str2Num(Mid(sConv,2*nBits+1,nBits),2))/20) Case "FFD8FF": Do Do: p1=binVal(ASO.Read(1)): Loop While p1=255 And Not ASO.EOS If p1>191 And p1<196 Then Exit Do Else ASO.read(binval2(ASO.Read(2))-2) Do:p1=binVal(ASO.Read(1)):Loop While p1<255 And Not ASO.EOS Loop While True ASO.Read(3) ret(0)="JPG" ret(2)=binval2(ASO.Read(2)) ret(1)=binval2(ASO.Read(2)) Case Else: If left(Bin2Str(bFlag),2)="BM" Then ASO.Read(15) ret(0)="BMP" ret(1)=binval(ASO.Read(4)) ret(2)=binval(ASO.Read(4)) Else ret(0)="" End If End Select ret(3)="width=""" & ret(1) &""" height=""" & ret(2) &"""" getimagesize=ret End Function Public Function imgW(IMGPath) Dim FSO,IMGFile,FileExt,Arr Set FSO = Server.CreateObject("Scripting.FileSystemObject") If (FSO.FileExists(IMGPath)) Then Set IMGFile = FSO.GetFile(IMGPath) FileExt=FSO.GetExtensionName(IMGPath) Select Case FileExt Case "gif","bmp","jpg","png": Arr=GetImageSize(IMGFile.Path) imgW = Arr(1) End Select Set IMGFile=Nothing Else imgW = 0 End If Set FSO=Nothing End Function Public Function imgH(IMGPath) Dim FSO,IMGFile,FileExt,Arr Set FSO = server.CreateObject("Scripting.FileSystemObject") If (FSO.FileExists(IMGPath)) Then Set IMGFile = FSO.GetFile(IMGPath) FileExt=FSO.GetExtensionName(IMGPath) Select Case FileExt Case "gif","bmp","jpg","png": Arr=getImageSize(IMGFile.Path) imgH = Arr(2) End Select Set IMGFile=Nothing Else imgH = 0 End If Set FSO=Nothing End Function End Class
IMGPath="Test.jpg"
Set PP = New ImgWHInfo W = PP.imgW(Server.Mappath(IMGPath)) H = PP.imgH(Server.Mappath(IMGPath)) Set pp = Nothing Response.Write("<img src='"&IMGPath&"' border=0><br>宽:"&W&";高:"&H) %>
|
|
ASP操作Excel技术总结
|
目录 一、 环境配置 二、 ASP对Excel的基本操作 三、 ASP操作Excel生成数据表 四、 ASP操作Excel生成Chart图 五、 服务器端Excel文件浏览、下载、删除方案 六、 附录
正文 一、 环境配置 服务器端的环境配置从参考资料上看,微软系列的配置应该都行,即: 1.Win9x+PWS+Office 2.Win2000 Professional+PWS+Office 3.Win2000 Server+IIS+Office 目前笔者测试成功的环境是后二者。Office的版本没有特殊要求,考虑到客户机配置的不确定性和下兼容特性,建议服务器端Office版本不要太高,以防止客户机下载后无法正确显示。 服务器端环境配置还有两个偶然的发现是: 1. 笔者开发机器上原来装有金山的WPS2002,结果Excel对象创建始终出现问题,卸载WPS2002后,错误消失。 2. 笔者开发ASP代码喜欢用FrontPage,结果发现如果FrontPage打开(服务器端),对象创建出现不稳定现象,时而成功时而不成功。扩展考察后发现,Office系列的软件如果在服务器端运行,则Excel对象的创建很难成功。 服务器端还必须要设置的一点是COM组件的操作权限。在命令行键入“DCOMCNFG”,则进入COM组件配置界面,选择Microsoft Excel后点击属性按钮,将三个单选项一律选择自定义,编辑中将Everyone加入所有权限。保存完毕后重新启动服务器。 客户端的环境配置没发现什么特别讲究的地方,只要装有Office和IE即可,版本通用的好象都可以。
二、 ASP对Excel的基本操作 1、 建立Excel对象 set objExcelApp = CreateObject("Excel.Application") objExcelApp.DisplayAlerts = false 不显示警告 objExcelApp.Application.Visible = false 不显示界面 2、 新建Excel文件 objExcelApp.WorkBooks.add set objExcelBook = objExcelApp.ActiveWorkBook set objExcelSheets = objExcelBook.Worksheets set objExcelSheet = objExcelBook.Sheets(1) 3、 读取已有Excel文件 strAddr = Server.MapPath(".") objExcelApp.WorkBooks.Open(strAddr & "\Templet\Table.xls") set objExcelBook = objExcelApp.ActiveWorkBook set objExcelSheets = objExcelBook.Worksheets set objExcelSheet = objExcelBook.Sheets(1) 4、 另存Excel文件 objExcelBook.SaveAs strAddr & "\Temp\Table.xls" 5、 保存Excel文件 objExcelBook.Save (笔者测试时保存成功,页面报错。) 6、 退出Excel操作 objExcelApp.Quit 一定要退出 set objExcelApp = Nothing
三、 ASP操作Excel生成数据表 1、 在一个范围内插入数据 objExcelSheet.Range("B3:k3").Value = Array("67", "87", "5", "9", "7", "45", "45", "54", "54", "10") 2、 在一个单元格内插入数据 objExcelSheet.Cells(3,1).Value="Internet Explorer" 3、 选中一个范围 4、 单元格左边画粗线条 5、 单元格右边画粗线条 6、 单元格上边画粗线条 7、 单元格下边画粗线条 8、 单元格设定背景色 9、 合并单元格 10、 插入行 11、 插入列
四、 ASP操作Excel生成Chart图 1、 创建Chart图 objExcelApp.Charts.Add 2、 设定Chart图种类 objExcelApp.ActiveChart.ChartType = 97 注:二维折线图,4;二维饼图,5;二维柱形图,51 3、 设定Chart图标题 objExcelApp.ActiveChart.HasTitle = True objExcelApp.ActiveChart.ChartTitle.Text = "A test Chart" 4、 通过表格数据设定图形 objExcelApp.ActiveChart.SetSourceData objExcelSheet.Range("A1:k5"),1 5、 直接设定图形数据(推荐) objExcelApp.ActiveChart.SeriesCollection.NewSeries objExcelApp.ActiveChart.SeriesCollection(1).Name = "=""333""" objExcelApp.ActiveChart.SeriesCollection(1).Values = "=" 6、 绑定Chart图 objExcelApp.ActiveChart.Location 1 7、 显示数据表 objExcelApp.ActiveChart.HasDataTable = True 8、 显示图例 objExcelApp.ActiveChart.DataTable.ShowLegendKey = True
五、 服务器端Excel文件浏览、下载、删除方案 浏览的解决方法很多,“Location.href=”,“Navigate”,“Response.Redirect”都可以实现,建议用客户端的方法,原因是给服务器更多的时间生成Excel文件。 下载的实现要麻烦一些。用网上现成的服务器端下载组件或自己定制开发一个组件是比较好的方案。另外一种方法是在客户端操作Excel组件,由客户端操作服务器端Excel文件另存至客户端。这种方法要求客户端开放不安全ActiveX控件的操作权限,考虑到通知每个客户将服务器设置为可信站点的麻烦程度建议还是用第一个方法比较省事。 删除方案由三部分组成: A: 同一用户生成的Excel文件用同一个文件名,文件名可用用户ID号或SessionID号等可确信不重复字符串组成。这样新文件生成时自动覆盖上一文件。 B: 在Global.asa文件中设置Session_onEnd事件激发时,删除这个用户的Excel暂存文件。 C: 在Global.asa文件中设置Application_onStart事件激发时,删除暂存目录下的所有文件。 注:建议目录结构 \Src 代码目录 \Templet 模板目录 \Temp 暂存目录
六、 附录 出错时Excel出现的死进程出现是一件很头疼的事情。在每个文件前加上“On Error Resume Next”将有助于改善这种情况,因为它会不管文件是否产生错误都坚持执行到“Application.Quit”,保证每次程序执行完不留下死进程。 |
|
编写通用的asp防注入程序
|
sql注入被那些菜鸟级别的所谓黑客高手玩出了滋味,,发现现在大部分黑客入侵都是基于sql注入实现的 ,哎,,谁让这个入门容易呢,好了,,不说废话了,,现在我开始说如果编写通用的sql防注入程序 一般的http请求不外乎 get 和 post,所以只要我们在文件中过滤所有post或者get请求中的参数信息中 非法字符即可,所以我们实现http 请求信息过滤就可以判断是是否受到sql注入攻击。 iis传递给asp.dll的get 请求是是以字符串的形式,,当 传递给Request.QueryString数据后,, asp解析器会分析Request.QueryString的信息,,然后根据"&",分出各个数组内的数据 所以get的拦截如下 首先我们定义请求中不能包含如下字符 '|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare 各个字符用"|"隔开,,然后我们判断的得到的Request.QueryString 具体代码如下 dim sql_injdata SQL_injdata = "'|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare" SQL_inj = split(SQL_Injdata,"|")
If Request.QueryString<>"" Then For Each SQL_Get In Request.QueryString For SQL_Data=0 To Ubound(SQL_inj) if instr(Request.QueryString(SQL_Get),Sql_Inj(Sql_DATA))>0 Then Response.Write "<Script Language=****>alert('天下电影联盟SQL通用防注入系统提示↓nn请不要在参数中包含非法字符尝试注入!');history.back(-1)</Script>" Response.end end if next Next End If 这样我们就实现了get请求的注入的拦截,但是我们还要过滤post请求,所以我们还得继续考虑request.form,这个也是以数组形式存在的,,我们只需要再进一次循环判断即可。代码如下 If Request.Form<>"" Then For Each Sql_Post In Request.Form For SQL_Data=0 To Ubound(SQL_inj) if instr(Request.Form(Sql_Post),Sql_Inj(Sql_DATA))>0 Then Response.Write "<Script Language=****>alert('天下电影联盟SQL通用防注入系统提示↓nn请不要在参数中包含非法字符尝试注入!nnHTTP://www.521movie.com ');history.back(-1)</Script>" Response.end end if next next end if 好了大功告成,,我们已经实现了get和post请求的信息拦截,,你只需要在conn.asp之类的打开数据库文件之前引用这个页面即可。放心的继续开发你的程序,,不用再考虑是否还会受到sql注入攻击。难道不是么? |
|
XML与ASP简单结合实现HTML模板功能
|
本文利用的是XML的DSO数据绑定功能来实现ASP代码和HTML代码的分离,从而实现快速更换HTML模板的功能,由于本人只是刚刚开始接触XML,有许多不太了解的,在这里仅仅是提出一点想法,如果本文有错漏的地方请大家指多.
目前快速更换模板功能基本上是处于replace替换模板中的特殊标签后再显示出来,这样加大了许多ASP的处理时间,而且模板文件过长的话,加载到内存里进行处理时也是对服务器内存的一种考验.而XML中提供了一种DSO数据绑定功能.可以将标识替换操作交付给客户端.由于为了简化HTML模板的制作要求.所以,尽量简化HTML模板的XML技术含量是有必要的.
简单来说这个方式只是使用datasrc和dataFLd这两个HTML标签的属性实现的.废话就不多说了,一切实例说话.以下两个例子将说明一切.
例一:单个数据显示 以下是用ASP生成的XML数据岛. <xml id="xmldata"> <xData> <name>coder</name> <webname>轻灵自由的珍珠</webname> <weburl>http://blog.csdn.net/oyiboy</weburl> </xData> </xml>
显示时的HTML原码: <table datasrc="#xmldata" border=1> <tr> <td colspan=2>我的简单介绍</td> </tr> <tr> <td>我的名称:</td> <td><span dataFLd="name"></span></td> </tr> <tr> <td>网站名称:</td> <td><span dataFLd="webname"></span></td> </tr> <tr> <td>网站地址:</td> <td><a dataFLd="weburl"><span dataFLd="weburl"></span></a></td> </tr> </table>
例二:多条数据显示 以下是用ASP生成的XML数据岛. <xml id="xmldataList"> <xData> <webList> <webname>轻灵自由的珍珠</webname> <weburl>http://blog.csdn.net/oyiboy</weburl> </webList> <webList> <webname>Estyle(靳田)之狂想手扎</webname> <weburl>http://blog.csdn.net/estyle</weburl> </webList> <webList> <webname>最爱白菜</webname> <weburl>http://blog.csdn.net/qunluo</weburl> </webList> </xData> </xml>
显示时的HTML原码: <table datasrc="#xmldataList" border=1> <thead> <tr> <td colspan=2>我关注的Csdn Blog列表</td> </tr> <tr> <td align="center">名称</td> <td align="center">地址</td> </tr> </thead> <tbody> <tr> <td><span dataFLd="webname"></span></td> <td><a dataFLd="weburl"><span dataFLd="weburl"></span></a></td> </tr> </tbody> </table>
(以上两个例子可以copy到一个文件内查看实际运行效果.) 注意例二HTML原码中的thead和tbody,在显示多条记录时会有用的,如果不明白他们有什么用的可以去掉它们后看看会有什么后果.
顺便说一句,图像和按键的数据绑定和超链接的绑定是差不多的,如:<img dataFLd="webimg">和<button dataFLd="buttonvalue"></button>
局限,就是要求浏览器必须支持XML,还有一个疑问
转自:http://goaler.xicp.net/ShowLog.asp?ID=485 |
|
ASP 类 Class入门
|
Class 声明
声明一个类的名字,就是定义一些变量,属性,方法来组成一个类
这是真的!!!?VBScript中能用类!?!?不知道能不能用于ASP!?这样的话,我就不是能写出像object一样的ASP程序?!说干就干!实践是检验真理的唯一标准,自个动手吧!
我们常常看到别的程序语言中中都有类的说明,PHP,VB,C++,这个在VBScript中的类的说明,我是第一次听到,我们的日常工作就是网站开发,在这个里面多多少少搞出点经验,像模像样也能自诩为"内行",所以我就来分享一下我所知道的这个新的东东。我们来看看下面的这个代码吧!(window2000+IIS5.0通过测试)
<% ''声明一个名为aspcn的类 Class aspcn Private aspcn ''初始化类 Private Sub Class_Initialize aspcn="Aspcn Is Good!<br>" End Sub ''定义一个函数 Public Function DoIt() DoIt=aspcn End Function ''定义一个方法 Public Sub QueryStr(stat) Response.write stat End Sub
End Class
Set Hi_aspcn=New aspcn ''定义一个名为Hi_aspcn的aspcn对象实例 response.write Hi_aspcn.DoIt varstr="Aspcn Is Cool!<br><font color=red>http://www.aspcn.com</font><br>WelCome!!!" Hi_aspcn.QueryStr varstr
%>
这是很简单的一个程序,我们在其中声明了一个名为aspcn的类,建立了一个DoIt函数,一个QueryStr方法,这个程序很简单相信大家能看懂,它的显示如下:
Aspcn Is Good! Aspcn Is Cool! http://www.aspcn.com WelCome!!!
可以把我们常用到的程序写成一个类,到时候就用<!--#include file="xxx.asp"-->来包含进来就行了,这给我们开发程序又提供了新的空间
转自:http://goaler.xicp.net/ShowLog.asp?ID=466 |
|
用Asp+XmlHttp实现RssReader功能
|
演示:http://goaler.xicp.net/RssReader.asp
<style> body {margin:10px;background-color:#ffffff;margin-top:6px;} form{margin:0px;} * {font:12px tahoma;line-height:140%;color:#000000} .title {font-weight:bold;color:red;} .time {font:10px;color:#999999;} a {text-decoration:none;color:blue;} </style> <script type="text/javascript"> var switcher=0; </script> <body ondblclick="if(switcher==0){document.styleSheets[0].addRule('div','display:none');switcher=1}else{document.styleSheets[0].addRule('div','display:block');switcher=0}"> <form name="rssform" method=post action=""> RSS资源:<INPUT TYPE="text" NAME="RssFeed" size=60 style="height:22px" value="<%=request("RssFeed")%>" onfocus=select()> <input type="submit" value="Read It"> 双击鼠标可以关闭摘要,只显示标题 </form> <hr/> <% If(request("RssFeed")="") Then url="/rss2.asp" else url=request("RssFeed") End If
Set xml = Server.CreateObject("Microsoft.XMLHTTP") xml.Open "GET", url, False xml.Send
Set xmlDom = server.createObject("microsoft.xmldom") xmlDom.async=False xmlDom.ValidateOnParse=false xmlDom.load(xml.responseXML)
if xmlDom.ReadyState>2 Then
set oItem=xmlDom.getElementsByTagName("item")
for i=0 to oItem.length-1 response.write "<span style='font:bold 9px verdana;color:#000000'>"&i+1&"</span>. <a class='title' href='"&oItem(i).childNodes(1).text&"' target='_blank'>"&oItem(i).childNodes(0).text&"</a> <span class='time'>["&oItem(i).childNodes(3).text&"]<br />" response.write "<div>摘要:"&oItem(i).childNodes(4).text&"</div><br>" next end if %> 转自: http://goaler.xicp.net/ShowLog.asp?ID=513 |
|
学会在ASP中使用存储过程
|
学习使用存储过程(Stored Procedure),是ASP程序员的必须课之一。所有的大型数据库都支持存储过程,比如Oracle、MS SQL等,(但MS Access不支持,不过,在Access里可以使用参数化的查询)。 使用存储过程有许多好处,它可以封装复杂的数据逻辑,充分发挥大型数据库本身的优势。我们知道,ASP并不适合做复杂的数据运算,而通过OLD DB访问数据库,由于数据需要在ASP和数据库之间传递,相当消耗系统资源。事实上,如果数据库仅仅起着数据存储的作用,那么它的功能是远远没有得到利用的。 关于如何创建存储过程,请参考MS SQL的相关文档。 本文介绍存储过程如何在ASP中运用。 简单的一个SQL语句: select ID,Name,Picture,Time,Duty from employ 我们可以创建一个存储过程: CREATE PROCEDURE sp_employ AS select ID,Name,Picture,Time,Duty from employ Go
而SQL语句: select ID,Name,Picture,Time,Duty from employ where ID=10230 对应的存储过程是:(用Alter替换我们已有的存储过程) ALTER PROCEDURE sp_employ @inID int AS select ID,Name,Picture,Time,Duty from employ where ID=@inID Go
下面对比一下SQL和存储过程在ASP中的情况。首先看看直接执行SQL的情况: <% dim Conn, strSQL, rs set Conn = Server.CreateObject("ADODB.Connection") Conn.Open "DSN=webData;uid=user;pwd=password" strSQL = " select ID,Name,Picture,Time,Duty from employ " Set rs = Conn.Execute(strSQL) %>
再看看如何执行Stored Procedure: <% dim Conn, strSQL, rs set Conn = Server.CreateObject("ADODB.Connection") Conn.Open "DSN=webData;uid=user;pwd=password" ’make connection strSQL = "sp_employ" Set rs = Conn.Execute(strSQL) %>
而执行带参数的Stored Procedure也是相当类似的: <% dim Conn, strSQL, rs, myInt myInt = 1 set Conn = Server.CreateObject("ADODB.Connection") Conn.Open "DSN=webData;uid=user;pwd=password" strSQL = "sp_myStoredProcedure " & myInt Set rs = Conn.Execute(strSQL) %>
你可能觉得在ASP中使用存储过程原来是这样的简单。对!就是这么简单。
转自: http://goaler.xicp.net/ShowLog.asp?ID=503 |
|
如何防止ASP木马在服务器上运行
|
来源:http://www.hackyun.com/
如果您的服务器正在受ASP木马的困扰,那么希望这篇文章能帮您解决您所面临的问题。
目前比较流行的ASP木马主要通过三种技术来进行对服务器的相关操作。
一、使用FileSystemObject组件
FileSystemObject可以对文件进行常规操作
可以通过修改注册表,将此组件改名,来防止此类木马的危害。
HKEY_CLASSES_ROOT\Scripting.FileSystemObject\ 改名为其它的名字,如:改为FileSystemObject_ChangeName
自己以后调用的时候使用这个就可以正常调用此组件了
也要将clsid值也改一下 HKEY_CLASSES_ROOT\Scripting.FileSystemObject\CLSID\项目的值
也可以将其删除,来防止此类木马的危害。
注销此组件命令:RegSrv32 /u C:\WINNT\SYSTEM\scrrun.dll
禁止Guest用户使用scrrun.dll来防止调用此组件。 使用命令:cacls C:\WINNT\system32\scrrun.dll /e /d guests
二、使用WScript.Shell组件
WScript.Shell可以调用系统内核运行DOS基本命令
可以通过修改注册表,将此组件改名,来防止此类木马的危害。
HKEY_CLASSES_ROOT\WScript.Shell\ 及 HKEY_CLASSES_ROOT\WScript.Shell.1\ 改名为其它的名字,如:改为WScript.Shell_ChangeName或WScript.Shell.1_ChangeName
自己以后调用的时候使用这个就可以正常调用此组件了
也要将clsid值也改一下 HKEY_CLASSES_ROOT\WScript.Shell\CLSID\项目的值 HKEY_CLASSES_ROOT\WScript.Shell.1\CLSID\项目的值
也可以将其删除,来防止此类木马的危害。
三、使用Shell.Application组件
Shell.Application可以调用系统内核运行DOS基本命令
可以通过修改注册表,将此组件改名,来防止此类木马的危害。
HKEY_CLASSES_ROOT\Shell.Application\ 及 HKEY_CLASSES_ROOT\Shell.Application.1\ 改名为其它的名字,如:改为Shell.Application_ChangeName或Shell.Application.1_ChangeName
自己以后调用的时候使用这个就可以正常调用此组件了
也要将clsid值也改一下 HKEY_CLASSES_ROOT\Shell.Application\CLSID\项目的值 HKEY_CLASSES_ROOT\Shell.Application\CLSID\项目的值
也可以将其删除,来防止此类木马的危害。
禁止Guest用户使用shell32.dll来防止调用此组件。 使用命令:cacls C:\WINNT\system32\shell32.dll /e /d guests
注:操作均需要重新启动WEB服务后才会生效。
四、调用Cmd.exe
禁用Guests组用户调用cmd.exe
cacls C:\WINNT\system32\Cmd.exe /e /d guests
通过以上四步的设置基本可以防范目前比较流行的几种木马,但最有效的办法还是通过综合安全设置,将服务器、程序安全都达到一定标准,才可能将安全等级设置较高,防范更多非法入侵。 |
|
如何删除表中的重复记录?
|
作者: NinGoo 加入时间: 2005-01-12 文档类型: 转载 来自: 浏览统计: total: 62 year: 62 quarter: 62 month: 62 week: 24 today: 4
--测试数据 /*----------------------------- select * from tt -----------------------------*/ id pid ----------- ----------- 1 1 1 1 2 2 3 3 3 3 3 3
(所影响的行数为 6 行)
首先,如何查询table中有重复记录 select *,count(1) as rownum from tt group by id, pid having count(1) > 1 id pid rownum ----------- ----------- ----------- 1 1 2 3 3 3
(所影响的行数为 2 行)
方法一:使用distinct和临时表 if object_id('tempdb..#tmp') is not null drop table #tmp select distinct * into #tmp from tt truncate table tt insert into tt select * from #tmp
方法二:添加标识列 alter table tt add NewID int identity(1,1) go delete from tt where exists(select 1 from tt a where a.newid>tt.newid and tt.id=a.id and tt.pid=a.pid) go alter table tt drop column NewID go
--测试结果 /*----------------------------- select * from tt -----------------------------*/ id pid ----------- ----------- 1 1 2 2 3 3 |
|
金额阿拉伯数字转换为中文的存储过程
|
作者: 不详 加入时间: 2004-10-25 文档类型: 来自: 浏览统计: total: 21 year: 21 quarter: 21 month: 21 week: 8 today: 2
Create Procedure AtoC @ChangeMoney Money as Set Nocount ON Declare @String1 char(20) Declare @String2 char(30) Declare @String4 Varchar(100) Declare @String3 Varchar(100) --从原A值中取出的值 Declare @i int --循环变量 Declare @J Int --A的值乘以100的字符串长度 Declare @Ch1 Varchar(100) --数字的汉语读法 Declare @Ch2 Varchar(100) --数字位的汉字读法 Declare @Zero Int --用来计算连续有几个零 Declare @ReturnValue VarChar(100)
Select @ReturnValue = '' Select @String1 = '零壹贰叁肆伍陆柒捌玖' Select @String2 = '万仟佰拾亿仟佰拾万仟佰拾元角分'
Select @String4 = Cast(@ChangeMoney*100 as int)
select @J=len(cast((@ChangeMoney*100) as int))
Select @String2=Right(@String2,@J)
Select @i = 1
while @i<= @j Begin
Select @String3 = Substring(@String4,@i,1)
if @String3<>'0' Begin
Select @Ch1 = Substring(@String1, Cast(@String3 as Int) + 1, 1) Select @Ch2 = Substring(@String2, @i, 1) Select @Zero = 0 --表示本位不为零 end else Begin If (@Zero = 0) Or (@i = @J - 9) Or (@i = @J - 5) Or (@i = @J - 1) Select @Ch1 = '零' Else Select @Ch1 = ''
Select @Zero = @Zero + 1 --表示本位为0 --如果转换的数值需要扩大,那么需改动以下表达式 I 的值。 Select Ch2 = ''
If @i = @J - 10 Begin Select @Ch2 = '亿' Select @Zero = 0 end If @i = @J - 6 Begin Select @Ch2 = '万' Select @Zero = 0 end if @i = @J - 2 Begin Select @Ch2 = '元' Select @Zero = 0 end If @i = @J Select @Ch2 = '整' end
Select @ReturnValue = @ReturnValue + @Ch1 + @Ch2
select @i = @i+1 end
--最后将多余的零去掉 If CharIndex('仟仟',@ReturnValue) <> 0 Select @ReturnValue = Replace(@ReturnValue, '仟仟', '仟')
If CharIndex('佰佰',@ReturnValue) <> 0 Select @ReturnValue = Replace(@ReturnValue, '佰佰', '佰')
If CharIndex('零元',@ReturnValue) <> 0 Select @ReturnValue = Replace(@ReturnValue, '零元', '元') If CharIndex('零万',@ReturnValue) <> 0 Select @ReturnValue = Replace(@ReturnValue, '零万', '万') If CharIndex('零亿',@ReturnValue) <> 0 Select @ReturnValue = Replace(@ReturnValue, '零亿', '亿') If CharIndex('零整',@ReturnValue) <> 0 Select @ReturnValue = Replace(@ReturnValue, '零整', '整') If CharIndex('零佰',@ReturnValue) <> 0 Select @ReturnValue = Replace(@ReturnValue, '零佰', '零')
If CharIndex('零仟',@ReturnValue) <> 0 Select @ReturnValue = Replace(@ReturnValue, '零仟', '零')
If CharIndex('元元',@ReturnValue) <> 0 Select @ReturnValue = Replace(@ReturnValue, '元元', '元') Select @ReturnValue GO
|
|
存储过程分页的好的例子
|
作者: serverme 加入时间: 2004-10-13 文档类型: 来自: 浏览统计: total: 29 year: 29 quarter: 29 month: 29 week: 11 today: 2
-------------------------------------分页的存储过程------------------------ -- 利用SQL未公开的存储过程实现分页
CREATE procedure p_splitpage @sql nvarchar(4000), --要执行的sql语句 @page int=1, --要显示的页码 @pageSize int, --每页的大小 @pageCount int=0 out, --总页数 @recordCount int=0 out --总记录数 as set nocount on declare @p1 int exec sp_cursoropen @p1 output,@sql,@scrollopt=1,@ccopt=1,@rowcount=@pagecount output set @recordCount = @pageCount select @pagecount=ceiling(1.0*@pagecount/@pagesize) ,@page=(@page-1)*@pagesize+1 exec sp_cursorfetch @p1,16,@page,@pagesize exec sp_cursorclose @p1 GO ---------------------------得到执行的查询语句的存储过程----------------- CREATE PROCEDURE dtalyjd_search (@search_name varchar(50)) AS DECLARE @str varchar(4000) if @search_name='' begin set @str='select * from 表名' select @str sql return end else begin set @str='select * from 表名 where search_name like ''%'+@search_name+'%''' select @str sql return end GO
--------------------------ASP页面---------------------
<% dim search_name search_name=trim(request("search_name")) set rs1=conn.execute("exec dtalyjd_search '"&search_name&"'") sql=rs1("sql") rs1.close if request("page")="" or request("page")=0 or IsNumeric(request("page"))=false then m_page=1 else m_page=cint(request("page")) end if m_pagesize=14'每页的条数 set cmd = server.CreateObject("adodb.command") cmd.ActiveConnection = conn cmd.CommandType = 4 cmd.CommandText = "p_SplitPage" cmd.Parameters.Append cmd.CreateParameter("@sql",8,1, 4000, sql) cmd.Parameters.Append cmd.CreateParameter("@page",4,1, 4, m_page) cmd.Parameters.Append cmd.CreateParameter("@pageSize",4,1, 4, m_pageSize) cmd.Parameters.Append cmd.CreateParameter("@pageCount",4,2, 4, m_pageCount) cmd.Parameters.Append cmd.CreateParameter("@recordCount",4,2, 4, m_recordCount) set rs = cmd.Execute set rs = rs.NextRecordSet m_pageCount = cmd.Parameters("@pageCount").value m_recordCount = cmd.Parameters("@recordCount").value if m_pageCount = 0 then m_pageCount = 1 if m_page>m_pageCount then response.Redirect("bureauser_result.asp?page="&m_pageCount&"&lxsuser_name="&lxsuser_name) end if set rs = cmd.Execute %> <table width="100%" border="0" cellspacing="1" cellpadding="0"> <tr> <td width="47%" align="right">查询结果共 <font color="#FF0000">[8]</font>页 这是第 <font color="#FF0000">[5]</font> 页</td> <td width="53%" align="right"> <table width="95%" border="0" cellspacing="0" cellpadding="0"> <tr> <td width="10" align="right" ><img src="feedback_images/ll.gif" width="8" height="21"></td> <td width="475" background="feedback_images/m.gif"> <table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <% if m_page<>1 then %> <td width="23%"><img src="images/first.gif" width="8" height="8"> <A HREF=<%=Myself%>?Page=1&search_name=<%=search_name%>>首页</A></td> <td width="31%"><img src="images/pre.gif" width="8" height="8"> <A HREF=<%=Myself%>?Page=<%=(Page-1)%>&search_name=<%=search_name%>>上一页</a></td> <% end if If m_page <> m_pageCount Then %> <td width="24%"><img src="images/lat.gif" width="8" height="8"><A HREF=<%=Myself%>?Page=<%=(m_Page+1)%>&search_name=<%=search_name%>>下一页</A></td> <td width="22%"><img src="images/last.gif" width="8" height="8"><A HREF=<%=Myself%>?Page=<%=m_pageCount%>&search_name=<%=search_name%>>尾页</A></td> <%end if%> </tr><%end if%> </table></td> <td width="11"><img src="feedback_images/rr.gif" width="10" height="21"></td> </tr> </table> </td> </tr> </table>
|
|
|