2009年3月28日星期六

学习asp入门个人经验-asp入门教程

一.VBScript语法简介
其实其他语言的语言基本理论思想是相通的,只是写法不一样,只要我们编程爱好者们把一种语言学精通,其他语言保证一星期学会,两星期精通。
VBScript语句是一种基于VB的一种脚本语言,主要用于WEB服务器端的程序开发,我们在
这里只介绍一些简单的语句,主要是操作数据库的几种常见的语句

<1>.vbscript的标识
<%
语句
……
%>
<2>定义变量dim语句
<%
dim a,b
a=10
b=”ok!”
%>
编程爱好者注意:注意:定义的变量可以是数值型,也可以是字符或者其他类型的
<3>简单的控制流程语句
1. If 条件1 then
语句1
elseif 条件2 then
语句2
else
语句3
endif
2.while 条件
语句
wend
3.for count=1 to n step m
语句1
exit for
语句2
next
二.ASP数据库简单操作教程
<1>.数据库连接(用来单独编制连接文件conn.asp)
<%
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("\bbs\db1\user.mdb")
%>
(用来连接bbs\db1\目录下的user.mdb数据库)
<2>显示数据库记录
编程原理:将数据库中的记录一一显示到客户端浏览器,依次读出数据库中的每一条记录
如果是从头到尾:用循环并判断指针是否到末 使用: not rs.eof
如果是从尾到头:用循环并判断指针是否到开始 使用:not rs.bof

(包含conn.asp用来打开bbs\db1\目录下的user.mdb数据库)
<%
set rs=server.CreateObject("adodb.recordset") (建立recordset对象)
sqlstr="select * from message" ---->(message为数据库中的一个数据表,即你要显示的数据所存放的数据表)
rs.open sqlstr,conn,1,3 ---->(表示打开数据库的方式)
rs.movefirst ---->(将指针移到第一条记录)
while not rs.eof ---->(判断指针是否到末尾)
response.write(rs("name")) ---->(显示数据表message中的name字段)
rs.movenext ---->(将指针移动到下一条记录)
wend ---->(循环结束)
------------------------------------------------------
rs.close
conn.close 这几句是用来关闭数据库
set rs=nothing
set conn=nothing
-------------------------------------------------------
%>
其中response对象是服务器向客户端浏览器发送的信息
<3>增加数据库记录
增加数据库记录用到rs.addnew,rs.update两个函数
(包含conn.asp用来打开bbs\db1\目录下的user.mdb数据库)
<%
set rs=server.CreateObject("adodb.recordset") (建立recordset对象)
sqlstr="select * from message" ---->(message为数据库中的一个数据表,即你要显示的数据所存放的数据表)
rs.open sqlstr,conn,1,3 ---->(表示打开数据库的方式)
rs.addnew 新增加一条记录
rs("name")="xx" 将xx的值传给name字段
rs.update 刷新数据库
------------------------------------------------------
rs.close
conn.close 这几句是用来关闭数据库
set rs=nothing
set conn=nothing
-------------------------------------------------------

%>
<4>删除一条记录
删除数据库记录主要用到rs.delete,rs.update
(包含conn.asp用来打开bbs\db1\目录下的user.mdb数据库)
<%
dim name
name="xx"
set rs=server.CreateObject("adodb.recordset") (建立recordset对象)
sqlstr="select * from message" ---->(message为数据库中的一个数据表,即你要显示的数据所存放的数据表)
rs.open sqlstr,conn,1,3 ---->(表示打开数据库的方式)
-------------------------------------------------------
while not rs.eof
if rs.("name")=name then
rs.delete
rs.update 查询数据表中的name字段的值是否等于变量name的值"xx",如果符合就执行删除,
else 否则继续查询,直到指针到末尾为止
rs.movenext
end if
wend
------------------------------------------------------
------------------------------------------------------
rs.close
conn.close 这几句是用来关闭数据库
set rs=nothing
set conn=nothing
-------------------------------------------------------
%>
<5>关于数据库的查询
(a) 查询字段为字符型
<%
dim user,pass,qq,mail,message
user=request.Form("user")
pass=request.Form("pass")
qq=request.Form("qq")
mail=request.Form("mail")
message=request.Form("message")
if trim(user)&"x"="x" or trim(pass)&"x"="x" then (检测user值和pass值是否为空,可以检测到空格)
response.write("注册信息不能为空")
else
set rs=server.CreateObject("adodb.recordset")
sqlstr="select * from user where user='"&user&"'" (查询user数据表中的user字段其中user字段为字符型)
rs.open sqlstr,conn,1,3
if rs.eof then
rs.addnew
rs("user")=user
rs("pass")=pass
rs("qq")=qq
rs("mail")=mail
rs("message")=message
rs.update
rs.close
conn.close
set rs=nothing
set conn=nothing
response.write("注册成功")
end if
rs.close
conn.close
set rs=nothing
set conn=nothing
response.write("注册重名")
%>
(b)查询字段为数字型
<%
dim num
num=request.Form("num")
set rs=server.CreateObject("adodb.recordset")
sqlstr="select * from message where id="&num (查询message数据表中id字段的值是否与num相等,其中id为数字型)
rs.open sqlstr,conn,1,3
if not rs.eof then
rs.delete
rs.update
rs.close
conn.close
set rs=nothing
set conn=nothing
response.write("删除成功")
end if
rs.close
conn.close
set rs=nothing
set conn=nothing
response.write("删除失败")
%>
<6>几个简单的asp对象的讲解
response对象:服务器端向客户端发送的信息对象,包括直接发送信息给浏览器,重新定向URL,或设置cookie值
request对象:客户端向服务器提出的请求
session对象:作为一个全局变量,在整个站点都生效
server对象:提供对服务器上方法和属性的访问
(a) response对象的一般使用方法
比如:
<%
response
.write("hello, welcome to asp!")
%>
在客户端浏览器就会看到 hello, welcome to asp! 这一段文字
<%
response.Redirect("www.sohu.com")
%>
如果执行这一段,则浏览器就会自动连接到 “搜狐” 的网址
关于response对象的用法还有很多,大家可以研究研究
request对象的一般使用方法
比如客户端向服务器提出的请求就是通过request对象来传递的
列如 :你在申请邮箱的所填写的个人信息就是通过该对象来将
你所填写的信息传递给服务器的
比如:这是一段表单的代码,这是提供给客户填写信息的,填写完了按
“提交”传递给request.asp文件处理后再存入服务器数据库
《form name="form1" method="post" action="request.asp">










《/form》
那么request.asp该如何将其中的信息读入,在写入数据库,在这里就要用到
request对象了,下面我们就来分析request.asp的写法
<%
dim name,password (定义user和password两个变量)
name=request.form(“user”) (将表单中的user信息传给变量name)
password=request.form(“pass”) (将表单中的pass信息传给变量password)
%>
通过以上的几句代码我们就将表单中的数据读进来了,接下来我们要做的就是将
信息写入数据库了,写入数据库的方法上面都介绍了,学习asp入门个人经验-asp入门教程

2009年3月27日星期五

asp函数生成验证码字母---编程爱好者

asp函数生成验证码字母编程爱好者
现在有的网站在注册时都需要填写验证码,有数字的有字母的,还有中文文字的,现在我们通过一个网站叫编程爱好者源代码,如下:
《%
function getrndstr(howlen)
server.ScriptTimeout = 5
dim strlen,strout
strlen=0
strout=""
do while strlen Randomize
rndid=int(rnd * 74)+48
if (rndid>=49 and rndid<=57) or (rndid>=97 and rndid<=122) or (rndid>=65 and rndid<=90) then
strout=strout & chr(rndid)
strlen=strlen+1
end if
loop
getrndstr=strout
end function
%》
在getrndstr(howlen)中howlen是数字,表示长度,可以生成任意唱的字母,本代码来自编程爱好者
编程爱好者是一个共享编程技术的地方,欢迎大家留言

2009年3月24日星期二

使用脚本添加删除一行--javascript操作Dom,删除一行

javascript操作Dom,删除添加一行,这个基本上需要精通javascrit语言,来操作Dom,,本人利用业余时间写个一个定位上出表格的一行。
代码如下:
《SCRIPT》
function wyj_delete (td){
//wyj自定义删除一行
objTable= document.getElementById("tblGrid");
var row=document.getElementById(td);
var index=row.rowIndex;
objTable.deleteRow(index);

}
《/Script》


javascript取出表的名字和行的名字,然后用属性deleteRow,就可以删除了,javascript操作Dom,删除添加一行,非常简单。
希望以上代码对大家有帮助,有不懂的欢迎来问,或留言,我会及时回复的

2009年3月23日星期一

如何使用sql语句来创建数据表-----sql语句创建数据表

如何使用sql语句来创建sql2000或者sql2005数据库软件的数据表呢,这个对于初级编程爱好者人员来说是有难度的,要想成为真正的程序员必须要达到这一步,因为所有程序百分之九十九都会用到数据库,所以学会sql语句非常重要,首先我们要先学习一下如何用sql语句建表:

创建工作人员日志表结构
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[tabworklogin]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[tabworklogin]
GO

CREATE TABLE [dbo].[tabworklogin] (
[id] [int] IDENTITY (1, 1) NOT NULL primary key , 设置关键主键
[worktype] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[worktext] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[answers] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[worker] [nvarchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
[workdate] [datetime] not NULL default(getdate()), 默认系统时间
[xianshi] [int] NULL ,

) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
这是一个创建数据表的语句,非常实用,
主要是用到了CREATE TABLE 语句,
如何添加默认值呢?
添加默认值
ALTER TABLE [dbo].[Taborders]
ADD DEFAULT 0 FOR [Issee]
GO
修改主健
ALTER TABLE [dbo].[Taborders]
ADD CONSTRAINT [Taborders_pk] PRIMARY KEY ([Id])
GO

修改字段类型
alter table tb alter column name nvarchar(200)
go

'修改默认时间
select * from tabcustomer
ALTER TABLE [dbo].[tabcustomer]
ADD DEFAULT gettime() FOR [regtime]
GO

2009年3月11日星期三

ASP生成BMP图片验证码:数字相加求和

目前网络上有许多图片验证码形式,那些没有生成图片的验证码的抗破解防御能力简直不堪一击;有人直接在网页源码里显示出具体的数字,然后要求访问者输入一个相加后的和;如3+5=多少,这样的验证码新意倒有一些,不过可惜,根本没有起到保护的作用。

flymorn改进一下以上的新意,直接把3+6=多少的形式采用asp程序生成Bmp图片格式,并且把数字相加后的和存进session里,加大破解的门槛;没有一些图形图像学知识的人是无法破解的。代码如下:



<%
Response.Buffer = True
Response.ExpiresAbsolute = Now() - 1
Response.Expires = 0
Response.cachecontrol = "no-cache"

Response.ContentType = "Image/Bmp"

Call Com_CreatValidCode()

Sub Com_CreatValidCode()

Randomize

Dim i, ii, iii

Const cAmount = 10 '数值个数

Const cCode = "0123456789" '数值范围

Dim vColorData(2)

vColorData(0) = "" '黑色点要转为彩色点,暂时不定义

vColorData(1) = ChrB(255) & ChrB(255) & ChrB(255) '白点

Dim vCode(4), vCodes '产生一组任意数

For i = 0 To 3

vCode(i) = Int(Rnd * cAmount) '数组等于总数*随机数

if i=1 then vCode(i)="11" '第二位为+

if i=3 then vCode(i)="10" '第四位为=

vCodes=vCodes&Mid(cCode,vCode(i)+1,1) '串等于串加上后续值

Next

session("checkcode")=int(Mid(vCodes,1,1)) + int(Mid(vCodes,2,1)) '计算相加和值并赋值给session

Dim vNumberData(36)

vNumberData(0) =

"1110000111110111101111011110111101111011110111101111011110111101111011110111101111011110111110000111"

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) =

"1111111111111111111111111111111000000001111111111111111111111000000001111111111111111111111111111111"
'表示+
vNumberData(11) =

"1111111111111100111111110011111111001111100000000110000000011111001111111100111111110011111111111111"


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 Mid(vNumberData(vCode(ii)), i * 10 + iii , 1) ="0" then '产生彩色点,减去一个固定值,可使颜色偏深

dim a,b,c

a=abs(Rnd * 256-60)

b=abs(Rnd * 256-128)

c=abs(Rnd * 256-60)

vColorData(0) = ChrB(a) & ChrB(b) & ChrB(c)

Response.BinaryWrite vColorData(Mid(vNumberData(vCode(ii)), i * 10 + iii , 1))

else

dim d,e,f '产生彩色背景,颜色偏浅,也可以随机生成噪点做背景

d=abs(Rnd * 255)

e=abs(Rnd * 255)

f=abs(Rnd * 255)

if d+e+f>640 then '可改值,调整背景色深

vColorData(1) = ChrB(d) & ChrB(e) & ChrB(f)

Response.BinaryWrite vColorData(Mid(vNumberData(vCode(ii)), i * 10 + iii , 1))

else

Response.BinaryWrite vColorData(Mid(vNumberData(vCode(ii)), i * 10 + iii , 1))

end if

end if

Next

Next

Next

End Sub
%>

以上代码可直接另存为一个文件,如vcode.asp,然后通过图片的方式调用改文件,如,然后在提交后的处理页面里验证session("checkcode")的值就可以了。这个代码是flymorn自己改进的,原始的参考代码请直接在google里搜索“用ASP生成Bmp图片”,或查看这个网址,可以找到一些相关的。

2009年3月8日星期日

在ASP中使用数据库

ASP有一个最重要的功能,就是它可以让你非常轻松地连接数据库。通常都是和一个Access或者一个SQL数据库相连。因为Access是最容易起步的,同时,在你的机器上也许已经都装有Access了,所以,在下面的例子中,我们都将使用Access来做例子。一旦你学习了ASP和Access数据库连接的核心技术方法,当你开始使用SQL server的时候,你就会发现,两者所需要的关键技术是基本相同的。

转自:动态网制作指南 www.knowsky.com
当你要连接数据库的时候,你需要在服务器上将这个数据库打开。你可以通过使用数据源名(DSN)或者通过在你的脚本语言中直接使用一个DSN-less连接的方法来连接和打开数据库。

创建一个数据源名(DSN)
你可以通过在控制面板中给你的数据库建立一个系统DSN来使你的数据库可以在ASP中连接使用。你可以在你的本地计算机上建立若干个DSN,每个DSN对应你使用的不同的数据库。在建立完DSN之后,你就可以在你的本地服务器上测试你的页面了。如果你的网站是由

ISP提供服务的,并且这个ISP支持ASP,那么很有可能它就会提供一个GUI接口,来给你的数据库创建一个DSN。

在Windows 95/98/NT中,打开控制面板(开始菜单->设置->控制面板),双击ODBC进入。
选择系统DSN,点击Add。
选择“Microsoft Access Driver”,点击结束。
填写数据源名。这是你给你的数据库起的名字,所以和一个alias是同样的操作。
在数据库选择中点击选择按钮,浏览系统中你创建的Access数据库所存放的位置。
点击OK
现在,新的DSN现在就会在系统DSN中显示,并且可以在你的本地服务器上使用了。

连接数据库
让我们建立一个DSN-less连接,并且看看是如何连接数据库的。当你创建一个DSN的时候,你就已经存储了关于这个数据库的一些信息,所以你不需要在每次需要使用一些信息的时候重复它们,这些信息如:数据库类型、名称、存放地点和可选性、用户和密码。

要创建一个DSN-less连接,你就需要提供同样的信息。下面这个例子就显示了如何给一个叫products的数据库建立一个DSN-less连接:

<%
StrConnect = "Driver={Microsoft Access Driver (*.mdb)}; DBQ=C:\db\products.mdb"
Set objConn = Server.CreateObject ("ADODB.Connection")
objConn.OpenStrConnect
%>

第二行定义了数据库的驱动和物理路径。为了要使用一个DSN-less连接,你就需要知道实际的文件存放地点(绝对路径)。Server.MapPath给任何一个使用主机服务的人提供了一个简单的工作环境来查找出那些难于查到的实际访问路径。

如果我们已经建立了一个系统DSN,并命名为products,则连接码应该为:

<%
Set objConn = Server.CreateObject ("ADODB.Connection")
objConn.Open "products"
%>

现在,数据库就已经打开了,那么你可以做些什么呢?第一件事情当然就是阅读数据库中的一系列记录,并将它们放到你的页面中去。但是,在这之前,你需要一个recordset。

Recordset
一个recordset是存储在特殊数据库表上的所有信息。所以,当你打开这个recordset的时候,表中所有的行和列的内容都是可访问的。你需要打开这个recordeset,正如你需要打开数据库连接一样。它们的命令是相似的:

Set objRec = Server.CreateObject ("ADODB.Recordset")
objRec.Open "downloadable", strConnect, 0,1,2

这个语句就创建了一个名为downloadable表的recordset(objRec),这个表在products数据库的strConnect中定义。使用Recordset open, 我们就可以循环浏览这个表,并且可以将它的所有内容都显示到屏幕上。或者,我们可以测试特定字段的内容,也可以只将我们关注的内容写到屏幕上去。

每一列代表一个字段。所以,如果数据库表如下所示:

Product ID
SKU
Name
File

1
PR12345
Product A
install_a.exe

2
PR12346
Product B
Install_b.exe



那么,我们就有如下字段的内容:ProductID, SKU, Name, 和File。你的表很可能会有许多额外的字段内容,可能包含很多东西,如价格或者是产品(商品)描述。但是这个示意图可以给你提供最基本的数据库表的概念。

填写recordset内容
使用recordset是非常容易的一件事情。如果你想要循环浏览数据库,并将所有的信息都打印到屏幕上显示,你可以按照下面来操作:

While NOT objRec.EOF
' says to do this as long as we haven't reached the end of the file
Response.WriteobjRec("ProductID") & ", "
Response.WriteobjRec("SKU") & ", "
Response.WriteobjRec("Name") & ", "
Response.WriteobjRec("File") & "
"
objRec.MoveNext
Wend ;
即使你没有如此使用过loop,你仍然可以通过阅读这个代码来将信息写到comma-delimited字符串里,并且当数据库表中创建了一个新行的时候,就重新创建一个新的行,来记录表中的那一行。你可以使用同样的方法将数据写到HTML表格中去。通过使用Response.Write添加你的TABLE标签,需要记住以下几点:

你的HTML 标签和引号中的内容。
如果你的标签或者内容使用了引号,注意使用双引号:
.
使用&来连接变量和HTML/内容信息
选择recordset中的字段
假设我们的products数据库同样包含一个叫OS的字段,假设这个字段是一个平台分界符。同样,让我们假设存储在这个字段的数据只能是如下的数据:Windows NT, Windows 95, Windows 98, Windows, Mac, Unix, 或者 Linux。

下面,我们就可以确认我们需要将哪个字段打印到屏幕上,而要忽略哪些那些字段。或者,我们可以选择哪些字段用一种格式,而另外的字段用其它的格式,如,使用不同的颜色。

使用一个简单的If...,循环就可以给我们提供更多的数据库控制权利。首先让我们来打印有关Windows NT产品的记录:






<%
While NOT objRec.EOF

If objRec("OS") = "Windows NT" THEN ' specifies the criteria

Response.Write ""
Response.Write ""
Response.Write ""
Response.Write ""

end if
objRec.MoveNext
Wend

%>
Windows NT Products
" & objRec("ProductID") & "" & objRec("SKU") & "" & objRec("Name") & "" & objRec("File") & "

添加一个记录
一旦你开始使用recordset和ASP了,你就会十分希望能够通过网络将数据添加到数据库中去。添加内容是非常重要的,如,当你需要你的网页浏览者留下它们的观点和看法,或者,当你想要进行管理更新的时候。


下面的代码打开了一个recordset,这个recordset是有关一个有着书本和它们作者名字的数据库表格。你可能曾经看到过这个,但是这次,最后三个说明书定义的指针类型是不同的:adOpenStatic, adLockOptimistic, adCmdTable:

<% ' database connection already made; code not shown here
Set objRec = Server.CreateObject ("ADODB.Recordset")
objRec.Open "books", bookdb, adOpenStatic, adLockOptimistic, adCmdTable
%>

(如果你没有使用adovbs.inc的复制文件,第三行应该为:objRec.Open "books", bookdb, 3,3,2).

recordset现在就准备好接收数据了,你只需要告诉它添加什么。在这个情况下,假设我们从表格中取出变量:strBookTitle和strBookAuthor。我们的table, books有两个字段,称作Title 和 Author,所以我们可以通过使用下面的语句来添加一个新的记录:

<%
objRec.AddNew
ObjRec("Title") = strBookTitle
objRec("Author") = strBookAuthor
objRec.Update
%>

strBookTitle和strBookAuthor代表值,通常被用户访问。如果你只是想测试add功能,你可以给title和author添加一个变量――只是需要记住使用引号。在你第一次使用它的时候,你可能会立即打开你的数据库,以确保更新的发生。

Recordset类型
在显示的objRec.Open例子中,你会发现在末尾有0,1,2的字样。这些数字代表不同的指针类型。你是用的类型依赖于你将使用它来干什么。例如,如果你不需要修改或增加任何的记录,你可以使用一个Lock类型。而当你计划要修改或者更新数据库的时候,你所选择的类型就会不同。

0,1,2 实际上代表:

adOpenForwardOnly, adLockReadOnly, adCmdTable

当然,如果在你的服务器上已经有了adovbs.inc的备份,那么,你也可以不使用数字,直接使用这些单词。adovbs.inc 包括了这三个常量和其它常量的一个列表。

2009年3月7日星期六

十天学会ASP之第十天

学习目的:分页技术,总结
今天最后一天我们学习一下ASP里面稍微难一点地分页技术,毕竟当我们有N条记录的时候我们不可能把所有记录显示在一个页面里面吧。
<%
exec="select * from test"
set rs=server.createobject("adodb.recordset")
rs.open exec,conn,1,1
rs.PageSize=3
pagecount=rs.PageCount
page=int(request.QueryString ("page"))
if page<=0 then page=1
if request.QueryString("page")="" then page=1
rs.AbsolutePage=page
%>
rs.pagesize设置一个页面里面显示的记录数,pagecount是我们自己定义的一个变量,rs.pagecount是记录的个数,page也是我们自己定义的一个变量,我们下一页的链接可以设置为list.asp?page=<%=page+1%>,下一页的链接可以设置为list.asp?page=<%=page-1%>,这样当按下链接的时候调用页面自己,page这个变量就+1或者-1了,最后我们让rs.absolutepage(当前页面)为第page页就可以了。
if request.QueryString("page")="" then page=1,这句话的作用就是我们打开list.asp的时候没有跟随page变量,自动设置为page=1,防止出错,还有当我们if....then...放在一行的时候end if可以省略。是不是分页也不难?
下面说一种特殊情况:
if page=1 and not page=pagecount,这个时候没有上一页,但是有下一页
elseif page=pagecount and not page=1,这个时候没有下一页,但是有上一页
elseif page<1,这个时候没有任何记录
elseif page>pagecount then,这个时候没有任何记录
elseif page=1 and page=pagecount,这个时候没有上一页,没有下一页
else,这个时候有上一页,也有下一页。
下面看一段显示1到n页,且每一个数字点击以后就出现这个数在代表的页面的代码,很常见哦。
<%for i=1 to pagecount%>
<%=i%><%next%>
for....next是循环从i=1开始,循环一次加1到pagecount为止。

最后我的实例里面包含了一个最简单的ASP程序,但是功能样样有,是ASP的精髓,每一个ASP大型程序都包含了它。
add.htm增加记录页面
add.asp增加记录操作
conn.asp数据库链接
del.asp删除记录操作
modify.asp修改记录页面
modifysave.asp修改记录操作
list.asp这个是这个程序的核心,通过这个页面实现记录的添加、修改、删除。
test.mdb数据库,里面有aa,bb两个字段:aa数字型只能接受数字,bb是字符型。
好了,十天到今天就结束了,我想我这个教程是让大家入门的,大家觉得写的浅也不要责怪必尽不可能初学者和高手都照顾到吧,最后我想说一句,今天的实例是ASP的精华,大家一定要好好研究,通了这个程序,你会发现你已经会ASP了。谢谢大家的支持!


资料引用:http://www.knowsky.com/4032.html

十天学会ASP之第九天

学习目的:基本的SESSION组件,总结response,request组件。
首先,有会员系统的任何程序都会用到检测是不是用户已经登陆这个步骤。这就用到了SESSION组件,下面我们 看一个代码来说明。
<%
session("islogin")="yes"
%>
这句话的意思就是在session里面定义一个islogin字符串变量,值为"yes",直接可以赋值,不需要声明。是不是很简单?
如果我们做管理员登陆系统的话,首先是一段检测是不是管理员
if 是 then
session("isadmin")=yes"
else
session("isadmin")="no"
end if
在每一个需要管理员才能看的页面最前面加上
<%
if not session("isaadmin")="yes"then
response.redirect "login.htm"
%>
这样一般用户就无法打开这个页面。解释一下response.redirect,它是转向的意思,后面的"login.htm"就是转向的文件。这样没有登陆的管理员是无法看到后面的内容的。
下面总结一下response组件基本就是用到response.write (),response.redirect() 分别是写字符串和转向的作用request基本就是request.form(),request.querystring() 分别是接受post,get方法传来的信息今天就说到这里了,最后我的示范是一个登陆系统大家可以研究一下,基本就是上面的知识点比较简单的。

十天学会ASP之第八天

学习目的:学会数据库的基本操作4(修改记录)
先来看代码:
<%
set conn=server.createobject("adodb.connection")
conn.open "driver={microsoft access driver (*.mdb)};dbq="&server.mappath("test.mdb")//这不是以前的一个数据库,里面就aa,bb两个字段
exec="select * from test where id="&request.querystring("id")
set rs=server.createobject("adodb.recordset")
rs.open exec,conn
%>










aa bb

">

">

">


<%
rs.close
set rs=nothing
conn.close
set conn=nothing
%>
大家到现在应该分析这个代码没有什么问题,这个代码的作用是接受前面一个页面的ID然后显示这条记录,文本框即是输入的地方也是显示的地方,如果需要修改的话修改以后按提交;如果不需要修改就可以直接按提交按钮。这里还有一个东西以前没有说,那就是隐藏的表单元素:hidden元素,里面的value是不用用户输入的,会随着表单一起提交,用于传递变量。下面是modifysave.asp的代码:
<%
set conn=server.createobject("adodb.connection")
conn.open "driver={microsoft access driver (*.mdb)};dbq="&server.mappath("test.mdb")
exec="select * from test where id="&request.form("id")
set rs=server.createobject("adodb.recordset")
rs.open exec,conn,1,3
rs("aa")=request.form("aa")
rs("bb")=request.form("bb")
rs.update
rs.close
set rs=nothing
conn.close
set conn=nothing
%>
在这里,rs.open exec,conn,1,3后面的参数是1,3,这我以前提过,修改记录就要用1,3。实际上修改记录很容易看懂,记录集是rs,rs("aa")就是当前记录aa字段的东西,让它等于新的数据request.form("aa")当然就修改了,不过最后别忘记保存,那就是rs.update!
说到这里,记录的搜索,读取,修改,插入都说了,通过这最基本的东西就可以作出复杂的东西了,外面的大型数据库:新闻系统,留言簿就是字段多一点罢了。今天的示例中的代码是结合以前的数据库的,大家DOWN了以后回去调试分析一下。(rar里面的那个example72.asp还是供大家查询记录ID和核对修改以后的记录用的)

-

资料引用:http://www.knowsky.com/4030.html

十天学会ASP之第七天

学习目的:学会数据库的基本操作3(删除记录)
开门见山,大家直接看程序。
exec="delete * from guestbook where id="&request.form("id")
上面这句话完成了删除记录的操作,不过锁定记录用了记录唯一的表示id,我们前面建立数据库的时候用的是系统给我们的主键,名字是编号,由于是中文的名字不是很方便,大家可以修改为id,不修改的话就是
exec="delete * from guestbook where 编号="&request.form("id")
下面我们看完整的代码:一个表单传给ASP文件一个ID,然后这个ASP文件就删除了这个ID。

delete:




example7.asp:
<%
set conn=server.createobject("adodb.connection")
conn.open "driver={microsoft access driver (*.mdb)};dbq="&server.mappath("example3.mdb")
exec="delete * from guestbook where 编号="&request.form("id")
conn.execute exec
%>
我在示例里面加了一个example72.asp,和example4.asp差不多,就是加了一个id字段,大家可以先运行这个文件看一下所有记录的ID和想删除记录的ID,删除记录以后也可以通过这个文件复查。等到最后一天,我们会把所有的这些东西整合的。大家就不会需要这么麻烦的操作。

example72.asp:
<%
set conn=server.createobject("adodb.connection")
conn.open "driver={microsoft access driver (*.mdb)};dbq="&server.mappath("example3.mdb")
exec="select * from guestbook"
set rs=server.createobject("adodb.recordset")
rs.open exec,conn,1,1
%>


无标题文档






<%
do while not rs.eof
%>






<%
rs.movenext
loop
%>
<%=rs("编号")%> <%=rs("name")%> <%=rs("tel")%> <%=rs("message")%> <%=rs("time")%>





十天学会ASP之第六天

学习目的:学会数据库的基本操作2(查询记录)
在第四天中我们有这样一个程序:
<%
set conn=server.createobject("adodb.connection")
conn.open "driver={microsoft access driver (*.mdb)};dbq="&server.mappath("example3.mdb")
exec="select * from guestbook"
set rs=server.createobject("adodb.recordset")
rs.open exec,conn,1,1
%>
我们查询的是所有的记录,但是我们要修改、删除记录的时候不可能是所有记录,所有我们要学习检索合适的记录。先看一条语句:
a="张三"
b=111
exec="select * from guestbook where name='"+a+"'and tel="+b
where后面加上的是条件,与是and,或是or,我想=,<=,>=,<,>的含义大家都知道吧。这句话的意思就是搜索name是张三的,并且电话是111的记录。还有一点就是如果要搜索一个字段里面是不是包含一个字符串就可以这么写:where instr(name,a)也就是搜索name里面有a(张三)这个字符串的人。
我这里的a,b,是常量,大家可以让a,b是表单提交过来的变量,这样就可以做一个搜索了。
下面大家看看这个代码,理解一下:

搜索:

name =

and tel=








example6.asp:
<%
name=request.form("name")
tel=request.form("tel")
set conn=server.createobject("adodb.connection")
conn.open "driver={microsoft access driver (*.mdb)};dbq="&server.mappath("example3.mdb")
exec="select * from guestbook where name='"+name+"' and tel="+tel
set rs=server.createobject("adodb.recordset")
rs.open exec,conn,1,1
%>


无标题文档




<%
do while not rs.eof
%>





<%
rs.movenext
loop
%>
<%=rs("name")%> <%=rs("tel")%> <%=rs("message")%> <%=rs("time")%>




今天实际上就讲了一个where,大家回去做做试验,把instr()做进去,明天见!


-

十天学会ASP之第五天

学习目的:学会数据库的基本操作1(写入记录)
数据库的基本操作无非是:查询记录,写入记录,删除记录,修改记录。今天我们先学习写入记录。
先建立一个表单:

name

tel

message




表单提交到example5.asp,下面是example5.asp的代码:
<%
set conn=server.createobject("adodb.connection")
conn.open "driver={microsoft access driver (*.mdb)};dbq="&server.mappath("example3.mdb")
name=request.form("name")
tel=request.form("tel")
message=request.form("message")
exec="insert into guestbook(name,tel,message)values('"+name+"',"+tel+",'"+message+"')"
conn.execute exec
conn.close
set conn=nothing
response.write "记录添加成功!"
%>
在这里前面两句我不说了,后面三句我也不说了,前面说过exec里面的是执行的命令,添加记录的比较繁,大家要仔细看。insert into后面加的是表的名字,后面的括号里面是需要添加的字段,不用添加的或者字段的内容就是默认值的可以省略。注意,这里的变量一定要和ACCESS里面的字段名对应,否则就会出错。values后面加的是传送过来的变量。exec是一个字符串,"insert into guestbook(name,tel,message)values('"是第一段,在ASP里面不能嵌双引号,所以可以用'代替双引号,放在双引号里面,连接两个变量用+或者&所以"',"又是一段,中间夹了一个name就是表单传来的变量,这样就可以在这个变量外面加两个'',表示是字符串了,后面的tel是数字型变量所以不需要外面包围'',大家慢慢分析这句话,如果用表单传来的数据代替变量名字的话这句话为(假设name="aaa",tel=111,message="bbb"):"insert into guestbook(name,tel,message)values('aaa',111,'bbb')"。
接下来的conn.execute 就是执行这个exec命令,最后别忘记把打开的数据库关闭,把定义的组件设置为空,这样可以返回资源。上次的读取为了简单,我没有关闭,大家可以补充上去:
rs.close
set rs=nothing
conn.close
set conn=nothing
记住,次序不可以颠倒!
大家可以到数据库里面去看一看,或者用example4.asp读取看看是不是多了记录阿?

-

资料引用:http://www.knowsky.com/4027.html

十天学会ASP之第四天

学习目的:掌握ACCESS数据库的连接和读取记录
今天要学习的内容有一点枯燥,但是很重要。在这里大家不需要知道命令具体的运行情况,外面的很多书籍之所以不适合入门就是因为介绍了太多的理论知识,让初学者一头雾水。
下面开门见山,看两句话:
<%
set conn=server.createobject("adodb.connection")
conn.open "driver={microsoft access driver (*.mdb)};dbq="&server.mappath("example3.mdb")
%>
第一句话定义了一个adodb数据库连接组件,第二句连接了数据库,大家只要修改后面的数据库名字就可以了。是不是很简单?
下面再看三句:
<%
exec="select * from guestbook"
set rs=server.createobject("adodb.recordset")
rs.open exec,conn,1,1
%>
这三句加在前面两句的后面,第一句:设置查询数据库的命令,select后面加的是字段,如果都要查询的话就用*,from后面再加上表的名字,我们前面建立的是不是一个gustbook表阿?第二句:定义一个记录集组件,所有搜索到的记录都放在这里面,第三句是打开这个记录集,exec就是前面定义的查询命令,conn就是前面定义的数据库连接组件,后面参数“1,1”,这是读取,后面讲到修改记录就把参数设置为1,3,好了接下来我们读取记录。

<%do while not rs.eof%>




<%
rs.movenext
loop
%>
<%=rs("name")%><%=rs("tel")%><%=rs("message")%><%=rs("time")%>

在一个表格中,我们用4列分别显示了上次建立的表里面的四个字段,用do循环,not rs.eof的意思是条件为没有读到记录集的最后,rs.movenext的意思是显示完一条转到下面一条记录,<%=%>就等于<%response.write%>用于在html代码里面插入asp代码,主要用于显示变量。
好了今天就结束了,大家可以多实践,可以先下载我的示例看一下,调试一下。下面是我机器上面的结果图片。

十天学会ASP之第三天

学习目的:学会ACCEES数据库的使用,并建立一个将来要用的留言簿数据库。
首先,大家要安装OFFICE里面的ACCEES(我的演示是OFFICE XP版本),安装过程这里就不说了,安装好以后会出现下图的菜单。

单击打开ACCEES


安空数据库,新建一个数据库,文件名字可以叫gustbook.mdb,我这里叫example3.mdb
(为了安全期间,文件名复杂一点好,因为ACCESS数据库可以被下载的!!)


使用设计器创建新的表,一个数据库MDB文件里面可以有多个表


填写字段名字然后选择字段类型,一条记录可以有很多字段,可以有很多字段类型,字段大小的意思就是这个字段最多可以容纳的字符树,当这个字段没有任何信息是,ACCEES会用默认值代替(没有任何信息不是空的意思),一般必填字段和允许空字符串分别设置为否、是,以防止出错



按照上图大家分别建立几个字段,在时间中默认值为=now()就是这个字段不需要填写,系统直接以当前时间代替


所以的字段都建立以后,关闭这个窗口,系统会出现上图的提示,选择是,主键是记录的标识,为了以后简单,大家可以把编号改为ID,还有在ACCEES里面尽量不要用中文表示字段名字


最后,把这个表的名字设置为guestbook,然后双击打开这个表,观看表里面的记录

好了,大家不要急,这个数据库以后有用的,大家不要删除。


资料引用:http://www.knowsky.com/4025.html

十天学会ASP之第二天

学习目的:学会用表单元素向服务器传送变量,然后显示变量在客户端的浏览器。
首先,让我们来看一下DREAMWEAVER的表单元素。


表单元素要放在一个表单域里面,建立一个表单域。然后修改动作里面的文件为要接受这个表单变量的ASP文件。方法有两种,一种是POST,这个方法传送的变量不会在浏览器的地址栏里面显示,可以大批量传送数据;GET则是会在浏览器地址栏里面显示的,等一会举例子。



下面我们来一个一个看表单元素。1、文本域,这个是最基本的,传送的是文本信息,一般用户名,密码都要用这个传送,不过要是密码的话要在类型里面选择密码,这样就会以*代替显示出来的字符,文本域的名字很重要,以后会用到这个名字所以一般不用默认的名字。现在举一个例子:如果文本域的名字是name的话,用来传送网上用户登记的名字,在表单域里面,传送到reg.asp,用POST方法,那么在reg.asp里面这样得到变量<%name=request.form("name")%>如果要显示变量再家加一句,response.write name,这样就形成了一个从客户端到浏览器再回到客户端的过程。如果方法用的是GET的话,那么就改为name=request.querystring("name")实际上两者可以统一为name=request("name")。下面看看按钮,按钮里面无非两种,一种是提交表单的按钮,一种是重新输入的按钮。单选按钮,一个按钮有一个值。在列表里面同样,添加列表选项和值。下面举一个例子,实际上各种表单元素都是差不多的。下面是DREAMWEAVER里面的代码:


姓名:
//文本域,名字叫name


密码:
//文本域,用来输入密码,名字叫psw




性别:
//单选,名字叫sex,数值是"男"

//单选,名字叫sex,数值是"女"




城市:



//提交按钮



下面是reg.asp的代码,用来显示出刚才受到的信息:

<%
name=request.form("name")
psw=request.form("psw")
sex=request.form("sex")
city=request.form("city")
response.write name
response.write psw
response.write sex
response.write city
%>


等学会了数据库以后,是不是觉得做一个留言簿很简单?

-

资料引用:http://www.knowsky.com/4024.html

十天学会ASP之第一天

学习目的:安装调试ASP的环境,写出第一个HELLO WORLD程序。
首先我们来安装WINSOWS2000自带的IIS作为服务器。(WINSOWS98的PWS也可以,但是不推荐,安装大致和2000相同,这里就不详细说了。)


先是控制面板-添加或删除程序。



然后是添加删除windows组件-选中IIS组件前面的勾



装好以后打开控制面板中的管理工具,会发现多了两个图标,打开IIS管理器



选择默认WEB站点,然后右键属性或者直接按快捷键



大家不要头痛,里面只有三个页面需要修改,先是WEB站点,如果用户有固定IP,可以分配一个IP



接下来在注目录中选择一个自己硬盘上面的文件夹存放网站,选中读取、写入






在文档中添加默认的页面,比如打www.sina.com.cn新浪就是调用了一个默认文档





接下来也是最关键的:1、在刚才你定义的一个文件夹里面新建一个文件,可以用记事本建立一个TXT文件然后改名为ASP,里面的内容如下
<%response.write "hello world!"%>
response.write就是显示的意思,前后的<%%>是asp的标记符号,在这里面的信息都由服务器处理。保存以后就可以在浏览器里面运行这个文件了。127.0.0.1(=localhost)是本机的IP,后面再直接加上建立的那个文件名字就可以了,之所以我图片上面还有一个example,那是因为我建立了一个虚拟目录,这个不知道不要紧,我们往下走,具体深入的东西大家自己慢慢研究,必尽我们的目的就是快速掌握嘛。


-

资料引用:http://www.knowsky.com/4023.html

C# 通过类名动态创建对象

首先,给出一个比较常见的实例:
1、自定义函数GetInstanceByName,用于通过指定类名创建相应的对象。

private object GetInstanceByName(string className)
{
object obj;

try
{
obj = Activator.CreateInstance(Type.GetType(className));
MessageBox.Show(obj.GetType().ToString());
}


//创建Button实例的过程:Button btn=(Button)GetInstanceByName("System.Windows.Forms");
//btn.Parent=this;

//Assembly asm = Assembly.LoadWithPartialName(className);
//try
//{
// obj = Activator.CreateInstance(asm.GetType(className + ".Button"));
// MessageBox.Show(obj.GetType().ToString());
//}

catch (Exception e)
{
throw new Exception("动态创建实例失败 \n\n=> " + className, e);
}
return obj;
}

说明:className必须是完全限定名,如Int32的完全限定名是:
System.Int32, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

Button的完全限定名是:
System.Windows.Forms.Button, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

前面是类型名(如:System.Int32),后面是这个类型所在的Assembly的名字。

注:对于系统默认的数据类型,只需类型名即可。

2、调用函数GetInstanceByName得到相应的对象
private void button1_Click(object sender, EventArgs e)
{
//Int32 myInt=(Int32)GetInstanceByName("System.Int32");

//得到Assembly名字的方法:
//对于自定义的数据类型,需要通过Assemebly类得到程序集的全名(其实就是反射机制)
Assembly asm = Assembly.Load("Test"); //加载程序集,Test为程序集的名字
GetInstanceByName("Application1.Form1, " + asm.FullName); //Application1.Form1表示命名空间Application1中的一个类"Form1"
MessageBox.Show(asm.FullName);
}

补充:加载程序集有两个函数,Assembly.Load()和Assembly.LoadFrom()。Assembly.Load的参数是程序集的名称,运行库会在本地目录和全局程序集高速缓存内搜索该程序集;Assembly.LoadFrom()的参数是程序集的完成路径名,不会在其它位置搜索该程序集。
自定义ToolBox的实现会用到该技术。

SQL语句创建表结构

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[tabproduct]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[tabproduct]
GO

CREATE TABLE [dbo].[tabproduct] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[big_sort] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[small_sort] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[pro_name] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[pro_weight] [numeric](18, 2) NULL ,
[instructions] [nvarchar] (60) COLLATE Chinese_PRC_CI_AS NULL ,
[tuijian] [int] NULL ,
[view_times] [int] NULL ,
[add_date] [datetime] NULL ,
[big_image] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[small_image] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[pro_notes] [ntext] COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

在ASP.NET页面上轻松整合JavaScript

尽管ASP.NET提供了一个强壮的平台,但是开发者也不应忽视诸如JavaScript这样成熟的技术。在这篇文章中,Tony Patton将向您解释在Web开发中如何将JavaScript与ASP.NET控件进行整合。

尽管Web开发平台提供了灵活性和众多功能,您经常希望或需要依赖现有的技术来完成一项必须的任务,一个好的例子就是ASP.NET,它提供了一个强大的开发平台,但是同时也不应忽略像JavaScript这样成熟的技术,在这篇文章中,我将向您讲解如何将JavaScript代码联结到ASP.NET控件中。

常规方式

通常情况下,当一个Web应用软件需要一个弹出窗口或确认窗口或其它的客户端功能时,您可以创建必需的JavaScript方法,并在需要时调用它们。例如,在列表A中包含了一个确认窗口,用户可以用它来继续或取消表单的提交。

在选择了提交(submit)按钮之后,JavaScript的confirmSubmit方法就被调用了,这一确认提示允许用户继续进行表单提交(选择确认)或取消(选择取消)。

以上代码可以按照计划工作,但是在一个开发平台上工作的时候就没有这么简单了,比如ASP.NET。

ASP.NET的替换选项

ASP.NET支持使用诸如输入按钮和文本框等HTML元素,但是在ASP.NET自己的开发模型上有一套完成的控件元素可以提供额外的功能。

将JavaScript附加到ASP.NET上并不像直接的HTML/JavaScript方式那么简单,ASP.NET编程模式在基本页面类中提供了方法来附加脚本程序块到页面元素当中。以下的方法可以用于附加或整合JavaScript到页面或页面元素中:

RegisterClientScriptBlock:允许您的页面含有脚本程序块,客户端脚本在页面对象form runat= server>元素的起始标签之后开始运行,脚本程序块是作为对象来提交输出的,所以您必需加上两个script>元素标签。

RegisterOnSubmitStatement:允许您指派一个脚本程序块/方法到页面对象OnSubmit事件上。

RegisterStartupScript:允许您在页面中包含脚本程序块,与RegisterClientScriptBlock方法类似,这一方法在页面对象form runat= server>元素的结束标签之前开始运行,脚本程序块是作为对象来提交输出的,所以您必需加上两个script>元素标签。

每个方法都可以接受两个参数:键和脚本,键是分配给脚本程序块的名称,键值应当是唯一的,通过这一唯一的键值,多个服务器控制的实例可以请求脚本程序块,而不必让脚本再次运行输出流;第二个参数脚本包含了发送到客户的实际脚本,它可以是完整的JavaScript代码或一个方法的名称。

这些方法可以使用在实际的ASP.NET页面代码中,无论是VB.NET、C#、J#或任何其它的语言,列表B展示了用C#编写的ASP.NET示例代码。

JavaScript方法是通过一个字符串变量来构建的,它的值传递给RegisterClientScriptBlock方法作为第二个参数,实际的方法名称是通过该对象的Attributes 属性的Add方法来分配给ASP.NET的按钮控件的,JavaScript事件是作为第一个参数传递的,而方法名称则是第二个参数。

而且,你可能会注意到IsStartupScriptRegistered方法的使用,该方法允许您在继续使用前确认该脚本是否已经被注册了,有两个方法可以用于这个问题:

IsStartupScriptRegistered:确认客户端的起始脚本是否已经在页面对象上注册,其单一参数是脚本的名称。

IsClientScriptBlockRegistered:确认客户端的脚本程序块是否已经在页面对象上注册,其唯一的参数是脚本的名称。

另一个解决问题的方法就是使用页面类的RegisterOnSubmitStatement方法,列表C重复了列表B的功能,但是不同之处在于将confirmSubmit方法连接到页面的提交事件上而不是按钮的点击事件上。

这个简单的例子清晰地说明了如何将JavaScript脚本程序块和JavaScript脚本包含到ASP.NET页面的控件上,如果您使用ASP.NET控件,这种方法可以帮助您将脚本联系到这些控件上,但是也可以使用注册(register)方法来集中一个项目的JavaScript。您可以创建一个包含了脚本的类文件并在需要时在页面中使用它们,这样就只需在一个位置对这些脚本进行管理,在一个应用软件中的一个或多个页面上使用这些脚本就会变得更容易。

集新旧于一身

无论在哪种开发平台,您都不太可能放弃使用JavaScript作为客户端脚本语言,JavaScript都是开发客户端功能的标准,尽管ASP.NET控件提供了大量的功能,很多时候您还需要将JavaScript与这些控件进行“联姻”,幸好ASP.NET页面类包含了众多的方法来将脚本程序块和方法集成到页面及其控件上。

ASP.NET MVC或可大大推动VB的使用

ASP.NET MVC让微软的开发人员回到了网站开发的主流世界中,虽然业界早已接受了MVC形式的框架,可是.NET开发人员依旧使用WebForms进行工作。不论好坏,WebForms将代码和HTML相分离,使它们难以混在一起。不过WebForms在广泛使用AJAX和CSS的情况下反而会出现一些麻烦问题,因为WebForms无法满足两者对客户端的严格控制要求。

在ASP.NET MVC中,开发人员依旧使用aspx文件中的伪HTML代码来编写视图。这些文件无法立即得到编译,这意味着再简单的语法错误也要在运行时才能发现。而视图的单元测试也因此变得比想象中更加困难。

aspx的一个替代品便是Visual Basic,它的内联XML片段功能与目前的要求非常吻合。Visual Basic并非首次用在模板语言中,VBScript是传统ASP开发的默认语言。不过与asp文件不同的是,VB.NET能够更清晰地分离HTML和代码。

除了编译器检验这一优势之外,VB可以使用更强大的方式来表现公用站点元素。对于普通的aspx文件,公用站点元素存放在母版页中,它基本上是对aspx文件中HTML片段的包装。有了VB之后,您就可以简单地使用基类来实现同样的功能了。这样,站点模板和内容生成器之间可以进行丰富的交互,使复杂站点的开发工作变的相对简单一些。

使用VB和XML Literal的主要缺点是无法享受到HTML和JavaScript的智能提示功能。

2009年3月6日星期五

电子商务网站的SEM策略

周末和几个研究电子商务的朋友一起在北大聚会,他们大多属于战斗在电子商务第一线的老革命(这里老革命指“行业经验”,非年龄),他们对电子商务的理解很深刻,讨论的话题也很深入很跳跃,又一次让我感觉到很好很强大,对我这个只了解SEM,对电子商务却很无知的家伙就只能在旁边洗耳恭听了,偶尔谈及SEM或营销时我才能借题发挥下。
今天借用大家讨论时的片段继续往下发挥:“针对一般的电子商务网站目前比较有效的网络营销方式主要有两种:广告联盟和搜索引擎营销(即SEM),一般情况下电子商务网站做SEM的转化率为1%,而CPC、CPA、CPS等的转化率一般为千分之一。”通过此可得出SEM是转化率相对较大的网络营销形式,相信也是百度等搜索引擎广告市场占有率能节节攀升的原因。所以SEM对电子商务的重要程度不言而喻,但相比其他网站而言,电子商务网站的SEM执行会有什么不同呢?今天Albert将阐述下电子商务网站不同阶段的SEM策略:(这里以B2C类型的电子商务网站为例)
首先大家需要先了解影响B2C电子商务网站的几个重要因素:如:网站用户体验、物流、服务、支付、网络营销(SEM为代表,所以在以下以SEM替代之)等几个主要方面,这里要强调SEM虽是电子商务环节中的重要环节,但非全部。它主要在电子商务链条中起到两个作用:
1、增加网站产品暴光率,将用户引入到相应的产品页面。
2、产品或者网站的一些品牌公关宣传,以及一些后期用户的反馈公关。
因此我们在需要做电子商务SEM策略时应该顾忌到其他几方面的重要因素,如SEM的执行不能影响到用户体验等。
电子商务网站不同阶段的SEM策略:
1、 对网站不同阶段SEM的目标策略有可能会不同,比如当电子商务网站诞生阶段,最重要的应该是给用户一个认知和信赖过程,此阶段谈及要产生多少定单不太现实,所以该阶段重要的是对网站以及产品进行一些搜索引擎品牌的公关。比如可以优化或竞价一些可增加客户信赖度的软文。
2、 网站发展中期随着用户对网站逐渐产生信赖感,为网站导入高质量流量以及把握客户转化率成为关键,与网站初期偏重搜索公关传播不同,中期追求的是“质”和“量”的不断提高,通过竞价及优化众多主要关键词和长尾关键词获得一定的量,在提高量的同时不断优化网站体验从而提高客户转化率。此阶段涉及的营销综合能力会比较强,比如关键词定位、关键词转化率计算、网站用户体验测试(这点我认为是最难点,从感观来评论用户体验,不同人有不同的审美感和体验爱好,所以任何人的说话都有可能太片面,所以还需要通过用户反馈的数据说话)。
3、 电子商务网站能发展到后期,相信老用户也已经到了一定数量级别,和中期不同的是此阶段电子商务网站在想办法拓展新客户的同时,更重要的是维护好老客户,老客户是你的生存之本,因为每个购买过产品的用户都有可能对产品有各种不同的看法,或好或糟糕或马马乎乎等评价。而增加好评价的暴光度和减少不利评价的暴光是后期电子商务网站发展的重中之重,要相信“众口铄金”的力量是可能摧毁一切的,尤其在这个浮躁的WEB2.0时代。

百度优化一些建议

下面是更新后的给站长的建站建议,虽然目前还远远没有Google的站长指南那么具体,但相比以前也算一个小小的进步了,具体见http://www.baidu.com/search/guide.html#4:
1. 为每个网页添加合适的标题,如果是网站首页,则标题建议使用站点名称或者站点代表的公司、机构名称;其余的内容页面,标题建议做成与正文内容的提炼和概括,这可以让您的潜在用户通过搜索引擎结果中的标题快速访问到您的页面。
2. 充分利用网站首页或者频道首页的 description 标签,提供此网页内容的概括说明,形式为,这将帮助用户和搜索引擎加强对你的网站和网页的理解。
3. 网站应该有明晰的导航和层次结构,网站上重要的网页,应该能从网站比较浅层的位置找到,确保每个页面都可以通过至少一个文本链接到达。
4. 尽量使用文字而不是flash、Javascript等来显示重要的内容或链接,百度暂时无法识别Flash、Javascript中的内容,这部分内容可能无法在百度搜索得到;仅在flash、Javascript中包含链接指向的网页,百度可能无法收录。
5. 尽量少使用frame和iframe框架结构,通过iframe显示的内容可能会被百度丢弃。
6. 如果网站采用动态网页,减少参数的数量和控制参数的长度将有利于收录。
7. 网站改版或者网站内重要页面链接发生变动时,应该将改版前的页面301永久重定向到改版后的页面。
  只有当搜索引擎、站长、互联网用户之间,能有一种默契的利益均衡,这个行业才会顺畅发展。竭泽而渔式的网站建设,只会使您与用户、与搜索引擎越来越远。搜索引擎与站长之间,宜和谐发展,共同拥抱美好的愿景。
  以下是我们给出的一些网站质量方面的建议:
1. 网站的内容应该是面向用户的,搜索引擎也只是网站的一个普通访客,放置任何用户不可见、或者欺骗用户的内容,都可能被搜索引擎当做作弊行为,这些行为包括但不仅限于:在网页中加入隐藏文字或隐藏链接;在网页中加入与网页内容不相关的关键词;具有欺骗性跳转或重定向;专门针对搜索引擎制作桥页;针对搜索引擎利用程序生成的内容;具有大量重复无价值内容;充斥大量恶意广告或恶意代码等。
2. 百度更喜欢独特的原创内容,如果您的站点内容只是从各处采集复制而成,很可能不会被百度收录。
3. 谨慎设置您的友情链接,如果您网站上的友情链接,多是指向一些垃圾站点,那么您的站点可能会受到一些负面影响。
4. 谨慎加入频道共建、内容联盟等不能产生或很少产生原创内容的计划,除非您能为内容联盟创造原创的内容。
5. 百度会尽量收录提供不同信息的网页,如果您网站上相同的内容可以通过不同形式展现(如论坛的简版页面、打印页),可以使用robots.txt禁止spider抓取您不想向用户展现的形式,这也有助于节省您的带宽。
本文来源于搜索引擎优化(SEO)研究|林敏SEO博客 http://www.albert168.com , 原文地址: http://www.albert168.com/articles/75

ASP.NET中常用的26个优化性能方法

1. 数据库访问性能优化   数据库的连接和关闭   访问数据库资源需要创建连接、打开连接和关闭连接几个操作。这些过程需要多次与数据库交换信息以通过身份验证,比较耗费服务器资源。ASP.NET中提供了连接池(Connection Pool)改善打开和关闭数据库对性能的影响。系统将用户的数据库连接放在连接池中,需要时取出,关闭时收回连接,等待下一次的连接请求。   连接池的大小是有限的,如果在连接池达到最大限度后仍要求创建连接,必然大大影响性能。因此,在建立数据库连接后只有在真正需要操作时才打开连接,使用完毕后马上关闭,从而尽量减少数据库连接打开的时间,避免出现超出连接限制的情况。   使用存储过程   存储过程是存储在服务器上的一组预编译的SQL语句,类似于DOS系统中的批处理文件。存储过程具有对数据库立即访问的功能,信息处理极为迅速。使用存储过程可以避免对命令的多次编译,在执行一次后其执行规划就驻留在高速缓存中,以后需要时只需直接调用缓存中的二进制代码即可。   另外,存储过程在服务器端运行,独立于ASP.NET程序,便于修改,最重要的是它可以减少数据库操作语句在网络中的传输。   优化查询语句   ASP.NET中ADO连接消耗的资源相当大,SQL语句运行的时间越长,占用系统资源的时间也越长。因此,尽量使用优化过的SQL语句以减少执行时间。比如,不在查询语句中包含子查询语句,充分利用索引等。   2. 字符串操作性能优化   使用值类型的ToString方法   在连接字符串时,经常使用"+"号直接将数字添加到字符串中。这种方法虽然简单,也可以得到正确结果,但是由于涉及到不同的数据类型,数字需要通过装箱操作转化为引用类型才可以添加到字符串中。但是装箱操作对性能影响较大,因为在进行这类处理时,将在托管堆中分配一个新的对象,原有的值复制到新创建的对象中。   使用值类型的ToString方法可以避免装箱操作,从而提高应用程序性能。   运用StringBuilder类   String类对象是不可改变的,对于String对象的重新赋值在本质上是重新创建了一个String对象并将新值赋予该对象,其方法ToString对性能的提高并非很显著。   在处理字符串时,最好使用StringBuilder类,其.NET 命名空间是System.Text。该类并非创建新的对象,而是通过Append,Remove,Insert等方法直接对字符串进行操作,通过ToString方法返回操作结果。   其定义及操作语句如下所示:   int num; +üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
  System.Text.StringBuilder str = new System.Text.StringBuilder(); //创建字符串 +üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
  str.Append(num.ToString()); //添加数值num +üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
  Response.Write(str.ToString); //显示操作结果
  3. 优化 Web 服务器计算机和特定应用程序的配置文件以符合您的特定需要 +üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
  默认情况下,ASP.NET 配置被设置成启用最广泛的功能并尽量适应最常见的方案。因此,应用程序开发人员可以根据应用程序所使用的功能,优化和更改其中的某些配置,以提高应用程序的性能。下面的列表是您应该考虑的一些选项。   仅对需要的应用程序启用身份验证。默认情况下,身份验证模式为 Windows,或集成 NTLM。大多数情况下,对于需要身份验证的应用程序,最好在 Machine.config 文件中禁用身份验证,并在 Web.config 文件中启用身份验证。   根据适当的请求和响应编码设置来配置应用程序。ASP.NET 默认编码格式为 UTF-8。如果您的应用程序为严格的 ASCII,请配置应用程序使用 ASCII 以获得稍许的性能提高。   考虑对应用程序禁用 AutoEventWireup。在 Machine.config 文件中将 AutoEventWireup 属性设置为 false,意味着页面不将方法名与事件进行匹配和将两者挂钩(例如 Page_Load)。如果页面开发人员要使用这些事件,需要在基类中重写这些方法(例如,需要为页面加载事件重写 Page.OnLoad,而不是使用 Page_Load 方法)。如果禁用 AutoEventWireup,页面将通过将事件连接留给页面作者而不是自动执行它,获得稍许的性能提升。   从请求处理管线中移除不用的模块。默认情况下,服务器计算机的 Machine.config 文件中 节点的所有功能均保留为激活。根据应用程序所使用的功能,您可以从请求管线中移除不用的模块以获得稍许的性能提升。检查每个模块及其功能,并按您的需要自定义它。   例如,如果您在应用程序中不使用会话状态和输出缓存,则可以从 列表中移除它们,以便请求在不执行其他有意义的处理时,不必执行每个模块的进入和离开代码。   4. 一定要禁用调试模式   在部署生产应用程序或进行任何性能测量之前,始终记住禁用调试模式。如果启用了调试模式,应用程序的性能可能受到非常大的影响。   5. 对于广泛依赖外部资源的应用程序,请考虑在多处理器计算机上启用网络园艺   ASP.NET 进程模型帮助启用多处理器计算机上的可缩放性,将工作分发给多个进程(每个 CPU 一个),并且每个进程都将处理器关系设置为其 CPU。此技术称为网络园艺。如果应用程序使用较慢的数据库服务器或调用具有外部依赖项的 COM 对象(这里只是提及两种可能性),则为您的应用程序启用网络园艺是有益的。但是,在决定启用网络园艺之前,您应该测试应用程序在网络园中的执行情况。   6. 只要可能,就缓存数据和页输出   ASP.NET 提供了一些简单的机制,它们会在不需要为每个页请求动态计算页输出或数据时缓存这些页输出或数据。另外,通过设计要进行缓存的页和数据请求(特别是在站点中预期将有较大通讯量的区域),可以优化这些页的性能。与 .NET Framework 的任何 Web 窗体功能相比,适当地使用缓存可以更好的提高站点的性能,有时这种提高是超数量级的。   使用 ASP.NET 缓存机制有两点需要注意。首先,不要缓存太多项。缓存每个项均有开销,特别是在内存使用方面。不要缓存容易重新计算和很少使用的项。其次,给缓存的项分配的有效期不要太短。很快到期的项会导致缓存中不必要的周转,并且经常导致更多的代码清除和垃圾回收工作。若关心此问题,请监视与 ASP.NET Applications 性能对象关联的 Cache Total Turnover Rate 性能计数器。高周转率可能说明存在问题,特别是当项在到期前被移除时。这也称作内存压力。7. 选择适合页面或应用程序的数据查看机制   根据您选择在 Web 窗体页显示数据的方式,在便利和性能之间常常存在着重要的权衡。例如,DataGrid Web 服务器控件可能是一种显示数据的方便快捷的方法,但就性能而言它的开销常常是最大的。在某些简单的情况下,您通过生成适当的 HTML 自己呈现数据可能很有效,但是自定义和浏览器定向会很快抵销所获得的额外功效。Repeater Web 服务器控件是便利和性能的折衷。它高效、可自定义且可编程。   8. 将 SqlDataReader 类用于快速只进数据游标   SqlDataReader 类提供了一种读取从 SQL Server 数据库检索的只进数据流的方法。如果当创建 ASP.NET 应用程序时出现允许您使用它的情况,则 SqlDataReader 类提供比 DataSet 类更高的性能。情况之所以这样,是因为 SqlDataReader 使用 SQL Server 的本机网络数据传输格式从数据库连接直接读取数据。另外,SqlDataReader 类实现 IEnumerable 接口,该接口也允许您将数据绑定到服务器控件。有关更多信息,请参见 SqlDataReader 类。有关 ASP.NET 如何访问数据的信息,请参见通过 ASP.NET 访问数据。   9. 将 SQL Server 存储过程用于数据访问   在 .NET Framework 提供的所有数据访问方法中,基于 SQL Server 的数据访问是生成高性能、可缩放 Web 应用程序的推荐选择。使用托管 SQL Server 提供程序时,可通过使用编译的存储过程而不是特殊查询获得额外的性能提高。   10. 避免单线程单元 (STA) COM 组件   默认情况下,ASP.NET 不允许任何 STA COM 组件在页面内运行。若要运行它们,必须在 .aspx 文件内将 ASPCompat=true 属性包含在 @ Page 指令中。这样就将执行用的线程池切换到 STA 线程池,而且使 HttpContext 和其他内置对象可用于 COM 对象。前者也是一种性能优化,因为它避免了将多线程单元 (MTA) 封送到 STA 线程的任何调用。   使用 STA COM 组件可能大大损害性能,应尽量避免。若必须使用 STA COM 组件,如在任何 interop 方案中,则应在执行期间进行大量调用并在每次调用期间发送尽可能多的信息。另外,小心不要在构造页面期间创建任何 STA COM 组件。例如下面的代码中,在页面构造时将实例化由某个线程创建的 MySTAComponent,而该线程并不是将运行页面的 STA 线程。这可能对性能有不利影响,因为要构造页面就必须完成 MTA 和 STA 线程之间的封送处理。 <%@ Page Language="VB" ASPCompat="true" %>+üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
+üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
+üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
<% +üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
Response.Write(myComp.SayHello) +üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
%> +üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
+üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:

     首选机制是推迟对象的创建,直到以后在 STA 线程下执行上述代码,如下面的例子所示。+üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
<%@ Page Language="VB" ASPCompat="true" %> +üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
+üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
+üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
<% +üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
Response.Write(myComp.SayHello) +üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
%> +üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:

  推荐的做法是在需要时或者在 Page_Load 方法中构造任何 COM 组件和外部资源。+üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
  永远不要将任何 STA COM 组件存储在可以由构造它的线程以外的其他线程访问的共享资源里。这类资源包括像缓存和会话状态这样的资源。即使 STA 线程调用 STA COM 组件,也只有构造此 STA COM 组件的线程能够实际为该调用服务,而这要求封送处理对创建者线程的调用。此封送处理可能产生重大的性能损失和可伸缩性问题。在这种情况下,请研究一下使 COM 组件成为 MTA COM 组件的可能性,或者更好的办法是迁移代码以使对象成为托管对象。   11. 将调用密集型的 COM 组件迁移到托管代码   .NET Framework 提供了一个简单的方法与传统的 COM 组件进行交互。其优点是可以在保留现有投资的同时利用新的平台。但是在某些情况下,保留旧组件的性能开销使得将组件迁移到托管代码是值得的。每一情况都是不一样的,决定是否需要迁移组件的最好方法是对 Web 站点运行性能测量。建议您研究一下如何将需要大量调用以进行交互的任何 COM 组件迁移到托管代码。   许多情况下不可能将旧式组件迁移到托管代码,特别是在最初迁移 Web 应用程序时。在这种情况下,最大的性能障碍之一是将数据从非托管环境封送到托管环境。因此,在交互操作中,请在任何一端执行尽可能多的任务,然后进行一个大调用而不是一系列小调用。例如,公共语言运行库中的所有字符串都是 Unicode 的,所以应在调用托管代码之前将组件中的所有字符串转换成 Unicode 格式。   另外,一处理完任何 COM 对象或本机资源就释放它们。这样,其他请求就能够使用它们,并且最大限度地减少了因稍后请求垃圾回收器释放它们所引起的性能问题。   12. 在 Visual Basic .NET 或 JScript 代码中使用早期绑定   以往,开发人员喜欢使用 Visual Basic、VBScript 和 JScript 的原因之一就是它们所谓“无类型”的性质。变量不需要显式类型声明,并能够简单地通过使用来创建它们。当从一个类型到另一个类型进行分配时,转换将自动执行。不过,这种便利会大大损害应用程序的性能。   Visual Basic 现在通过使用 Option Strict 编译器指令来支持类型安全编程。为了向后兼容,默认情况下,ASP.NET 不启用该选项。但是,为了得到最佳性能,强烈建议在页中启用该选项。若要启用 Option Strict,请将 Strict 属性包括在 @ Page 指令中,或者,对于用户控件,请将该属性包括在 @ Control 指令中。下面的示例演示了如何设置该属性,并进行了四个变量调用以显示使用该属性是如何导致编译器错误的。 <%@ Page Language="VB" Strict="true" %> +üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
<% +üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
Dim B +üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
Dim C As String +üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
' This will cause a compiler error. +üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
A = "Hello" +üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
' This will cause a compiler error. +üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
B = "World" +üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
' This will not cause a compiler error. +üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
C = "!!!!!!" +üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
' But this will cause a compiler error. +üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
C = 0 +üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
%>
  JScript .NET 也支持无类型编程,但它不提供强制早期绑定的编译器指令。若发生下面任何一种情况,则变量是晚期绑定的:+üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
  被显式声明为 Object。   是无类型声明的类的字段。   是无显式类型声明的专用函数或方法成员,并且无法从其使用推断出类型。   最后一个差别比较复杂,因为如果 JScript .NET 编译器可以根据变量的使用情况推断出类型,它就会进行优化。在下面的示例中,变量 A 是早期绑定的,但变量 B 是晚期绑定的。   var A; +üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
  var B; +üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
  A = "Hello"; +üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
  B = "World"; +üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
  B = 0;
  为了获得最佳的性能,当声明 JScript .NET 变量时,请为其分配一个类型。例如,var A : String。+üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
13. 使请求管线内的所有模块尽可能高效   请求管线内的所有模块在每次请求中都有机会被运行。因此,当请求进入和离开模块时快速地触发代码至关重要,特别是在不使用模块功能的代码路径里。分别在使用及不使用模块和配置文件时执行吞吐量测试,对确定这些方法的执行速度非常有用。   14. 使用 HttpServerUtility.Transfer 方法在同一应用程序的页面间重定向   采用 Server.Transfer 语法,在页面中使用该方法可避免不必要的客户端重定向。   15. 必要时调整应用程序每个辅助进程的线程数   ASP.NET 的请求结构试图在执行请求的线程数和可用资源之间达到一种平衡。已知一个使用足够 CPU 功率的应用程序,该结构将根据可用于请求的 CPU 功率,来决定允许同时执行的请求数。这项技术称作线程门控。但是在某些条件下,线程门控算法不是很有效。通过使用与 ASP.NET Applications 性能对象关联的 Pipeline Instance Count 性能计数器,可以在 PerfMon 中监视线程门控。   当页面调用外部资源,如数据库访问或 XML Web services 请求时,页面请求通常停止并释放 CPU。如果某个请求正在等待被处理,并且线程池中有一个线程是自由的,那么这个正在等待的请求将开始被处理。遗憾的是,有时这可能导致 Web 服务器上存在大量同时处理的请求和许多正在等待的线程,而它们对服务器性能有不利影响。通常,如果门控因子是外部资源的响应时间,则让过多请求等待资源,对 Web 服务器的吞吐量并无帮助。   为缓和这种情况,可以通过更改 Machine.config 配置文件节点的 maxWorkerThreads 和 maxIOThreads 属性,手动设置进程中的线程数限制。   注意 辅助线程是用来处理 ASP.NET 请求的,而 IO 线程则是用于为来自文件、数据库或 XML Web services 的数据提供服务的。   分配给这些属性的值是进程中每个 CPU 每类线程的最大数目。对于双处理器计算机,最大数是设置值的两倍。对于四处理器计算机,最大值是设置值的四倍。无论如何,对于有四个或八个 CPU 的计算机,最好更改默认值。对于有一个或两个处理器的计算机,默认值就可以,但对于有更多处理器的计算机的性能,进程中有一百或两百个线程则弊大于利。   注意 进程中有太多线程往往会降低服务器的速度,因为额外的上下文交换导致操作系统将 CPU 周期花在维护线程而不是处理请求上。   16. 适当地使用公共语言运行库的垃圾回收器和自动内存管理   小心不要给每个请求分配过多内存,因为这样垃圾回收器将必须更频繁地进行更多的工作。另外,不要让不必要的指针指向对象,因为它们将使对象保持活动状态,并且应尽量避免含 Finalize 方法的对象,因为它们在后面会导致更多的工作。特别是在 Finalize 调用中永远不要释放资源,因为资源在被垃圾回收器回收之前可能一直消耗着内存。最后这个问题经常会对 Web 服务器环境的性能造成毁灭性的打击,因为在等待 Finalize 运行时,很容易耗尽某个特定的资源。   17. 如果有大型 Web 应用程序,可考虑执行预批编译   每当发生对目录的第一次请求时都会执行批编译。如果目录中的页面没有被分析并编译,此功能会成批分析并编译目录中的所有页面,以便更好地利用磁盘和内存。如果这需要很长时间,则将快速分析并编译单个页面,以便请求能被处理。此功能带给 ASP.NET 性能上的好处,因为它将许多页面编译为单个程序集。从已加载的程序集访问一页比每页加载新的程序集要快。   批编译的缺点在于:如果服务器接收到许多对尚未编译的页面的请求,那么当 Web 服务器分析并编译它们时,性能可能较差。为解决这个问题,可以执行预批编译。为此,只需在应用程序激活之前向它请求一个页面,无论哪页均可。然后,当用户首次访问您的站点时,页面及其程序集将已被编译。   没有简单的机制可以知道批编译何时发生。需一直等到 CPU 空闲或者没有更多的编译器进程(例如 csc.exe(C# 编译器)或 vbc.exe(Visual Basic 编译器))启动。   还应尽量避免更改应用程序的 \bin 目录中的程序集。更改页面会导致重新分析和编译该页,而替换 \bin 目录中的程序集则会导致完全重新批编译该目录。   在包含许多页面的大规模站点上,更好的办法可能是根据计划替换页面或程序集的频繁程度来设计不同的目录结构。不常更改的页面可以存储在同一目录中并在特定的时间进行预批编译。经常更改的页面应在它们自己的目录中(每个目录最多几百页)以便快速编译。   Web 应用程序可以包含许多子目录。批编译发生在目录级,而不是应用程序级。   18. 不要依赖代码中的异常   因为异常大大地降低性能,所以您不应该将它们用作控制正常程序流程的方式。如果有可能检测到代码中可能导致异常的状态,请执行这种操作。不要在处理该状态之前捕获异常本身。常见的方案包括:检查 null,分配给将分析为数字值的 String 一个值,或在应用数学运算前检查特定值。下面的示例演示可能导致异常的代码以及测试是否存在某种状态的代码。两者产生相同的结果。   try +üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
  { +üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
  result = 100 / num; +üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
  } +üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
  catch (Exception e) +üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
  { +üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
  result = 0; +üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
  } +üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
  // ...to this. +üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
  if (num != 0) +üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
  result = 100 / num; +üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
  else +üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
  result = 0;
  19. 使用 HttpResponse.Write 方法进行字符串串联 +üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
  该方法提供非常有效的缓冲和连接服务。但是,如果您正在执行广泛的连接,请使用多个 Response.Write 调用。下面示例中显示的技术比用对 Response.Write 方法的单个调用连接字符串更快。   Response.Write("a"); +üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
  Response.Write(myString); +üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
  Response.Write("b"); +üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
  Response.Write(myObj.ToString()); +üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
  Response.Write("c"); +üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
  Response.Write(myString2); +üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
  Response.Write("d");
  20. 除非有特殊的原因要关闭缓冲,否则使其保持打开+üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
  禁用 Web 窗体页的缓冲会导致大量的性能开销。   21. 只在必要时保存服务器控件视图状态   自动视图状态管理是服务器控件的功能,该功能使服务器控件可以在往返过程上重新填充它们的属性值(您不需要编写任何代码)。但是,因为服务器控件的视图状态在隐藏的窗体字段中往返于服务器,所以该功能确实会对性能产生影响。您应该知道在哪些情况下视图状态会有所帮助,在哪些情况下它影响页的性能。例如,如果您将服务器控件绑定到每个往返过程上的数据,则将用从数据绑定操作获得的新值替换保存的视图状态。在这种情况下,禁用视图状态可以节省处理时间。   默认情况下,为所有服务器控件启用视图状态。若要禁用视图状态,请将控件的EnableViewState 属性设置为 false,如下面的 DataGrid 服务器控件示例所示。
  您还可以使用 @ Page 指令禁用整个页的视图状态。当您不从页回发到服务器时,这将十分有用:+üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
<%@ Page EnableViewState="false" %>
  注意 @ Control 指令中也支持 EnableViewState 属性,该指令允许您控制是否为用户控件启用视图状态。   若要分析页上服务器控件使用的视图状态的数量,请(通过将 trace="true" 属性包括在 @ Page 指令中)启用该页的跟踪并查看 Control Hierarchy 表的 Viewstate 列。有关跟踪和如何启用它的信息,请参见 ASP.NET 跟踪。 22. 避免到服务器的不必要的往返过程   虽然您很可能希望尽量多地使用 Web 窗体页框架的那些节省时间和代码的功能,但在某些情况下却不宜使用 ASP.NET 服务器控件和回发事件处理。   通常,只有在检索或存储数据时,您才需要启动到服务器的往返过程。多数数据操作可在这些往返过程间的客户端上进行。例如,从 HTML 窗体验证用户输入经常可在数据提交到服务器之前在客户端进行。通常,如果不需要将信息传递到服务器以将其存储在数据库中,那么您不应该编写导致往返过程的代码。   如果您开发自定义服务器控件,请考虑让它们为支持 ECMAScript 的浏览器呈现客户端代码。通过以这种方式使用服务器控件,您可以显著地减少信息被不必要的发送到 Web 服务器的次数。   使用 Page.IsPostBack 避免对往返过程执行不必要的处理   如果您编写处理服务器控件回发处理的代码,有时可能需要在首次请求页时执行其他代码,而不是当用户发送包含在该页中的 HTML 窗体时执行的代码。根据该页是否是响应服务器控件事件生成的,使用 Page.IsPostBack 属性有条件地执行代码。例如,下面的代码演示如何创建数据库连接和命令,该命令在首次请求该页时将数据绑定到 DataGrid 服务器控件。   void Page_Load(Object sender, EventArgs e) +üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
  { +üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
  // Set up a connection and command here. +üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
  if (!Page.IsPostBack) +üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
  { +üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
  String query = "select * from Authors where FirstName like '%JUSTIN%'"; +üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
  myCommand.Fill(ds, "Authors"); +üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
  myDataGrid.DataBind(); +üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
  } +üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
  }
  由于每次请求时都执行 Page_Load 事件,上述代码检查 IsPostBack 属性是否设置为 false。如果是,则执行代码。如果该属性设置为 true,则不执行代码。+üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:
  注意 如果不运行这种检查,回发页的行为将不更改。Page_Load 事件的代码在执行服务器控件事件之前执行,但只有服务器控件事件的结果才可能在输出页上呈现。如果不运行该检查,仍将为 Page_Load 事件和该页上的任何服务器控件事件执行处理。   23. 当不使用会话状态时禁用它   并不是所有的应用程序或页都需要针对于具体用户的会话状态,您应该对任何不需要会话状态的应用程序或页禁用会话状态。   若要禁用页的会话状态,请将 @ Page 指令中的 EnableSessionState 属性设置为 false。例如: <%@ Page EnableSessi %>+üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:

  注意 如果页需要访问会话变量,但不打算创建或修改它们,则将 @ Page 指令中的 EnableSessionState 属性设置为 ReadOnly。   还可以禁用 XML Web services 方法的会话状态。有关更多信息,请参见使用 ASP.NET 和 XML Web services 客户端创建的 XML Web services。   若要禁用应用程序的会话状态,请在应用程序 Web.config 文件的 sessionstate 配置节中将 mode 属性设置为 off。例如: +üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:

  24. 仔细选择会话状态提供程序   ASP.NET 为存储应用程序的会话数据提供了三种不同的方法:进程内会话状态、作为 Windows 服务的进程外会话状态和 SQL Server 数据库中的进程外会话状态。每种方法都有自己的优点,但进程内会话状态是迄今为止速度最快的解决方案。如果只在会话状态中存储少量易失数据,则建议您使用进程内提供程序。进程外解决方案主要用于跨多个处理器或多个计算机缩放应用程序,或者用于服务器或进程重新启动时不能丢失数据的情况。有关更多信息,请参见 ASP.NET 状态管理。   25. 不使用不必要的Server Control   ASP.net中,大量的服务器端控件方便了程序开发,但也可能带来性能的损失,因为用户每操作一次服务器端控件,就产生一次与服务器端的往返过程。因此,非必要,应当少使用Server Control。   26. ASP.NET应用程序性能测试   在对ASP.NET应用程序进行性能测试之前,应确保应用程序没有错误,而且功能正确。具体的性能测试可以采用以下工具进行:   Web Application Strees Tool (WAS)是Microsoft发布的一个免费测试工具,可以从http://webtool.rte.microsoft.com/上下载。它可以模拟成百上千个用户同时对web应用程序进行访问请求,在服务器上形成流量负载,从而达到测试的目的,可以生成平均TTFB、平均TTLB等性能汇总报告。   Application Center Test (ACT) 是一个测试工具,附带于Visual Studio.NET的企业版中,是Microsoft正式支持的web应用程序测试工具。它能够直观地生成图表结果,功能比WAS多,但不具备多个客户机同时测试的能力。   服务器操作系统"管理工具"中的"性能"计数器,可以对服务器进行监测以了解应用程序性能。   结论:对于网站开发人员来说,在编写ASP.NET应用程序时注意性能问题,养成良好的习惯,提高应用程序性能,至少可以推迟必需的硬件升级,降低网站的成本。+üfyÿ?†5jbbs.51aspx.com{p0s¶(:Y|:

2009年3月5日星期四

SEO中如何理解伪静态?

伪静态是什么?

  伪静态就是:动态网页通过重写URL的方法实现去掉动态网页的参数,但在实际的网页目录中并没有必要实现存在重写的页面。

  伪静态的生成的2种方式:

  1,框架型伪静态,这种是非常简单而且也是非常便于识别的,它的原理比较简单,就是做一个静态的主框架页面,然后把动态的内容链入副框架内,这个单从它的URL就可以看出眉目,如果整个网站的URL都是一样的,那么就一定是框架伪静态的。

  2,利用组件把asp的后辍显示为htm,这种方法的原理是有一点难度的,它主要是利用一个组件强制性的把asp文件的后辍显示为htm,对于客户来说,它是很难分辨的,因为显示的链接的确是以.htm结尾的,不过如果仔细观察它的链接,也能看出来一些眉目,因为这种URL是很奇怪的,中间带有asp的子样,而且后面还有些参数,不过参数的结果已经被隐藏掉了,但是看到这些就应该保持戒心了;不过,还是有办法找出它的原形,就是看程序文件,去找和URL相同的网页,因为htm的网页都是真实存在的,如果找不到这个网页的话,那它是伪静态化无疑了。

  伪静态有什么用?

  我们做伪静态的目的就只有几种:

  1、 最主要的就是迎合搜索引擎方便搜索引擎蜘蛛(Spider)来抓取网页上的相关内容!

  2、 方便用户访问网站 一个好网页如果是动态的用户在相互传播时感觉对方信任度不会高但一看一个静态页相对用户对网页的信任度就高点而且伪静态的后缀方式基本雷同 一看就知道是伪静态还是真的静态网页!

  3、 伪静态对SEO有利嘛?SEO中的伪静态如何定义?!

  在影响网站在搜索引擎的排名中,有很重要的一条是网页静态化,很多朋友在研究SEO的时候,因为有些技术原因,伪静态成了最大的门槛。

  我们知道,在SEO优化中,new_1234.html要比new.asp?id=1234更容易收录,一般对于有独立服务器的朋友来说,你就可以使用ISAPI_Rewrite的方式写伪静态规则,而对于只有虚拟空间的朋友,可能你只能使用一些ASP生成HTML的系统来帮助你了。今天重点说一下利用ISAPI_Rewrite构建伪静态。

  第一:

  首先我们需要下载一个ISAPI_Rewrite,有精简版和完全版,一般精简版只能对服务器全局进行配置,而完整版可以对服务器上的各个网站进行伪静态配置。对于个人站长来说,精简版就足够了。

  第二:

  下载完成后,可以找到安装包里的.msi的文件,安装即可。

  第三:

  打开Internet 信息服务,右键,web站点属性,点击ISAPI筛选器选项卡.添加筛选器,这里的名称可以自己随意填写,路径自己指定ISAPI_Rewrite.dll,然后确定.

  下面我们先做一个测试页new.asp,可以按照下面的代码写  

  然后,在浏览器中输入:

  http://127.0.0.1/new.asp?id=1234

  接着你就可以在网页上看到一行文字:“1234”

  看到这几个数字,就说明你测试成功了。

  现在我们开始来配置ISAPI_Rewrite :

  打开ISAPI_Rewrite的目录,把httpd.ini的只读属性去掉,打开编辑。我们现在是需要把new.asp?id=1234修改成类似new_1234.html的路径,因此,我们需要在httpd.ini中添加一句

  RewriteRule /new_([0-9,a-z]*).html /new.asp?id={GetProperty(Content)}

  保存后,我们就可以测试一下这个网址了:http://127.0.0.1/new_1234.html

  可以看到页面上的“1234”了吧,就这样伪静态配置成功了!

  当然,以上只是简单的,根据实际情况,还有目录型的,还有翻页类型等等。

2009年1月3日星期六

博客终于被解锁了。高兴啊

一个月以前我在谷歌上申请了一个博客,基本上写了30篇文章,后来谷歌把我的博客定位垃圾博客,封锁了,真是郁闷,我好好的写文章,他突然给我封锁了,我申请了三次终于开通了,今天好高兴啊 ,终于可以写博客了,我还要接着继续讲解我的编程技术,希望大家接着关注我的编程爱好者博客。

wholesale retail company from china

achinaseller.com is a professional wholesale retail company, having our own factory with 5 years of wholesale retail experience. Achinaseller.com is also cooperating closely with many factories, so the price that we offer to the consumer is directly from the Chinese Factory. Without leaving your home, you could order your own products at achinaseller.com at the lowest price.
We service over 100,000 registered buyers, delivering to virtually every country in the world. Our warehouse and office are staffed by a young team of Chinese and Western staff.
Happy AchinaSeller buyers include frequent wholesale importers, famous ecommerce websites, eBay powersellers, retail shops and startup home import businesses. On a daily basis, we serve corporate buyers, drop-ship experts, home business Moms, and small bussiness wholesaler