文章标签 ‘ASP’

C:分区部分:
c:\
administrators 全部
iis_wpg 只有该文件夹
列出文件夹/读数据
读属性
读扩展属性
读取权限

c:\inetpub\mailroot
administrators 全部
system 全部
service 全部

c:\inetpub\ftproot
everyone 只读和运行

c:\windows
administrators 全部
Creator owner
不是继承的
只有子文件夹及文件
完全
Power Users
修改,读取和运行,列出文件夹目录,读取,写入
system 全部
Users 读取和运行,列出文件夹目录,读取

c:\Program Files
Everyone 只有该文件夹
不是继承的
列出文件夹/读数据
administrators 全部
iis_wpg 只有该文件夹
列出文件/读数据
读属性
读扩展属性
读取权限

c:\Program Files\Common Files
administrators 全部
Creator owner
不是继承的
只有子文件夹及文件
完全
Power Users
修改,读取和运行,列出文件夹目录,读取,写入
system 全部
TERMINAL SERVER Users(如果有这个用户)
修改,读取和运行,列出文件夹目录,读取,写入
Users 读取和运行,列出文件夹目录,读取

如果安装了我们的软件:
c:\Program Files\LIWEIWENSOFT
Everyone 读取和运行,列出文件夹目录,读取
administrators 全部
IIS_WPG 读取和运行,列出文件夹目录,读取

c:\Program Files\Dimac(如果有这个目录)
Everyone 读取和运行,列出文件夹目录,读取
administrators 全部

c:\Program Files\ComPlus Applications (如果有)
administrators 全部

c:\Program Files\GflSDK (如果有)
administrators 全部
Creator owner
不是继承的
只有子文件夹及文件
完全
Power Users
修改,读取和运行,列出文件夹目录,读取,写入
system 全部
TERMINAL SERVER Users
修改,读取和运行,列出文件夹目录,读取,写入
Users 读取和运行,列出文件夹目录,读取
Everyone 读取和运行,列出文件夹目录,读取

c:\Program Files\InstallShield Installation Information (如果有)
c:\Program Files\Internet Explorer (如果有)
c:\Program Files\NetMeeting (如果有)
administrators 全部

c:\Program Files\WindowsUpdate
Creator owner
不是继承的
只有子文件夹及文件
完全
administrators 全部
Power Users
修改,读取和运行,列出文件夹目录,读取,写入
system 全部

D:分区部分:
d:\ (如果用户网站内容放置在这个分区中)
administrators 全部权限

d:\FreeHost (如果此目录用来放置用户网站内容)
administrators 全部权限
SERVICE 全部权限

E:分区部分:
从安全角度,我们建议WebEasyMail(WinWebMail)安装在独立的盘中,例如E:
E:\(如果webeasymail安装在这个盘中)
administrators 全部权限
system 全部权限
IUSR_*,默认的Internet来宾帐户(如果这个网站用这个用户来运行)
不是继承的
只有子文件夹
读取权限
E:\WebEasyMail (如果webeasymail安装在这个目录中)
administrators 全部
system 全部权限
SERVICE 全部
IUSR_*,默认的Internet来宾帐户 全部权限(如果这个网站用这个用户来运行)
关于IUSR_*,我们不建议用这个用户来运行Webeasymail,应该用平台开一个虚拟主机来运行Webeasymail。
----------------不知道2000是不是一样设置.

2006年2月26日04:25 | 评论关闭
分类: Windows
标签: ,

这只是个asp小技巧类的东西,它虽然适合在每个不同文件名里调用这个函数,但是也是有前提的,下面让我们来仔细看看其中的原委。
下面这段是基本的分页代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<% sql = "select  ……………………" '省略了sql语句 
 Set rs=Server.Createobject("ADODB.RECORDSET") 
 rs.Open sql, conn, 1, 1 
 if not rs.eof then 
  pages = 30 '定义每页显示的记录数 
  rs.pageSize = pages'定义每页显示的记录数 
  allPages = rs.pageCount'计算一共能分多少页 
  page = Request.QueryString("page")'通过浏览器传递的页数 
  'if语句属于基本的排错处理 
  if isEmpty(page) or Cint(page) < 1 then 
   page = 1 
  elseif Cint(page) > allPages then 
   page = allPages 
  end if 
  rs.AbsolutePage = page 
  Do while not rs.eof and pages > 0 %> 
   这里输出你要的内容……………… 
   <% pages = pages - 1 
   rs.MoveNext 
  Loop 
 else 
  Response.Write("数据库暂无内容!") 
End if 
 rs.Close 
 Set rs = Nothing %>

  系统已经为数据分页了,下面就看看这次探讨的关键问题分页函数的定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<% SUB pageUrl(pUrl) 
 Dim eUrl 
txts = Request.ServerVariables("URL") 
 txts = left(txts,instrrev(txts,"/",len(txts))-1) 
 eUrl = "http://" & Request.ServerVariables("server_name") & txts 
 For i =1 to allpages 
  txt = "" 
  txt = "<strong>" 
  txt = txt & "<a href=" & eUrl & pUrl & "page="&i & ">" 
  if i = Cint(Page) then txt = txt & "<font color='#bb0000'>" 
   txt = txt & (i) 
   if i = Cint(Page) then txt = txt & "</font>" 
    txt = txt & "</a> || </strong>" 
    Response.Write(txt) 
 Next 
END sub %>

把上面这个分页函数代码COPY存成一个ASP文件,在需要使用的页面里用include来引入他调用的时候只要

1
Call("/你调用的文件名?")

就ok了,比如我的 news页面里要调用那么就是

1
<%Call("/news.asp?")%>

刚才我们所到这是有限制的意思就是说第一段代码里除了sql查询内容和输出内容可以更改,其他的声明记录集的对象,page, pages, allpages这些变量都不能更改,否则将无法运行~其实这个程序是无关紧要的,最主要的就是,这个分页函数可以在任何一个asp叶面里调用。分页做的还不漂亮,高手们可以修改修改,能发给我的话我会负责给您发表出来!

2006年1月11日23:37 | 评论关闭
分类: 程序代码
标签:

其实网上已经有很多ASP生成htm的文章了,有一种方法是ASP+XML的生成方法,虽然有一种好处就是不用程序写模版就可以直接引用原来的要生成页面源码使用,但本人进行此方法测试时,发现其稳定性差和网速要求高(当然不是在服务器上了)。特别是虚拟空间上经常报错,有可能在本人在此方法上代码处理不足的原因吧。长话短说,这篇文章使用大家常用的另一种方法ASP+FSO,这里还应用了框架就是为了处理大量分页时减少生成时间使用的,这种方法是针对一些页面量较大的ASP文件。

这里我引用一个简单实例:(旅游电子商务)全国各大城市酒店应用静态页(htm)分页显示

1.应用系统环境:win2000+ASP+MSSQL/ACCESS(数据库基本没有关系了通用的)+iis5.0

2.1个城市列表(CityHtml):包括定义静态htm名称共三个字段(城市ID(自动编号),城市名称(CityName例如北京),生成htm前缀名(HtmlStartName例如beijing))

3.1个全国酒店列表(Hotel):这里我只建立三个字段(酒店ID(自动编号),城市名称(City),酒店名称(HotelName))方便来引用实例。

4.1个ASP页面(ToHtm.asp)(生成htm使用)

5.1个循环框架页面(IframeToHtm.asp),应用框架批量生成htm

以下给出两个页面的源码

循环框架进行批量生成的页面:IFrameToHtm.asp

1
2
3
4
5
6
7
8
9
10
11
12
<!--#include file="conn.asp"-->  '连接数据库
<%
dim rs,sql,j
set rs=Server.Cr&#101;ateObject("adodb.recordset")
sql="sel&#101;ct * from CityHtml"  '打开全国城市列表
rs.open sql,conn,1,1
do until rs.eof '循环各大城市%>
<!--以下应用框架打开ToHtml生成页面-->
<iframe name="LoadRcHtm<%=j%>" frameborder=0 width=100% height=30 scrolling=no src="ToHtml.asp?City=<%=cstr(rs("city"))%>&HtmlStartName=<%=rs("HtmlStart")%>"></iframe>
 
<%rs.movenext
loop%>

生成程序页面:ToHtm.asp 我在源码大概写上注释**

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
<!--#include file="conn.asp"-->'数据连接文件
<%
On Error Resume Next'容错处理
Dim City'定义取得要生成页面的城市
City=Request.Querystring("City")'获取生成的城市酒店值从框架传过来的在后面将介绍
HtmlStartName=Request.Querystring("HtmlStartName")'获得生成htm文件名前缀
Dim sql'搜索字符串,这里我就直接打开表不用搜索变量了,搜索条件按自己写就可以
sql="select * from Hotel where [City] = '" & City & "' "
Dim ors'数据操作对象
Dim PageCounts'实现分页生成必须得知呀有多少页
Set ors = Server.CreateObject("ADODB.Recordset")
ors.Open Sql,oConn,1,1'找开酒店等于City变量的表
ors.pagesize=10'十个记录为一页
PageCounts=oRs.pagecount'得出要生成多少个页面,循环生成使用
Dim fs'定义fso文件对象
Dim folders'存放生成静态页的文件夹名称
Dim Filestart'定义生成htm文件前缀
Set fs=Server.CreateObject("Scripting.FileSystemObject")
Dim i
for i=1 to PageCounts'开始循环生成页面,也就是分页生成了
page=i
ors.absolutepage=i'页码
rowcount=oRs.pagesize'当页记录数
folders=server.mappath("CityHtml")
if (fs.FolderExists(folders)) then'判断文件夹是否存在
else
fs.CreateFolder(folders)'不存在则创建CityHtml文件夹
end if
if i=1 then
Filestart=HtmlStartName'如果为第一页则定义文件名为传值名.例如beijing则为beijing.htm
else
Filestart=HtmlStartName&i'如果第二页则为beijing+1例如有两页也就是i等于2则为 beijing2.htm如此类推...(.htm后缀就在后面加上)
end if
Dim files'定义生成文本文件名称变量
Dim filez'定义文件路径名称变量
files=Filestart&".txt"'本文件名称
filez=folders&"\"&"files'文本文件路径
'册除文件
Dim checkfile'检查文本文件是否已经存在,是则删除
checkfile=server.mappath("CityHtml\"&Filestart&".htm")'检查htm文件是否已经存在,是则删除
if (fs.FileExists(checkfile)) then'检查htm文件是否已经存在,是则删除
Dim df'定义文件对象*删除文件使用*
Set df=fs.GetFile(checkfile)'定义要册除的文件
df.delete'册除文件
end if'判断结束
Dim ts'定义写入文件对象
set ts = fs.createtextfile(filez,true) '开启写入文件内容**我在正文只简单写入酒店名称和静态数字分页显示**
ts.write("<html><head><title>生成"&City&"城市酒店</title>"&vbcrlf)'之后就是要生成的正文件内容了跟使用Response.write
ts.write("<meta http-equiv=Content-Type content=text/html; charset=gb2312>"&vbcrlf)
ts.write("<meta name=keywords content="&city&"酒店>"&vbcrlf)
ts.write("<link href='/Style/style.css' rel='stylesheet' type='text/css'></head><body topmargin=0>"&vbcrlf)
ts.Write("<table WIDTH=760 cellspacing=0 cellpadding=0 align=center>"&vbcrlf&_
"<tr><td width='100%'>"&vbcrlf)
'分页输出开始
'数字分页程序原理在这我就不多说了,不懂的朋友可在网上搜索一下
Dim page'当前页
Dim Page2'数字分页变量
Dim s'数字分页变量
if page=1 then
ts.write (" [首 页]  [前一页] ")
else
ts.write (" <a href="&HtmlStartName&".htm"&" class=blue>[首 页]</a>  <a href="&HtmlStartName&Replace(page-1,1,"")&".htm"&" class=blue>前一页</a> ")
end if
page2=(page-(page mod 10))/10
if page2<1 then page2=0
for s=page2*10-1 to page2*10+10
if s>0 then
if s=cint(page) then
ts.write (" <font color='#000000'>["& s & "]</font>")
else
if s=1 then
ts.write (" <a href="&HtmlStartName&replace(s,1,"")&".htm"&" class=blue>["& s &"]</a>")
else
ts.write (" <a href="&HtmlStartName&s&".htm"&" class=blue>["& s &"]</a>")
end if
end if
if s=ors.pagecount then
exit for
end if
end if
next
if cint(page)=ors.pagecount then
ts.write (" [后一页]  [尾 页]")
else
ts.write (" <a href="&HtmlStartName&page+1&".htm"&" class=blue>[后一页]</a> <a href="&HtmlStartName&ors.pagecount&".htm"&" class=blue>[尾 页]</a>")
end if
ts.write("</td></tr>")
'分页输出结束
do while not ors.eof and rowcount>0 '输出酒店名称
ts.write("<tr><td width='100%'>"&oRs.Fields("Chinese_Name")&"</td></tr>"&vbcrlf)
ors.movenext
rowcount=rowcount-1'当页记录数-1 loop
ts.write("</table></body></html>"&vbcrlf)
ts.close
set ts=nothing '释放对象
Dim EditFile'定义改写文件变量
Set EditFile = fs.GetFile(filez)'设置改写文件对象
EditFile.name= left(EditFile.name,len(EditFile.name)-4)&".htm" '改写文本文件成htm
next'循环生成结束(分页生成)
set EditFile=nothing '释放对象
set fs=nothing'释放对象
if err.number<>0 then '处理生成错误
Response.write(City&"更新时发生未知错误<a href=ToHtml.asp?City="&City&"&HtmlName="&HtmlStartName&">重新更新</a>")
else
Response.Write(City&"酒店更新已完成 "&Now())
end if
%>

2006年1月11日23:34 | 评论关闭
分类: 程序代码
标签: , ,

保护你的ASP页面的两种办法 有时候你只想让人们从你的站点来访问你的某些页面, 而不允许他们从其它站点的非法链接中到达这些页面。
在你想保护的ASP页面的顶部加上这些代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<%
if left(Request.ServerVariables("HTTP_REFERER"),24)
<> "http://www.clang.cn/" and _
Request.ServerVariables("HTTP_REFERER") <> "" then
 
'We used Request.ServerVariables to get the domain name
'of the referring web page.
 
'If the domain name doesn't equal my domain name, then
'I want to send the user to some other site
Response.Redirect "http://www.clang.cn"
 
end if
%>

第二种办法是利用IP地址来判断用户访问的合法性,当你没有域名时,
用这种办法来进行在线测试是再方便不过的.
在你的ASP页面顶部加上这些代码:

1
2
3
4
5
6
7
8
9
<%
if Request.ServerVariables("REMOTE_HOST") <> "195.168.13.102" and _
Request.ServerVariables("REMOTE_HOST") <> "" then
 
'Send them away, if you like
Response.Redirect "http://www.clang.cn"
 
end if
%>

2006年1月11日23:33 | 评论关闭
分类: 程序代码
标签:

一、使用OWC
  什么是OWC?
  OWC是Office Web Compent的缩写,即Microsoft的Office Web组件,它为在Web中绘制图形提供了灵活的同时也是最基本的机制。在一个intranet环境中,如果可以假设客户机上存在特定的浏览器和一些功能强大的软件(如IE5和Office 2000),那么就有能力利用Office Web组件提供一个交互式图形开发环境。这种模式下,客户端工作站将在整个任务中分担很大的比重。
<%
Option Explicit
Class ExcelGen
Private objSpreadsheet
Private iColOffset
Private iRowOffset

Sub Class_Initialize()
Set objSpreadsheet = Server.CreateObject("OWC.Spreadsheet")
iRowOffset = 2
iColOffset = 2
End Sub

Sub Class_Terminate()
Set objSpreadsheet = Nothing "Clean up
End Sub

Public Property Let ColumnOffset(iColOff)
If iColOff > 0 then
iColOffset = iColOff
Else
iColOffset = 2
End If
End Property

Public Property Let RowOffset(iRowOff)
If iRowOff > 0 then
iRowOffset = iRowOff
Else
iRowOffset = 2
End If
End Property Sub GenerateWorksheet(objRS)
"Populates the Excel worksheet based on a Recordset"s contents
"Start by displaying the titles
If objRS.EOF then Exit Sub
Dim objField, iCol, iRow
iCol = iColOffset
iRow = iRowOffset
For Each objField in objRS.Fields
objSpreadsheet.Cells(iRow, iCol).Value = objField.Name
objSpreadsheet.Columns(iCol).AutoFitColumns
"设置Excel表里的字体
objSpreadsheet.Cells(iRow, iCol).Font.Bold = True
objSpreadsheet.Cells(iRow, iCol).Font.Italic = False
objSpreadsheet.Cells(iRow, iCol).Font.Size = 10
objSpreadsheet.Cells(iRow, iCol).Halignment = 2 "居中
iCol = iCol + 1
Next "objField
"Display all of the data
Do While Not objRS.EOF
iRow = iRow + 1
iCol = iColOffset
For Each objField in objRS.Fields
If IsNull(objField.Value) then
objSpreadsheet.Cells(iRow, iCol).Value = ""
Else
objSpreadsheet.Cells(iRow, iCol).Value = objField.Value
objSpreadsheet.Columns(iCol).AutoFitColumns
objSpreadsheet.Cells(iRow, iCol).Font.Bold = False
objSpreadsheet.Cells(iRow, iCol).Font.Italic = False
objSpreadsheet.Cells(iRow, iCol).Font.Size = 10
End If
iCol = iCol + 1
Next "objField
objRS.MoveNext
Loop
End Sub Function SaveWorksheet(strFileName)

"Save the worksheet to a specified 200512995930.htm
On Error Resume Next
Call objSpreadsheet.ActiveSheet.Export(strFileName, 0)
SaveWorksheet = (Err.Number = 0)
End Function
End Class

Dim objRS
Set objRS = Server.CreateObject("ADODB.Recordset")
objRS.Open "Select * FROM xxxx", "Provider=SQLOLEDB.1;Persist Security

Info=True;User ID=xxxx;Password=xxxx;Initial Catalog=xxxx;Data source=xxxx;"
Dim SaveName
SaveName = Request.Cookies("savename")("name")
Dim objExcel
Dim ExcelPath
ExcelPath = "Excel\" & SaveName & ".xls"
Set objExcel = New ExcelGen
objExcel.RowOffset = 1
objExcel.ColumnOffset = 1
objExcel.GenerateWorksheet(objRS)
If objExcel.SaveWorksheet(Server.MapPath(ExcelPath)) then
"Response.Write "<html><body bgcolor="gainsboro" text="#000000">已保存为Excel文件.

<a href="" & server.URLEncode(ExcelPath) & "">下载</a>"
Else
Response.Write "在保存过程中有错误!"
End If
Set objExcel = Nothing
objRS.Close
Set objRS = Nothing
%>

二、用Excel的Application组件在客户端导出到Excel或Word
  
注意:两个函数中的“data“是网页中要导出的table的 id

<input type="hidden" name="out_word" onclick="vbscript:buildDoc" value="导出到word" class="notPrint">
<input type="hidden" name="out_excel" onclick="AutomateExcel();" value="导出到excel" class="notPrint">

导出到Excel代码
<SCRIPT LANGUAGE="javascript">
<!--
function AutomateExcel()
{
// Start Excel and get Application object.
var oXL = new ActiveXObject("Excel.Application");
// Get a new workbook.
var oWB = oXL.Workbooks.Add();
var oSheet = oWB.ActiveSheet;
var table = document.all.data;
var hang = table.rows.length;
var lie = table.rows(0).cells.length;

// Add table headers going cell by cell.
for (i=0;i<hang;i++)
{
for (j=0;j<lie;j++)
{
oSheet.Cells(i+1,j+1).value = table.rows(i).cells(j).innerText;
}
}
oXL.Visible = true;
oXL.UserControl = true;
}
//-->
</SCRIPT>

导出到Word代码
<script language="vbscript">
Sub buildDoc
set table = document.all.data
row = table.rows.length
column = table.rows(1).cells.length
Set objWordDoc = CreateObject("Word.Document")
objWordDoc.Application.Documents.Add theTemplate, False
objWordDoc.Application.Visible=True
Dim theArray(20,10000)
for i=0 to row-1
for j=0 to column-1
theArray(j+1,i+1) = table.rows(i).cells(j).innerTEXT
next
next
objWordDoc.Application.ActiveDocument.Paragraphs.Add.Range.InsertBefore("综合查询结果集") //显示表格标题

objWordDoc.Application.ActiveDocument.Paragraphs.Add.Range.InsertBefore("")
Set rngPara = objWordDoc.Application.ActiveDocument.Paragraphs(1).Range
With rngPara
.Bold = True //将标题设为粗体
.ParagraphFormat.Alignment = 1 //将标题居中
.Font.Name = "隶书" //设定标题字体
.Font.Size = 18 //设定标题字体大小
End With
Set rngCurrent = objWordDoc.Application.ActiveDocument.Paragraphs(3).Range
Set tabCurrent = ObjWordDoc.Application.ActiveDocument.Tables.Add(rngCurrent,row,column)

for i = 1 to column

objWordDoc.Application.ActiveDocument.Tables(1).Rows(1).Cells(i).Range.InsertAfter theArray(i,1)
objWordDoc.Application.ActiveDocument.Tables(1).Rows(1).Cells(i).Range.ParagraphFormat.alignment=1
next
For i =1 to column
For j = 2 to row
objWordDoc.Application.ActiveDocument.Tables(1).Rows(j).Cells(i).Range.InsertAfter theArray(i,j)
objWordDoc.Application.ActiveDocument.Tables(1).Rows(j).Cells(i).Range.ParagraphFormat.alignment=1
Next
Next
End Sub
</SCRIPT>

三、直接在IE中打开,再存为EXCEL文件

  把读出的数据用<table>格式,在网页中显示出来,同时,加上下一句即可把EXCEL表在客客户端显示。
<%response.ContentType ="application/vnd.ms-excel"%>
  注意:显示的页面中,只把<table>输出,最好不要输出其他表格以外的信息。

四、导出以半角逗号隔开的csv
  用fso方法生成文本文件的方法,生成一个扩展名为csv文件。此文件,一行即为数据表的一行。生成数据表字段用半角逗号隔开。(有关fso生成文本文件的方法,在此就不做介绍了)
  CSV文件介绍 (逗号分隔文件)
  选择该项系统将创建一个可供下载的CSV 文件; CSV是最通用的一种文件格式,它可以非常容易地被导入各种PC表格及数据库中。
  请注意即使选择表格作为输出格式,仍然可以将结果下载CSV文件。在表格输出屏幕的底部,显示有 "CSV 文件"选项,点击它即可下载该文件。
  如果您把浏览器配置为将您的电子表格软件与文本(TXT)/逗号分隔文件(CSV) 相关联,当您下载该文件时,该文件将自动打开。下载下来后,如果本地已安装EXCEL,点击此文件,即可自动用EXCEL软件打开此文件。

2006年1月11日23:30 | 评论关闭
分类: 程序代码
标签: ,

本文介绍如何建立基于Web的日历,同时为不熟悉Active Server Pages(ASP)、SQL和ADO的开发者提供建立Web站点的过程介绍,也为有经验的开发者提供了Web站点可伸缩性方面的技巧。
随着网络应用的发展,基于Web的日历越来越受到人们的重视,对于显示诸如最后期限或日程安排之类的重要事件,或显示谁在什么时候休假,基于Web的日历都是有用的。本文描述了如何使用IIS和SQL Server内的ASP建立一个非常简单的基于Web的日历,并允许你与其他人共享你的日程表或管理一组人员的日历。

建立SQL服务器端
对Web日历而言,我们在服务器端仅需保存表明事件性质的一个文本字符串即可,字符串最长为100个字符。设计源代码如下:
Calendar.sql
-- 创建表
create table Schedule
(
idSchedule smallint identity primary key,
dtDate smalldatetime not null,
vcEvent varchar(100) not null
)
go
-- 存储过程
create procedure GetSchedule (@nMonth tinyint, @nYear smallint)
as
select idSchedule, convert(varchar, datepart(dd, dtDate)) "nDay", vcEvent
from Schedule
where datepart(yy, dtDate) = @nYear and datepart(mm, dtDate) = @nMonth
order by datepart(dd, dtDate)
go
create procedure AddEvent (@vcDate varchar(20), @vcEvent varchar(100))
as
insert Schedule
select @vcDate, @vcEvent
go
create procedure DeleteEvent (@idSchedule smallint)
as
delete Schedule where idSchedule = @idSchedule
go

设计ASP客户端
下图是Web日历的主要用户界面,用户可以看到哪些事件是已安排的。另外,使用底部的链接可以在日历中按月前后翻动。
ASP的实现代码如下:
header.asp
<@ LANGUAGE="VBSCRIPT"
ENABLESESSIONSTATE = False %>
<%
" 目的:表头包括用来启动所有页的文件
" 还包括全局函数
Option Explicit
Response.Buffer = True
Response.Expires = 0
sub Doheader(strTitle)
%>
<html>
   <head>
   <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb2312">
   <title>Event Calendar - <%= strTitle %></title>
   </head>
   <body bgcolor="white" link="blue" alink="blue" vlink="blue">
   <basefont face="Verdana, Arial">
   <center><h1>Event Calendar</h1>
   <h3><%= strTitle %></h3>
<%
end sub
function GetDataConnection()
dim oConn, strConn
Set oConn = Server.CreateObject("ADODB.Connection")
strConn = "Provider=SQLOLEDB; Data Source=adspm; Initial Catalog=TeamWeb; "
strConn = strConn && "User Id=TeamWeb; Password=x"
oConn.Open strConn
set GetDataConnection = oConn
end function
%>

利用ADO,我们可以很容易地将 ASP 页面与 SQL 数据库相连接。首先我们要创建一个到数据库的连接。为了获得记录集,我们要调用 Connection 对象的 Execute 方法,将希望执行的命令的文本字符串传入,一旦有了记录集,就可以在其中循环。header.asp 包含获得数据连接的函数,这意味着如果数据源有变化,我们只有一个位置需要编辑连接信息(服务器、用户和口令)。请注意,作为结果,我们必须在函数的末尾使用 set 命令传出新连接。
优化性能
ASP使建立Web页面变得十分容易,但如果想建立一个可以适应大量用户的站点,你就需要仔细考虑编码。下面笔者将为读者介绍增强基于Web日历可伸缩性的几种方法,这些方法也可用于提高任何基于ASP的Web站点的性能。
1.SQL优化
提高站点性能的一个简单方法是给 Schedule表的date字段添加一个索引,这样,它会在给定日期之间进行查找,因而将加快 GetEvents的存储过程。
对于小型站点,我们可以将 SQL 与 IIS 安装在同一服务器上,一旦站点访问量开始增长,我们可将 SQL 移动到其自身的服务器上,当访问量进一步增长时,我们可以添加均指向同一 SQL 服务器的多个 IIS 服务器。如果 SQL 服务器的通信量过度增长时,还可以将数据分割到不同的服务器上,我们可以将奇数月份分配到一台服务器,将偶数月份分配到另一台服务器上,当然,这需要修改 header.asp 中的 GetDataConnection,以便它为你提供基于此月份的正确连接。
2.ASP 优化
ASP 解释的主要优化方法将是利用高速缓存页面,以便无需每次读取都对它们进行解释。做到这一点的最简单的方法是借助 ASP Application 对象。要做到这一点,你只需将HTML保存到含有月份和年份名称的应用程序变量(例如 Calendar07-2000)中。然后,当显示 Event Calendar 页时,你首先检查一下看看日历是否已经保存在应用程序变量中,如果是,则只需检索它,这种方式会大大加快网站的查询过程。下面的代码显示了这个工作过程:
<<do header>>
ShowCalendar(nMonth, nYear)
<<do Footer>>
sub ShowCalendar(nMonth, nYear)
if Application("Calendar" && nMonth && "-" && nYear) = "" then
<<Build Calendar>>
Application("Calendar" && nMonth && "-" && nYear) = <<Calendar>>
End if
Response.Write Application("Calendar" && nMonth && "-" && nYear)
End sub
当然,在 Events.asp 页更改某个月份的事件时,你需要清空该月份的应用程序变量,以便反映这些事件的更改状况。
安全性
有几种方法可实现此站点上的安全性。对于 Intranet 站点,基于Windows NT的验证是最容易设置的,其原因是你的用户将很可能已经登录到网络。你可让所有用户查看 Event Calendar 页,但是只有管理员能访问Add/Remove Events 页。
如果关心审计,你可以容易地修改 AddEvent 和 DeleteEvent 过程将其信息保存到审计表中。你还可以确保 IIS 为每个页命中的查询字符串和用户进行日志记录,然后逐个分析日志以确定何人于何时做了什么,这是非常简单的。

2006年1月11日23:29 | 评论关闭
分类: 程序代码
标签: , ,

(因为我还没完成我的组件,不保证文章中的代码的正确性.)
上传多文件
(Sander Duivestein)
介绍
这是我写的一个上传文件的activex的组件.这个组件是使用winsocket 控件调用FTP提交文件.它仅仅工作在Ie3.02或更高的版本,但有些客户端使用Netscape,因此不得不找另外的解决方案.但我搜索 Internet 和若干新闻组时,发现不止我一个有这样的要求.
在1999.3.11, 看到啦Doug Dean的一篇15Seconds的文章(关于用VB asp 组件上传文件)给我啦一个很好的提示.

Doug Dean的组件简单并且易用.但他说,然而,多元件的上传问题没解决?因而仍然有一些工作要完成.

在我开始做自己的组件以前,我想知道其他类似控件提供什么样的功能.因此我看啦另外3个著名的组件:
the upload component of Software Artisans, the upload component of ASPUpload,
and the Microsoft Posting Acceptor.

通过比较这些组件我觉的我的组件应该满足下列要求:

提交文件的HTML表单对asp 组件应该是一黑盒子.也就是说组件能接受各种表单元件并能得到表单元件的名字和值.
它应能提供一个上传路径,并且限制大小.
组件应该能处理多个的文件.
组件应该有一错误处理程序.
组件应该性能很好.
组件应该能在NC中象IE一样工作.
保存文件进入数据库.
仅允许某组用能上载文件.
这些对我来说是有相当的挑战.
解决问题
首先我要创建一HTML文件,它包含两个元件:一简单的文本框,一文件框.这里给出下列代码:
1:Upload.htm

1
2
3
4
5
6
7
8
9
10
11
<html>
<head><title>Upload</title></head>
<body>
<form NAME="frmUpload" METHOD="Post" ENCTYPE="multipart/form-data" ACTION="Upload.asp"> <table>
<tr><td>Author</td><td><input TYPE="text" NAME="txtAuthor"></td></tr>
<tr><td>File</td><td><input TYPE="file" NAME="txtFileName"></td></tr>
<tr><td COLSPAN="2" ALIGN="right"><input TYPE="Submit" VALUE="Upload"></td></tr>
</table>
</form>
</body>
</html>

使用ENCTYPE="multipart/form-data" 使表单能够提交一文件.我们也需要一文件接收文件.
2:Upload.asp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<%@ Language=VBScript %>
 
<%
Option explicit
Response.Buffer = True
On Error Resume Next
 
If Request.ServerVariables("REQUEST_METHOD") = "POST" Then
 
  Dim objUpload
  Dim lngMaxFileBytes
  Dim strUploadPath
  Dim varResult
 
  lngMaxFileBytes = 10000
  strUploadPath = "c:\inetpub\wwwroot\upload\"
 
  Set objUpload = Server.CreateObject("pjUploadFile.clsUpload")
  If Err.Number <> 0 Then
    Response.Write "The component wasn't registered"
  Else
    varResult = objUpload.DoUpload (lngMaxFileBytes, strUploadPath)
    Set objUpload = Nothing
Dim i
    For i = 0 to UBound(varResult,1)
        Response.Write varResult(i,0) & " : " & varResult(i,1) & "<br />"
    Next
 
  End If
 
End If
%>

在这里设置下面两个变量:
lngMaxFileBytes - 文件最大字节数, 和 strUploadPath -文件上传位置.我也增加了错误处理程序检查是否装入组件在网服务器上适当注册.这是我做的处理唯一的一个错误.如果任何另外的错误发生,可以再加入处理它.最后,再声明varReturn.这变量用来接受组件的返回值.这返回值应该包含所有的表单元件名字和他们的值.你能看见FOR NEXT loop中的程序,这返回值必须是一数组.

这是比较容易的部分.现在我们必须创造一ActiveX 组件,用来处理提交的表单.
打开vb6,选择一ActiveX 项目 (参阅步骤1:)

步骤1:
创造一ActiveX dll 项目

首先,先添加一个引用,在菜单条上选定添加引用项,选中
Active Server Pages Object library.(参阅步骤2).

步骤2:
工程引用

通过这个库我们能使用asp的request的请求对象.为保证能使用,要用如下代码:

1
2
3
4
5
6
7
8
9
10
11
Option Explicit
 
Private MyScriptingContext As ScriptingContext
Private MyRequest As Request
Private MyResponse As Request
 
Public Sub OnStartPage(PassedScriptingContext As ScriptingContext)
  Set MyScriptingContext = PassedScriptingContext
  Set MyRequest = MyScriptingContext.Request
  Set MyResponse = MySriptingContext.Response
End Sub

为什么我们需要ASP库?通过request对象我们能得到由upload.htm传来的http数据流.在那里为什么有一个 "但是"?当我们尝试读 表单字段名字和相对的值,例如,Request.Form("txtTitle"), 但我们就不能读出余下的发送给我们的原始数据.因此我们使用Request.TotalBytes 和Request.BinaryRead 读取发送的数据.

下面是我从Doug Dean得到的代码:

1
2
3
4
5
6
7
8
9
10
11
  '~~~~~ VARIABLES ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  Dim varByteCount
  Dim binArray() As Byte
 
  '~~~~~ BYTE COUNT OF RAW FORM DATA ~~~~~~~~~~~~
  varByteCount = MyRequest.TotalBytes
  '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
  '~~~~~ PLACE RAW DATA INTO BYTE ARRAY ~~~~~~~~~
  ReDim binArray(varByteCount)
  binArray = MyRequest.BinaryRead(varByteCount)

Doug Dean将数据放入一个二进制的数组,它当然工作的很好.但是当我到想得到表单的名字和值时,我遇见一个问题,例如,我们想要提交包含5个文本框和一个文件框的HTML表单.提交的文件有100K 的大小 (=102,400字节)的限制.现在我们收到102,400字节.所有的这些字节将进一个二进制的数组.当我们想要分开时,表单元件名,他们的值,我们通过全部数组的循环.我们必须循环6次,因为我们提交了6个表单元件.它工作的很好,但是性能下降.

因此我们需要找到另一种方法从http header中提取数据.当浏览MSDN 库,我发现答案.我们必须使用Unicode!!!与Unicode 我们能把数据放进一个vb的variant,它包含字符串.

因此我的代码看起来像这:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Option Explicit
 
Private MyScriptingContext As ScriptingContext
Private MyRequest As Request
Private MyResponse As Request
 
Public Sub OnStartPage(PassedScriptingContext As ScriptingContext)
  Set MyScriptingContext = PassedScriptingContext
  Set MyRequest = MyScriptingContext.Request
  Set MyResponse = MySriptingContext.Response
End Sub
 
Public Function DoUpload (ByVal lngMaxFileBytes As Long, _
  ByVal strUploadPath As String) As Variant
 
Dim varByteCount As Variant
Dim varHTTPHeader As Variant
 
'Count total bytes in HTTP-header
varByteCount = MyRequest.TotalBytes
 
'Conversion of bytes to Unicode
varHTTPHeader = StrConv(MyRequest.BinaryRead(varByteCount), vbUnicode)
 
'Write HTTPHeader
MyResponse.Write varHTTPHeader
 
Function End

现在让我们测试这些代码的.为这测试我使用用了一个.txt 文件 "warp11.txt" 那包含的下面一句话:

"Warp11 builds state-of-the-art applications at the speed of light."

我们提交的表单看起来像这:

这是上传组件写入我们的浏览器的内容:

-----------------------------7cf28c330254 Content-Disposition: form-data;
name="txtAuthor" Sander Duivestein -----------------------------7cf28c330254 Content-
Disposition: form-data; name="txtFileName"; 2005102990100.htm="C:\Download\Warp11.txt"
Content-Type: text/plain Warp11 builds state-of-the-art applications at the speed of light.
-----------------------------7cf28c330254

正如你所见的,这仅仅是一字符串,我们能识别这个字符串.当一HTML form通过multipart/form-data MME提交,表单数据被分成几部分.表单数据的每部分是由分界符分开:"-----------------------------7cf28c330254".
通过这个分界符我们能有一串不同的字符串.在上传应用程序中,我们使用这个分界符划分表单数据,因此我们把这界线字符串放在变量varDelimeter.
我们增加下列代码执行这个功能:

1
2
Dim varDelimeter As Variant
varDelimeter = LeftB(varHTTPHeader, 76)

首先,我们想要知道的上传了多少个表单元件.因此我们必须做一计数器:

1
2
3
4
Dim intFormFieldCounter As Integer
 
'Count formfields
intFormFieldCounter = Len(varHTTPHeader) - Len(Replace(varHTTPHeader, "; name=", Mid("; name=", 2)))

当我们知道表单元件的数目时,我们能通过对varHTTPHeader 进行循环查找,然后我们能分别得到列表单元件的名字和他们的值.当我们查找某一表单域名称和值时,我们想要这些保存这些.存储这些值,我们简单地创造一个两维的数组:

1
2
3
4
Dim intFormFieldCounter As Integer
 
'Count formfields
intFormFieldCounter = Len(varHTTPHeader) - Len(Replace(varHTTPHeader, "; name=", Mid("; name=", 2)))

其次,我们想要返回这些值到upload.asp 文件.这就是为什么我们使用数组变体型的类型.Variant是ASP能理解的唯一的数组类型.现在列出表单元件和他们的名字.
首先,我们创造一循环:

1
2
'Begin parsing formfield names and values
For i = 0 To intFormFieldCounter - 1

然后我们决定第一表单元件将开始的位置:

1
2
'Determine where FormFieldName starts
lngFormFieldNameStart = InStrB(lngFormFieldNameStart + 1, varHTTPHeader, "; name=" & Chr(34))

我们现在找到表单元件结束的地方:

1
2
3
4
'Determine where FormFieldName ends
lngFormFieldNameEnd = InStrB(lngFormFieldNameStart + _
Len(StrConv("; name=" & Chr(34), vbUnicode)), varHTTPHeader, Chr(34)) _
+ Len(StrConv(Chr(34), vbUnicode))

如果我们有表单元件开始和结束的位置,我们能过滤出表单元件的名称:

1
2
3
4
5
6
7
8
'Filter FormFieldName
strFormFieldName = MidB(varHTTPHeader, lngFormFieldNameStart, lngFormFieldNameEnd - lngFormFieldNameStart)
 
'Remove "; name=" from string
strFormFieldName = Replace(strFormFieldName, "; name=", vbNullString)
 
'remove quotes from string
strFormFieldName = Replace(strFormFieldName, Chr(34), vbNullString)

在表单元件名字后面有一个";",通过它,我们就能找到它的类型.如果是这样,我们就能处理文件,不同的是我们正在处理一文本字段.因此建立一个IF THEN判断.

1
2
3
4
5
6
'Check for file
If MidB(varHTTPHeader, lngFormFieldNameEnd, 2) = ";" Then
'当看我们的HEADER, 我们能发现正准备进行的循环的条件是False.这意味着我们正在处理文本字段.现在就能找到我们的表单元件对应的值了.首先我们必须找到表单元件的值开始的地方:
Else
'Determine where formfieldvalue starts
lngFormFieldValueStart = lngFormFieldNameEnd

第二,和以前一样,我们必须发现我们的表单域值结束的地方:

1
2
'Determine where formfieldvalue ends
lngFormFieldValueEnd = InStrB(lngFormFieldValueStart, varHTTPHeader, varDelimeter)

2006年1月10日19:07 | 评论关闭
分类: 程序代码
标签:

在后台处理数据时,前台页面同时计数显示Proess Bar
使用了layer来显示
用法:
1。引用

<script language="javascript" src="ShowProcessBar.js"></script>

2。在提交Button或<a>或<span> 加扩展属性
IsShowProcessBar="True"
文件ShowProcessBar.js如下

查看代码 JAVASCRIPT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
AddProcessbar();
var bwidth=0;
var swidth = document.all.waiting.clientWidth;
 
function CheckIsProcessBar(obj)
{
if (obj.IsShowProcessBar=="True")
{
return false;
}
else
{
return true;
}
}
 
function CheckClick(e)
{
if (e == 1)
{
if (bwidth<swidth*0.98){
bwidth += (swidth - bwidth) * 0.025;
if (document.all)document.sbar.width = bwidth;
else document.rating.clip.width = bwidth;
setTimeout('CheckClick(1);',150);
 
}
}
else
{
if(document.all)
{
if(document.all.waiting.style.visibility == 'visible')
{document.all.waiting.style.visibility = 'hidden';
bwidth = 1;}
whichIt = event.srcElement;
 
while (CheckIsProcessBar(whichIt))
{
whichIt = whichIt.parentElement;
if (whichIt == null)return true;
}
 
 
document.all.waiting.style.pixelTop = (document.body.offsetHeight - document.all.waiting.clientHeight) / 2 + document.body.scrollTop;
document.all.waiting.style.pixelLeft = (document.body.offsetWidth - document.all.waiting.clientWidth) / 2 + document.body.scrollLeft;
document.all.waiting.style.visibility = 'visible';
if(!bwidth)CheckClick(1);
bwidth = 1;
 
}
 
else
{
 
if(document.waiting.visibility == 'show')
{document.waiting.visibility = 'hide';
document.rating.visibility = 'hide';
bwidth = 1;}
if(e.target.href.toString() != '')
{
document.waiting.top = (window.innerHeight - document.waiting.clip.height) / 2 + self.pageYOffset;
document.waiting.left = (window.innerWidth - document.waiting.clip.width) / 2 + self.pageXOffset;
document.waiting.visibility = 'show';
document.rating.top = (window.innerHeight - document.waiting.clip.height) / 2 + self.pageYOffset+document.waiting.clip.height-10;
document.rating.left = (window.innerWidth - document.waiting.clip.width) / 2 + self.pageXOffset;
document.rating.visibility = 'show';
if(!bwidth)CheckClick(1);
bwidth = 1;
}
}
return true;
}
}
 
function AddProcessbar()
{
 
var Str=""
Str+= "<div id=waiting style=position:absolute;top:50px;left:100px;z-index:1;visibility:hidden >";
Str+= "<layer name=waiting visibility=visible zIndex=2 >"
Str+= "<table border=2 cellspacing=1 cellpadding=0 bordercolorlight=#FFFFFF bordercolordark=#C0C0C0 bgcolor=#E0E0E0>"
Str+= " <tr>"
Str+= " <td bgcolor=#E0E0E0 height=30px width=300px align=center>"
Str+= " <font color=black>系统正在处理中...</font>"
Str+= " </td>"
Str+= " </tr>"
Str+= " <tr>"
Str+= " <td bgcolor=#E0E0E0>"
Str+= " <img width=1 height=10 name=sbar style=background-color:#6699cc>"
Str+= " </td>"
Str+= " </tr>"
Str+= "</table> "
Str+= "</layer>"
Str+= "</div>"
document.write(Str)
 
if(document.all)document.onclick = CheckClick;
}

测试文件TestShowBar.HTML

查看代码 HTML4STRICT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<html>
<head>
<script language="javascript" src="ShowProcessBar.js"></script>
</head>
<body>
<a href="error.asp" IsShowProcessBar="True">A Href</a>
<br />
<br />
<span onclick="location.href='error.asp'" style="cursor:hand" IsShowProcessBar="True"><font color=blue>Span</font></span>
<br />
<form action="error.asp">
<input type=Submit value="Submit">
<input type=button value="normal button" IsShowProcessBar="True">
</form>
<p IsShowProcessBar="True">AAAAAAAAAAAAA</p>
</body>
</html>

2006年1月10日19:04 | 评论关闭
分类: 程序代码
标签:

作为一个ASP程序员,你不会怀疑提高Web应用程序性能的重要性。为了让程序运行的更快一些,你可能一直忙于优化数据库或COM组件。如果这些你都做过了,你想到过靠加快最终生成HTML代码在浏览器中的显示速度来提高性能吗?对于最终用户来说,如果页面能显示的更快,你就能赢得更多的赞誉。
  提高HTML在浏览器中显示的速度可以通过一些鲜为人知的技术来实现。

  1.使用表格嵌套?

  在页面中建立复杂的结构,一般通过在页面中放置HTML表格来实现。如果要建立一个这样的页面:这个页面有一个顶部导航栏一个左边导航栏,一个右边的内容区。可以用一个两行两列的大表格来建立它。第一行中,合并两个列,然后插入一个顶部导航栏。第二行左边的列中,插入一个表格来显示导航按钮。右边的栏中,放置一个表格来实际内容。(见图一)这样嵌套的表格生成的代码是这样的:

1
2
3
4
5
6
7
8
9
 <table BORDER="0">
  <tr>
   <td COLSPAN="2"><!-- content for top nav bar --></td>
  </tr>
  <tr>
   <td ALIGN="LEFT" VALIGN="TOP"><!-- content for left nav bar --></td>
   <td ALIGN="LEFT" VALIGN="TOP"><!-- content for body of page --></td>
  </tr>
 </table>

  但是,实际上,浏览器找到

1
<table>

标签的时候并不是立刻把页面显示到屏幕上,除非它找到相应的结束标签

1
</table>

所以,如果你的整个页面在一个表格里的话,在收到最后一个

1
</table>

之前,什么也不会显示出来,这样,这个页面将在整个文件全部下载以后才能被用户所看到。在页面数据量比较大的时候(比如搜索引擎的搜索结果),这个特性会导致暂时的停顿。为了防止出现这种情况,可以在制作的时候把页面分成许多小的表格。在每一个

1
<table>

到相应的

1
</table>

这一部分HTML代码下载完的时候,浏览器就会把它显示出来。在访问者看来页面是渐渐的,一部分一部分,越来越多的出现在屏幕上的。感觉上,这样的页面显示速度比下载完整个文件再一次显示出来更快。

  按照这个原则来研究前面的例子,应该把页面中整个的大表分成三个单独的表。用第一个表显示顶部的导航栏,调节它的宽度,使它足够容纳所有的内容,在一个

1
<table></table>

代码段中完成它。页面下半部分,左边第二个表排成一列。使用第三个表容纳实际内容。因为每一个部分都是一个完整的表格,所以,每一部分代码下载后都会立刻被显示出来。这样,顶部和左边的导航栏将比页面的其它部分更显显示出来。用户会在这个时候想象页面开始下载,很快就能显示在屏幕上。这样比起让用户在较长时间内一直面对一个空白屏幕要好得多。

  修改过的代码是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 <table BORDER="0" WIDTH="100%">
  <tr>
   <td ALIGN="CENTER" VALIGN="TOP"><!-- content for top nav bar --></td>
  </tr>
 </table>
 <table BORDER="0" ALIGN="LEFT">
  <tr>
   <td ALIGN="LEFT" VALIGN="TOP"><!-- content for left nav bar --></td>
  </tr>
 </table>
 <table BORDER="0">
  <tr>
   <td ALIGN="LEFT" VALIGN="TOP"><!-- content for page body --></td>
  </tr>
 </table>

  2.也要记住关闭其他的标记

  在上面的例子中,我们仅仅早一些关闭

1
<table>

标记,就能让页面在浏览器显示的更快些。以此类推,还有一些类似的标记也有同样的特性。

  比如产生列表框和组合框

1
<option>

标记和产生列表项的

1
<li>

标记。通常,ASP程序员存取数据库,并把数据送入通过

1
<option>

建立的列表框或组合框中,这时候在代码中写上一个关闭

1
<option>

标记,这样简单的改变也能使页面在浏览器中显示的更快。

  不要使用这样的代码:

1
2
3
4
5
6
 Do while not objRS.EOF
  strOptionList = strOptionList & "<option VALUE=""" & objRS("ID") &_""">"& _objRS("ProductName")
  objRS.MoveNext
 Loop
 
 Response.Write "<select SIZE=""1"">" & strOptionList & "</select>"

  要使用这样的代码:

1
2
3
4
5
6
  Do while not objRS.EOF
   strOptionList = strOptionList & "<option VALUE=""" & objRS("ID") & _ """>" & objRS("ProductName") & "</option>"
   objRS.MoveNext
  Loop
 
  Response.Write "<select SIZE=""1"">" & strOptionList & "</select>"

  不要使用这样的代码:

1
2
3
4
5
  <ul>
  <li>Apples
  <li>Oranges
  <li>Bananas
  </ul>

  使用这样的代码:

1
2
3
4
5
  <ul>
   <li>Apples</li>
   <li>Oranges</li>
   <li>Bananas</li>
  </ul>

  现在看看,你的页面在浏览器中是不是显示的快了?

  请不要轻视这些改变对提高ASP程序性能的重要性。也许,在你能找到的“技巧与提示”一类的书或在线资料中,很少提到过通过优化HTML代码来使你的程序运行的更快。但是,在实际中应用这些技术,确实能使程序性能得到很大的提高。

2006年1月10日18:59 | 评论关闭
分类: 程序代码
标签: