游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2810|回复: 4

VBS-动态页面中服务端的处理

[复制链接]

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
发表于 2009-3-10 01:19:00 | 显示全部楼层 |阅读模式
动态页中服务器端的处理    前面的章节已经研究了ASP的一些内置对象。重点介绍的对象有Request、Response、Session和Application对象。ASP中另一??比较主要的对象为Server对象。本章重点介绍此对象的背景知识和使用方法。
Server对象在服务器端脚本中通过实例和使用其他外部对象和组件,提供了一种扩展ASP页的功能的方法。事实上,许多人觉得此对象是ASP之所以能够流行的主要因素。引入Server对象的意义很大,这意味着ASP不必提供人们所需要的所有属性。他可调用其他应用程序和组件完成指定工做。

这也恰好符合了构建
由独立的对象组成的应用程序的总体目标,而不是构建一般见到的那种耗尽硬盘空间的“可作每件事情”的巨型程序。不仅仅是在电脑的世界中,整个世界正在朝着组件和“即插即用”概念方面发展。如今,当汽车或电?机发生故障?r,技师或工程师很可能会拔出有问题的部件而且插入一??新的部件,因此,汽车维护人员或电?机维修人员的工做也变成了面向对象的。
而,II
S同样支持使用外部对象和与服务器环境进行交互做用的许多传统方法。这是一??特定的例外,这些方法并不是真正的ASP组成部分,但一般的确特?e有用,而且通过Server对象的一些新特性已经与ASP很好地进行了集成。本章将简要地回顾这些传统方法,接着详细地介绍ASP Server对象。

本章的主要内容为:

· 传统的服务
器端包含(SSI)指令的背景知识和使用方法。
· Ser
ver对象所要完成的任务,以及与SSI的比较。
· 如何
使用Server对象实例、外部组件和应用程序。
· 如何
使用Server对象执行封装的脚本或其他ASP页面。
·
如何使用Server对象管理在脚本中出现的错误。
·
如何使用Server对象完成与HTML或HTTP兼容的格式转换。
Serve
r对象是ASP页中的错误处理过程的一部分,在IIS 5.0和ASP 3.0中是新的内容。本章介绍该对象是如何工做的。因为有单独的一章(第7章)专门讨论有关调试和错误处理方面的所有问题。所以本章只简要地讨论错误处理方法,而且仅限于Server对象直接涉及的过程。

4.1 动
态页中服务器端的处理
就服务器端处理
而言,ASP是产生动态Web网页的一种相对较新的技术。动态页意味着什么呢?先暂?r不考虑客户端相关功能的进展,也不讨论客户端脚本、Java Applet、动态HTML或ActiveX控件等内容。这里的动态页是专指服务器响应客户端请求产生的页面,而且根据情况每次产生的页面可能是不同的。
举个简单的例子,创建一??只包含当前日期和?r间的页面。每次请求该页面?r将显示一??不同的值,因为日期和?r间取决于服务器的?r钟,或取决于提供日期和?r间的一??资源(例如一??独立的服务器或来自于互联网上一??标准?r钟)。当然,实际上动态页要比这复杂得多,也许显示数据库记录的当前值或者邮件服务器上等待着的邮件消息的摘要。重要的是服务器不仅阅读一??无格式的HTML页面、或磁盘上的文本文件以及将他们发送给客户,并且,必需完成一些工做来创建该页面。

Internet服务器应用编程接口
第1章介绍了创建动态页的一些方法。传统的技术是使用与Web服务器的一??接口,他被称为Internet服务器应用编程接口(Internet Server Application Programming Interface,ISAPI)。
ISAPI可用于执行其他的应用程序,这些应用程序通过C语言风格的stdin和stdout数据流函数来读取客户端请求的值并创建Web服务器的响应。ISAPI应用程序所必需作的全部事情就是编写相应?果页面的文本和HTML,并通过stdout函数输出到Web服务器。事实上ASP DLL内部真正作的事情是更面向对象的。
IIS自开始就运行ISAPI的应用程序和脚本解释器。他提供一??特殊的解释器动态链接库,给出访问服务器的请求和响应的另一种方法,虽然受到一定的限制。他通过服务器端包含指令实现,之所以这样?,是因为他们是在服务器上执行的,而且?果包含在传送给客户端的响应中。此特性在IIS中是通过一??名为ssinc.dll的动态链接库实现的。缺省情况下,IIS将文件扩展名为.shtml、.shtm或.stm的任意页面都映射到此动态链接库。打开默认Web站点的Properties对话框,在Application Setting中单击Configuration按钮,可以看到这种映射,如图4-1所示:

这样,带有这些被映射的文件扩展名的页面将被传送给ssinc.dll进行处理。因此,执行页面中所有的服务器端包含语句,?果(如有的话)插入到服务器的响应中,即插入到客户端接受到的页面中。
因为这些文件是映射到ssinc.dll文件而不是映射到ASP动态链接库(asp.dll)的,所以在这些页面中的所有ASP代码将被忽略而且按照原有状态传送给客户端,客户端将能够看到这些脚本。而,在ASP 3.0版本中有一??避免这种情况的方法,稍后在讨论Server对象的Execute和Transfer方法?r,研究此方法。

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
 楼主| 发表于 2009-3-10 01:20:00 | 显示全部楼层

Re:VBS-动态页面中服务端的处理

权限管理的?计和实现(含演示和原代码)

权限管理的?计和实现(含演示和原代码)
  权限管理的核心,就是对不同权限的用户,分配管理对应权限的资源。
    本
例以一??网站栏目后台管理模块(资源)的权限管理为例,实现了不同用户的权限管理。

    数据库?计:
    帐户信
息表:
      f_i_autoi
d     自动编码(主键)
   
  f_i_orderid
     
f_accountid    帐户编码
      f_accountnam
e  帐户    (外键)
     
f_password     密码
      f_accounttype

      f_username
     f_remark
     
f_datetime

     
栏目信息表:
      f_i_a
utoid    自动编码(主键)
     f_i_orderid
  
    f_lanmuid     栏目编码
      f_lanmunam
e   栏目    (外键)
   
  f_ishidden
      
f_remark
      f_da
tetime

      权限表:

      f_i_autoid  
  自动编码(主键)
      f_
accountname 帐户    (外键)
      f_lanmunam
e   栏目    (外键)
   
  f_remark
      f_
datetime
    通过权限表的
f_accountname 帐户(外键)和 f_lanmuname 栏目(外键)将帐户信息表
    和栏目信息表联
系起来,通过给“帐户”分配“栏目”,或者给“栏目”分配“帐户”,使帐户和栏目创建关系(可以是“一对多”“多对一”或者“多对多”)。
    接着以当前登陆的帐
户为基准,在权限表中查找其可管理的栏目(资源)。
    本例实现了一??用户对
多栏目的管理(可是一??栏目只能被一??用户管理 - 此通过程序代码的约束来实现)。
    以下是部分代码:
<% O
ption explicit %>
<
!-- #include file="./globals.inc" -->
<
!-- #include file="./connects.inc" -->
<html>
<head>
  <t
itle>??权限</title>
<link href="./style/style.css" rel="stylesheet" type="text/css">
  <meta http-
equiv="Content-Type" content="text/html; charset=gb2312">
<meta http-equiv=&quotage-Enter" content="blendTrans(Duration=1.0)">
  <meta http
-equiv="Page-Exit" content="blendTrans(Duration=1.0)">
  <s
cript language="javascript">
    functi
on openwin(url, l, t, w ,h)
    {open(u
rl,'','toolbar=no,location=no,status=no,menubar=no,scrollbars=no,resizable=no,width='+ w +',height='+ h +',left='+ l +',top='+ t);}
    fun
ction check_and_submit(frm)
    {
   
  SelectAll(frm.SelectedItem);
      fr
m.submit();
    }
  </script>
</head>

<body topmargin=20
leftmargin=0 background="/images/bg.gif">
<%
  Dim sSQL,
rs1, rs2, rs3, CurrentAccount
  Current
Account = request("CurrentAccount")
%>

<form name="frm1" i
d="frm1" method="post" action="save.asp">
<input name="allo
wsubmit" type="hidden" value="OK">
<tab
le width="500" border="0" cellspacing="0" cellpadding="0" algn="center">
  <tr height=30>
    <td colspan=3>
           
      帐号信息:
        <input name="accountname" type="hidden" value="<%=CurrentAccount%>">
        <%
          sSQL = "select * from tabAccountInfo where f_accountname='" & CurrentAccount & "'"
          Set rs1 = Server.CreateObject("ADODB.Recordset")
          rs1.open sSQL, sConn, 1, 1
          if rs1.eof and rs1.bof then
            response.write("没有获取该用户的信息。")
            response.end
          else
            response.write " [帐号:] <font color=#ff0000>" & rs1("f_accountname") & "</font> [用户姓名:] " & rs1("f_username") & " [帐号类型:] " & rs1("f_accounttype")
          end if
          Set rs1 = nothing
        %>
    </td>
  </tr>
  <tr height=10><td colspan=3></td></tr>
  <tr>
    <td width="220" align=center valign="top">
      已分配该用户管理的栏目:<br><br>
      <select name="SelectedItem" id="SelectedItem" size=12 multiple="true">
        <%
         '选择所有栏目中除去已经分配的栏目:
          sSQL = "select f_lanmuname from tabQXB where f_accountname='"& CurrentAccount &"' order by f_lanmuname"
          Set rs3 = Server.CreateObject("ADODB.Recordset")
          rs3.open sSQL, sConn, 1, 1
          if rs3.eof and rs3.bof then
            response.write("<option>无</option>") & chr(13)
          else
            while not rs3.eof
              response.write "<option>" & rs3("f_lanmuname") & "</option>" & chr(13)
              rs3.movenext
            wend
          end if
          Set rs3 = nothing
        %>
      </select>
      </select>
    </td>
    <td width="60" align=center>
      <br><br>
      <button onClick="MoveSingleItem(WaitSelectItem, SelectedItem)"><</button><br><br>
      <button onClick="MoveAllItems(WaitSelectItem, SelectedItem)"><<</button><br><br><br><br>
      <button onClick="MoveSingleItem(SelectedItem, WaitSelectItem)">></button><br><br>
      <button onClick="MoveAllItems(SelectedItem, WaitSelectItem)">>></button><br>
    </td>
    <td width="220" align=center valign="top">
      待分配的栏目:<br><br>
      <select name="WaitSelectItem" size=12 multiple=true>
        <%
         '选择所有栏目中除去已经分配的栏目:
          sSQL = "select f_lanmuid, f_lanmuname from tabLanmuInfo " & _
                 "where f_lanmuname not in (select distinct f_lanmuname from tabQXB) order by f_lanmuid"
          Set rs2 = Server.CreateObject("ADODB.Recordset")
          rs2.open sSQL, sConn, 1, 1
          if rs2.eof and rs2.bof then
            response.write("<option>无</option><br>")
          else
            while not rs2.eof
              response.write "<option>" & rs2("f_lanmuname") & "</option><br>"
              rs2.movenext
            wend
          end if
          Set rs2 = nothing
        %>
      </select>
    </td>
  </tr>
  <tr height=120>
    <td colspan=3 align=center>
      <button onClick="check_and_submit(frm1);"> 保 存 </button>
            
      <button onClick="history.go(-1);"> 返 回 </button>
    </td>
  </tr>
</table>
</form>
<script language="javascript">
function MoveSingleItem(sel_source, sel_dest)
{
   if (sel_source.selectedIndex==-1)  //源:没有点选一切项目
     return;
   if (sel_source.options[0].text=="无") //源:只有“无”项目
     return;
   if (sel_dest.options[0].text=="无") //目标:只有“无”项目,则先删除该提示性项目
     sel_dest.options.remove(0);
   var SelectedText = sel_source.options[sel_source.selectedIndex].text;
   sel_dest.options.add(new Option(SelectedText));
   sel_source.options.remove(sel_source.selectedIndex);
   if (sel_source.options.length==0)  //源:若删除完所有有用项目,则添加提示项目:“无”
     sel_source.options.add(new Option("无"));
}
function MoveAllItems(sel_source, sel_dest)
{
   if (sel_source.options[0].text=="无") //源:只有“无”项目
     return;
   if (sel_dest.options[0].text=="无")   //目标:只有“无”项目,则先删除该提示性项目
     sel_dest.options.remove(0);
   //首先复制所有项目到目标:
   var sel_source_len = sel_source.length;
   for (var j=0; j<sel_source_len; j++)
   {
     var SelectedText = sel_source.options[j].text;
     sel_dest.options.add(new Option(SelectedText));
   }
   //接着删除“源”所有项目:
   while ((k=sel_source.length-1)>=0)
   {
     if (sel_source.options[0].text=="无") //源:只有“无”项目
       break;
     sel_source.options.remove(k);
     if (sel_source.options.length==0)  //源:若删除完所有有用项目,则添加提示项目:“无”
       sel_source.options.add(new Option("无"));
   }
}
function SelectAll(theSel)  //选中select中全部项目
{ for (i = 0 ;i<theSel.length;i++)
    theSel.options.selected = true;
}
</script>

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
 楼主| 发表于 2009-3-10 01:22:00 | 显示全部楼层

Re:VBS-动态页面中服务端的处理

非摸板生成静态页
非摸板生成静态页 目
前已经有很多生成html的新闻系统,可是都是用的模板,本函数实现将asp页面产生的html代码保存成为一??html文件,这样就没有必要改动原来的页面就可以轻松完成一??生成html的新闻系统了。'
于代码比较短,这里就不进行注释了

  CODE:   <%
'当目标页面
的包含文件即#include的页面里边存在response.End()的?r候本程序有问题
'注意:本文件一定要放在fi
lename指向的文件的同一目录下
d
im hughchiu_rtcode
Function get_exe_code(filename)
dim exe
code
dim tmp_str
D
im re,re1,content,fso,f,aspStart,aspEnd

dim ms,m
execode =
""
set fso=CreateO
bject("Scripting.FileSystemObject")
set
f=fso.OpenTextFile(server.mappath(filename))
content=f.Rea
dAll
f.close
set f
=nothing
set fso=no
thing

set re = ne
w regexp
re.ignorec
ase = true
re.globa
l = true
re.pattern
= "\<\%\@[^\%]+\%\>"
content = re.repl
ace(content,"")

r
e.global = false
re
.pattern = "\<\!\-\-\s*\#include\s*file\s*=\s*\""([^\""]+)\""\s*\-\-\>"
do
set
ms = re.execute(content)
if ms.count<>
0 then
set m = ms(0
)
tmp_str = get_exe
_code(m.submatches(0))
content = re.rep
lace(content, tmp_str)
else
exit do
e
nd if
loop
set m =
nothing
set ms = n
othing

re.pattern
="^\s*="
aspEnd=1
aspStart=inStr(aspEnd,content,"<%")+2


set re1=new RegExp

re1.ignorecase = tr
ue
re1.global = fal
se
re1.pattern = "r
esponse\.Write(.+)"


do while aspStart
>aspEnd+1
  execod
e = execode&vbcrlf&" hughchiu_rtcode = hughchiu_rtcode&"""&replace( replace(Mid(content,aspEnd,aspStart-aspEnd-2),"""",""""""), vbcrlf, """&vbcrlf&""")&""""&vbcrlf
  aspEnd=inStr(
aspStart,content,"%\>")+2
  tmp_str = M
id(content,aspStart,aspEnd-aspStart-2)
  
do
set ms = re1
.execute(tmp_str)
i
f ms.count<>0 then
set m = ms(0)
tmp_s
tr = re1.replace(tmp_str, " hughchiu_rtcode = hughchiu_rtcode&"&m.submatches(0))
else
exit do
end
if
loop
  
  set
m = nothing
  set
ms = nothing
  
  
execode = execode& re.replace(tmp_str,"hughchiu_rtcode = hughchiu_rtcode&")

aspStart=inStr(aspEnd,content,"<%")+2
loop

set re1 = no
thing
set re=nothin
g

execode = execo
de&vbcrlf&" hughchiu_rtcode = hughchiu_rtcode&"""&replace( replace(Mid(content,aspEnd), """", """"""), vbcrlf, """&vbcrlf&""" )&""""&vbcrlf
get_exe_code = "<%"&execode&"%\>"
End Function



function asp2html(filename)
dim code
code = replace( replace( replace( get_exe_code(filename), "hughchiu_rtcode = hughchiu_rtcode&"""""&vbcrlf, "" ), "<%", "" ), "%\>", "" )
'response.Write(code)
execute(code)
'response.Write( hughchiu_rtcode )
asp2html = hughchiu_rtcode
end function
%>
使用范例:

  CODE:   set fso=CreateObject("Scripting.FileSystemObject")
set f=fso.CreateTextFile( server.mappath( "youpage.htm" ), true )
f.WriteLine( asp2html("youpage.asp") )
f.close
set f = nothing
set fso = nothing
可见,尽管是新方法还是需要fso的支持

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
 楼主| 发表于 2009-3-10 01:23:00 | 显示全部楼层

Re:VBS-动态页面中服务端的处理

ASP用JMail、CDO发送邮件 前一段?r间有发过一??简单的JMAIL邮件发邮件的代码,今天就将此代码作一??具体的注解,并增加了另外两个格式的代码,并举几个简单的例子:
首先是
jmail.smtpmail的核心代码: <%
  Set
jmail = Server.CreateObject("JMAIL.SMTPMail")   '创建一??JMAIL对
  jmail.sile
nt = true   'JMAIL不会抛出例外错误,返回的值为FALSE跟TRUE
jmail.logging = true   '启用使用日
  jmail.Char
set = "GB2312" '邮件文字的代码为简体中文

  jmail.Conten
tType = "text/html"  '邮件的格式为HTML的
  jmail.Se
rverAddress = "Server Address"   '发送邮件的服务器
jmail.AddRecipient Email    '邮件的收件人
  jmail
.SenderName = "SenderName"    '邮件发送者的姓名
  jm
ail.Sender = "Email Address"    '邮件发送者的邮件地址
  jmail.Priority = 1   '邮件的紧急程序,1 为最快,5 为最慢, 3 为默认值
  jmail
.Subject = "Mail Subject"  '邮件的标题
  jmail.Bo
dy = "Mail Body"   '邮件的内容
  j
mail.AddRecipientBCC Email   '密件收件人的地址
  jma
il.AddRecipientCC Email   '邮件抄送者的地址
  jmail.
Execute()   '执行邮件发送
  jmail.C
lose    '关闭邮件对象
%>
  w3 Jmai
l4.3组件重新?计了其内部?构——使用Message对象代替原来的单一对象Jmail.smtpmail发送邮件,有些方法需要身份验证的(如163、yahoo等),可以用下面的方法解决:
<%
     S
et jmail = Server.CreateObject("JMAIL.Message")   '创建发送邮件的对象
     jmail.si
lent = true    '屏蔽例外错误,返回FALSE跟TRUE两值j
     
mail.logging = true   '启用邮件日志

     jmail.Cha
rset = "GB2312"     '邮件的文字编码为国
     jmail.C
ontentType = "text/html"    '邮件的格式为HTML格式
  
   jmail.AddRecipient Email     '邮件收件人的地址
  
   jmail.From = "Email From for Sender"   '发件人的E-MAIL地址
   
  jmail.MailServerUserName = "UserName of Email"     '登录邮件服务器所需的用户名
     j
mail.MailServerPassword = &quotassword of Email"     '登录邮件服务器所需的密码
     jmail
.Subject = "Mail Subject"    '邮件的标题
     jm
ail.Body = "Mail Body"      '邮件的内容
     jmai
l.Prority = 1      '邮件的紧急程序,1 为最快,5 为最慢, 3 为默认值
     jmail.
Send("Server Address")     '执行邮件发送(通过邮件服务器地址)
     jmail.Cl
ose()   '关闭对象
%>
  在讲一下微软自带的
CDONTS组件的发信的方法:
<%
    Set c
domail = Server.CreateObject("CDONTS.NewMail")  '创建邮件对象
   
cdomail.Subject = "Mail Subject"   '邮件标题
  
  cdomail.From = "Sender's Mail"   '发件人的地址
   cdomail.To = "Email will from"   '收件人的地址
    cdomail.Body = "Mail Body"   '邮件的内容
   
cdomail.Send    '执行发送
%>
  这
种方法发送邮件是最简单的,同?r也带来一定的问题,就是很少有服务器会开这项服务!

  
我们写程序,一般情况下都是?要代码模块化,这样方便维护,同?r也方便移植。因此,我在这里将此发邮件的写成一??子程,在调用的?r候可以直接调用(当然,若你高兴写成函数的话也是可以的,此主要是看个人兴趣):
<%
  '参数?明
  'Sub
ject     : 邮件标题
  'MailAddres
s : 发件服务器的地址,如smtp.163.com
  
'Email       : 收件人邮件地址
  'Sen
der      : 发件人姓
  'Content  
   : 邮件内容
  'F
romer      : 发件人的邮件地址
  Sub S
endAction(subject, mailaddress, email, sender, content, fromer)
      Set
jmail = Server.CreateObject("JMAIL.SMTPMail")   '创建一??JMAIL对
      jmail.
silent = true   'JMAIL不会抛出例外错误,返回的值为FALSE跟TRUE
      jmail.
logging = true   '启用使用日志
   
  jmail.Charset = "GB2312"  '邮件文字的代码为简体中文
  
    jmail.ContentType = "text/html"  '邮件的格式为HTML的
      jma
il.ServerAddress = mailaddress   '发送邮件的服务器
     jmail.AddRecipient Email    '邮件的收件人
   
   jmail.SenderName = sender   '邮件发送者的姓名
   
   jmail.Sender = fromer    '邮件发送者的邮件地址
   
  jmail.Priority = 1   '邮件的紧急程序,1 为最快,5 为最慢, 3 为默认值
      j
mail.Subject = subject  '邮件的标题
      jmail.B
ody = content   '邮件的内容
      
'由于没有用到密抄跟抄送,这里屏蔽掉这两句,若您有需要的话,以在这里恢复
      'jmail.AddRecipientBCC Email   '密件收件人的地址
      'jmail.AddRecipientCC Email   '邮件抄送者的地址
      jmail.Execute()   '执行邮件发送
      jmail.Close    '关闭邮件对象
  End Sub
  
  '调用此Sub的例子
  Dim strSubject,strEmail,strMailAdress,strSender,strContent,strFromer
  strSubject     = "这是一封用JMAIL发送的测试邮件"
  strContent     = "JMail组件发送测试成功!"
  strEmail       = "runbing@eyou.com"
  strFromer      = "runbing@eyou.com"
  strMailAddress = "mail.ubbcn.com"
  Call SendAction (strSubject,strMailaddress,strEmail,strSender,strContent,strFromer)
%>
  以上是我对发邮件代码的一??粗略的见解,忘大家不吝赐教!

4

主题

107

帖子

107

积分

注册会员

Rank: 2

积分
107
发表于 2009-3-10 12:03:00 | 显示全部楼层

Re: VBS-动态页面中服务端的处理

MD, 不小心点了链接.....中毒了..... [em4] [em4] [em4]
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-20 04:07

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表