Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9910452
  • 博文数量: 299
  • 博客积分: 9955
  • 博客等级: 中将
  • 技术积分: 4177
  • 用 户 组: 普通用户
  • 注册时间: 2008-02-27 20:59
文章分类
文章存档

2015年(1)

2012年(2)

2011年(9)

2010年(47)

2009年(108)

2008年(132)

我的朋友

分类: Mysql/postgreSQL

2009-10-02 10:52:12

第1章A S P初次接触
本章要点:
• 什么是A S P?它能帮助我们做什么?
• 怎样开发A S P程序?它在什么环境下运行?
1.1 ASP简介
1.1.1 什么是A S P
Microsoft Active Server Pages (ASP)实际上是将标准的H T M L文件拓展了一些附加特征,
A S P像标准的H T M L文件一样包含H T M L语句并且在一个浏览器上解释并显示。但它为H T M L编
写人员提供了在服务器端运行脚本的环境,使H T M L编写人员可以利用V B S c r i p t和J S c r i p t或其他
第三方脚本语言来创建A S P,实现过去需要编写复杂的C G I程序才能实现的有动态内容的网页,
如计数器等。一个A S P文件的后缀为. a s p,其中包含实现动态功能的V B S c r i p t或J S c r i p t语句,如
果去掉那些V B S c r i p t或J S c r i p t语句,它和标准的H T M L文件没有任何区别。A S P提供了一些内建
对象(参见后面关于内建对象的章节)。利用这些内建对象,你可以使你的脚本更加强大;这些
对象会允许您从浏览器中接收和发送信息。例如,利用r e q u e s t对象,你可以接收用户的H T M L表
单中的信息并加以处理。A S P包含标准的A c t i v e X组件(参见后面关于组件的章节),这些组件可
以实现一些复杂的功能,如使用数据库等。不过,你并不会被此局限,你可以轻松创建属于你
自己的附加A c t i v e X组件。这意味着你可以不加限制地拓展你的A c t i v e X组件(参见后面关于自
制组件的章节)。A S P可以和诸如SQL Server这样的数据库进行挂接,在本书后面的章节中,我
们将详细地学习这方面的内容。重要的是,这是A S P一个非常强大的功能所在,在线商务以及在
线论坛等各种非常高级的、动态更新的站点都需要数据库的支持,而且需要随数据库内容的更
新而自动更新,这样,你就可以利用A S P自己建立很多类似的高级站点。
通过上面的描述,我们可以了解到, A S P就是由服务器端脚本、对象以及组件拓展过的标准
网页并为其提供了运行的环境。而它的网页并不是在建立初期存在的,而是当某个浏览器向它
提出请求时,它才根据需要产生所需要的标准网页,这克服了过去H T M L编写的网页的静态缺点,
从而使网页上可以有许多动态的信息存在。如:当前的计算机时间、计数器的计数值等。
1.1.2 ASP的功能
A S P是一套服务器端的脚本运行环境,当用户从浏览器向We b服务器请求.asp 文件时,
ASP 脚本开始运行,然后Web 服务器调用A S P,A S P全面读取请求的文件,执行所有的脚本命
令,并将标准的Web 页传送给浏览器,而并不包含你所写的脚本命令。
对于Web 服务器来说, A S P与H T M L有着本质的区别, H T M L不经任何处理送回给浏览器,
而A S P的每一个命令都首先被用来生成H T M L文件,因此A S P允许生成动态内容。
另一方面,对于浏览器来说, A S P和H T M L几乎是没有区别的,仅仅是后缀为. a s p和. h t m的
区别,当我们在客户端提出对A S P的申请后,我们的浏览器接受的是H T M L格式的文件。因此它
适用于任何浏览器。
根据以上特性,我们用A S P可以方便地实现诸如表格信息收集、计数器、留言簿、公告板、
聊天室甚至电子商务等过去必须由C G I才能实现的功能。
A S P还可以轻松地实现对页面内容的动态控制,为不同的浏览者定制不同的页面内容,实现
个性化的网站。
1.1.3 使用范围
你在利用A S P实现各种功能时几乎没有什么限制,只要网站存在并正常运行,以下是简单的
应用示例列表:
• 在你的网站主页顶部添加一个滚动显示的广告栏。
• 从H T M L的表单中接受信息并且存到数据库中。
• 根据不同访问者显示不同内容,创建个性化主页。
• 在你的主页中添加点击计数器。
• 根据用户浏览器的版本、类型和能力显示不同档次的内容。
• 连接多个主页使之容易网际导航。
• 跟踪用户网站上的活动信息并且存入日志文件。
• 使用基于Windows NT的I n t r a n e t建立你的M I S应用。
用A S P编写出的系统,完全可以达到原来使用C l i e n t / S e r v e r的网络数据库系统的水平。使用
A S P最大的好处是,在你对程序进行升级时,你只需要修改服务器上的A S P文件,而不需要修改
客户端程序。
以上只是简单介绍,看完下面章节,你会对利用A S P做的事情有更加全面深入的了解。你会
真正学会如何使用A S P建立各种应用。
1.2 ASP的开发
1.2.1 环境的建立
A S P是微软开发的服务器端脚本环境, 内含于I I S(Internet Information Server)或P W S
(Personal Web Server)中,开发A S P应用程序系统必须符合以下三个要求之一:
• 如果你使用的是Windows NT Server 系统,那么你需要安装版本为3 . 0 / 4 . 0的I n t e r n e t
Information Server(I I S),3 . 0版本的I I S包含在Microsoft Visual Studio 97 中,也可到
h t t p : / / w w w. m i c r o s o f t . c o m去下载4 . 0版本的I I S。安装好后,I I S会在Windows NT所在的硬盘
上建立其主页发布路径\ I n e t p u b \ w w w r o o t,而I I S会在机器启动后自动执行。把你编写好的
A S P文件复制到这个路径下,当然,你应该具备在这个路径的读写权限。打开浏览器,在
2使用ASP与SQL Server 网站架设
下载
地址输入框内输入h t t p : / / l o c a l h o s t / t e s t 1 . a s p(假设你编写的A S P文件的名字是t e s t 1 . a s p),接
着,你便能看见运行结果了。
• 如果你使用的是Windows 95/98系统,那么你需要安装Personal Web Server(P W S),它可
以在Windows 98 的安装盘的To o l s \ P W S路径下找到。安装好后, P W S会在Wi n d o w s所在的
硬盘上建立其主页发布路径\ I n e t p u b \ w w w r o o t,而P W S会在机器启动后自动执行。把你编
写好的A S P文件复制到这个路径下,打开浏览器,在地址输入框内输入h t t p : / / l o c a l h o s t
/ t e s t 1 . a s p(假设你编写的A S P文件的名字是t e s t 1 . a s p),接着,你便能看见运行结果了。
• 如果你拥有自己租用的虚拟空间,并且有C G I和A S P的权限,则可直接把文件复制到管理
员给你的路径上。
注意,如果你在I I S的当前机器上使用浏览器,请注意你怎样才能在浏览器上执行A S P。当
你用网络浏览器时调用A S P,不能直接在open 命令中调用,在这种情况, I I S以及A S P是不会运
行的。此时,你将看到A S P脚本的文本而不是它执行的结果。这肯定不是你所希望的。
A S P自身提供了V B S c r i p t和J S c r i p t的驱动程序。A S P可以将可执行的脚本直接嵌入H T M L文
件,H T M L开发和脚本开发在同一开发过程中就可完成。
1.2.2 开发工具
实际上A S P的应用程序就是以. a s p为扩展名的纯文本文件,你可以用任何文本编辑器打开并
编辑它(如记事本)。A S P程序中可以包含注释、H T M L标记以及脚本命令。你只需将. a s p程序
放在We b服务器的虚拟目录下(该目录必须要有可执行权限),就可以通过H T T P的方式访问A S P
程序了。
使用那些带有ASP 增强支持的编辑器将更能提高效率,如Microsoft Visual InterDev 。
Visual InterDev 是数据库工具,它能轻松地建立“开放数据库连接” ( O D B C )的数据库。如果您
从未使用过H T M L,请考虑先使用Microsoft FrontPage 。使用FrontPage 创建文档和格式化文
本就像使用文字处理工具一样简单。接下来还可以使用Insert Script 命令在FrontPage 创建的
HTML 页中插入简单的ASP 命令。
1.2.3 程序编写
在A S P中,所有脚本命令都由定界符<% 和%> 包含,任何在这个符号中包含的内容都被认
为是一个脚本,你可以在其中插入任何命令,只要这个命令对正在使用的脚本语言有效即可。
下面是个例子:
< h t m l >
ASP Scrip示t例 < / t i t l e > < / h e a d ><BR>< b o d y ><BR>这是个<BR><% FOR I=1 to 10 %><BR>非常,<BR><% NEXT %><BR>非常长的句子。<BR>第1章A S P初次接触使用3<BR>下载<BR>< / b o d y ><BR>< / h t m l ><BR>在记事本中输入以上代码,保存为\Inetpub\wwwroot \test.asp,打开浏览器,在地址输入框<BR>内输入h t t p : / / l o c a l h o s t / t e s t . a s p。<BR>该段Active Server Pages执行后在浏览器上显示为:<BR>这是个非常,非常,非常,非常,非常,非常,非常,非常,非常,非常,非常长的句子。<BR>这段脚本利用V B s c r i p t的F o r. . . N e x t循环生成了1 0个“非常”的拷贝。<BR>A S P默认为您主要使用的是V B s c r i p t,也就是说,在使用< %和% >时不需要做任何事情来说<BR>明使用何种语言。A S P也可以使用任何一个可以和Active X Script标准兼容的脚本语言引擎,不<BR>过,需要用A S P的处理指令来指定。下面描述具体的处理指令。<BR>ASP 提供了您使用的脚本语言以外的指令。这是一些输出指令和处理指令。<BR>ASP 的输出指令<%= expression %> 显示表达式的值,e x p r e s s i o n为任何有效的表达式。以<BR>下是个例子:<BR>< h t m l ><BR>< h e a d > < t i t l e > A S P示例< / t i t l e > < / h e a d ><BR>< b o d y ><BR>现在的时间: <%=time%><BR>< / b o d y ><BR>< / h t m l ><BR>在上面的例子中,V B S c r i p t的时间函数值会输出到显示器上。<BR>你可以用下面的方法完成同样的事,见下面例子:<BR>< h t m l ><BR>< h e a d > < t i t l e > A S P示例< / t i t l e > < / h e a d ><BR>< b o d y ><BR>现在的时间: <%R e s p o n s e . W r i t e ( T I M E ) % ><BR>< / b o d y ><BR>< / h t m l ><BR>在这个例子中, V B S c r i p t的Ti m e函数值将被A S P的R e s p o n s e对象输出来, r e s p o n s e对象的<BR>w r i t e ( )方法是将表达式中的值显示出来(下一章中,你会学到更多有关对象和方法的知识)。<BR>那么补充说明的是对于A S P内部< % =和% >也就是代表了R e s p o n s e . w r i t e ( )方法,因此无论你<BR>用哪一种方法其实是一样的,没有任何区别。<BR>ASP 处理指令<%@ keyword %> 为ASP 提供处理.asp 文件所需的信息。<BR>处理指令必须出现在.asp 文件的第一行。必须在@标记和关键字之间加入一个空格。处理<BR>指令有下列关键字:<BR>• LANGUAGE 关键字设置页的脚本语言: <%@ LANGUAGE=VBScript %> 将本页的主脚<BR>本语言设置为V B S c r i p t。A S P的默认主脚本语言为V B S c r i p t,你也可以将任何一种具有脚<BR>本引擎的脚本语言设置为本页的主脚本语言。主脚本语言是用来处理在分界符<% 和% ><BR>之间的命令的语言。<BR>• C O D E PAGE 关键字设置页的代码页(字符编码):指明ASP 处理某一特定页时所用的字<BR>4使用ASP与SQL Server 网站架设<BR>下载<BR>符集,<%@ CODEPAGE= 950 %>将本页代码页设置为中文繁体字符集。<BR>• LCID 关键字设置页的现场标识符:现场决定日期和时间、项目的格式, <%@ LCID =<BR>1041 %>把现场设置为日文现场。<BR>• TRANSACTION 关键字指定将在事务处理环境下运行的页。<BR>• ENABLESESSIONSTATE 关键字指定ASP 页是否使用会话状态。<BR>可以在单个指令中包含多个关键字;关键字/值对之间必须由空格分开。不要在等号( =)左<BR>右加入空格。下面的例子中设置了脚本语言和代码页:<BR><%@ LANGUAGE= VBScript CODEPAGE=950 %><BR>如果您的主脚本语言是VBScript 或者J S c r i p t,ASP 从指令中删除空白字符。使用其他脚本<BR>语言时,ASP 保留空白字符。空白字符包括空格、制表符、回车和换行符。<BR>使用VBScript 和JScript 时,在打开定界符之后和关闭定界符之前使用空白字符更容易阅读<BR>命令。下面的命令都是合法的:<BR><% Color = "Green" %><BR>< % C o l o r = " G r e e n " % ><BR>< %<BR>Color = "Green"<BR>% ><BR>1.2.4 Global.asa文件<BR>为了使A S P更好地工作, A S P设置了一个专用的G l o b a l . a s a文件,G l o b a l . a s a文件是一个可选<BR>文件,用户可以在该文件中指定事件脚本,并声明具有会话和应用程序作用域的对象。该文件<BR>的内容不是给用户显示的,而是用来存储事件信息和由应用程序全局使用的对象。该文件的名<BR>称必须是Global.asa 且必须存放在应用程序的根目录中。每个应用程序只能有一个Global.asa 文<BR>件。<BR>Global.asa 文件只能包含如下内容:<BR>• 应用程序事件。<BR>• 会话事件。<BR>• <OBJECT> 声明。<BR>• TypeLibrary 声明。<BR>应用程序有两个事件,即Application_OnStart 事件和Application_OnEnd 事件。<BR>会话有两个事件,即Session_OnStart 事件和Session_OnEnd 事件。<BR>可以用任何支持脚本的语言编写Global.asa 文件中包含的脚本。如果多个事件使用同一种脚<BR>本语言,就可以将它们组织在一组<SCRIPT> 标记中。<BR>当用户保存对Global.asa 文件所做的更改时,在重新编译Global.asa 文件之前,服务器会结<BR>束处理当前应用程序的所有请求。在此期间,服务器拒绝其他请求并返回一个错误消息,说明<BR>正在重启动应用程序,不能处理请求。<BR>当用户当前的所有请求处理完之后,服务器对每个会话调用Session_OnEnd 事件,删除所<BR>第1章A S P初次接触使用5<BR>下载<BR>有活动会话,并调用Application_OnEnd 事件关闭应用程序,然后编译Global.asa 文件。接下来,<BR>用户的请求将启动应用程序并创建新的会话,触发Application_OnStart 和Session_OnStart 事<BR>件。<BR>但是,对Global.asa 文件中所包含的文件的更改与保存并不能使服务器重新编译G l o b a l . a s a。<BR>为了让服务器识别包含文件的改动,必须再重新保存一下Global.asa 文件,如在G L o b a l . a s a 文<BR>件中加一个空格,然后保存它。<BR>1.3 ASP的安全性<BR>不论是在Windows 98 还是Windows NT下编写调试A S P应用程序,最终A S P应用程序还是会<BR>应用在基于Microsoft Internet Information Server(IIS)的I n t e r n e t或I n t r a n e t上,那么,它是不是安<BR>全呢?IIS 是运行在Windows NT Server上的信息服务,它提供F T P、W W W等广泛使用的I n t e r n e t<BR>和I n t r a n e t服务。而A S P的运行环境由I I S提供,所以,I I S是否安全直接影响到A S P的安全。<BR>1.3.1 Windows NT和I I S<BR>I I S是Windows NT Server上的信息服务,它与Windows NT的用户账户和用户组有着密切的<BR>联系。Windows NT安全性的核心之一是用户账户和组。在安装I I S的过程中,自动建立两个用户<BR>账户,它们被赋予一定的用户权力,并被放入特殊的组。这两个账户是I U S R _计算机名和<BR>I WA M 计算机名。I U S R 计算机名用于匿名访问。I WA M 计算机名由M i c r o s o f t事务处理服务<BR>(M T S)和其他I I S应用程序使用。<BR>由于I I S是Windows NT Server本地的一个服务,而账户I U S R又用于I I S,相当于用户以交互<BR>方式登录到服务器上,所以必须赋予I U S R 计算机名“在本机登录”的权力。任何匿名访问者都<BR>具备赋予I U S R 计算机名的权力。如果不使用这个缺省匿名账户,可以指定其他用户账户作为匿<BR>名账户,并为这个账户指定合适的用户权力。<BR>在提供其他验证方式时, I I S与N T用户账户也有着密切的联系,这些方式都需要有效的用户<BR>账户。虽然I I S建立了匿名用户I U S R _计算机名,但并没有建立用于其他验证方式的用户账户,<BR>应由管理员建立并管理与这些验证方式相关的用户账户。<BR>Windows NT提供两种文件系统, FAT和N T F S。虽然I I S能在FAT分区上正常工作,但N T F S<BR>文件系统有更多的优越性,例如:<BR>1) 对于FAT文件系统(如D O S),N T F S是不可见的,避免了使用D O S命令对资源的破坏。<BR>2) NTFS文件系统能更有效地管理硬盘资源。<BR>3) NTFS允许对用户和组设置资源的访问权限,即配置资源的访问控制列表( A C L)。A C L<BR>是指与某一资源,如文件或目录有关的用户、组及他们对资源的访问权限。A C L是Windows NT<BR>安全模型的又一个核心内容,它提供了对硬盘资源灵活、精确的访问控制。每个目录或文件都<BR>有自己的A C L,每个A C L本身又有一个A C L,用于指定谁有权查看和更改A C L。N T F S和A C L是<BR>保护服务器资源的基础。<BR>I I S提供We b权限,如读和写, N T F S也有它的读写权限,两者容易引起混淆。I I S权限与<BR>N T F S权限的关键区别在于: We b权限控制允许对H T T P资源执行的H T T P命令, N T F S权限控制<BR>6使用ASP与SQL Server 网站架设<BR>下载<BR>用户对硬盘资源的访问权限。当浏览器发出资源请求时, H T T P命令随头信息一起发送,例如,<BR>一个用户请求读取( G E T )一个We b页,发送的头信息指定资源、资源的位置,另外还要发送动词<BR>G E T,这个动词告诉I I S,本次请求要对资源进行“读”操作。选择I I S的We b主目录标签、目录<BR>标签或虚拟目录标签的“读取”、“写入”复选框,可以设置上述We b权限。如果We b权限是读,<BR>并不意味着也设置了N T F S的读权限。因为We b权限只控制在H T T P请求中能够使用的H T T P命令。<BR>反过来,如果设置N T F S权限是读,意味着We b权限也是读。如果N T F S权限是读,即使We b权限<BR>是读写, H T T P的写请求也会失败。如果We b权限和N T F S权限不一致,H T T P请求将使用两者权<BR>限中最严格的一个。<BR>1.3.2 IIS安全漏洞<BR>当A S P以其灵活、简单、实用、强大的特性迅速风靡全球网站的时候,其本身的一些缺陷、<BR>漏洞也正威胁着所有的网站开发者。所有的A S P应用程序开发者应密切关注,提高警惕。<BR>微软再次被指责对其出品的We b服务器软件的安全问题不加重视。在微软的流行产品I I S<BR>S e v e r 4 . 0中发现存在一种被称为“非法H T R请求”的缺陷。据微软称,此缺陷在特定情况下会导<BR>致任意代码都可以在服务器端运行。但用发现这一漏洞的I n t e r n e t安全公司e E y e的CEO Firas<BR>B u s h n a q的话说:这只是冰山一角而已。B u s h n a q说,微软隐瞒了些情况,比如黑客可以利用这<BR>一漏洞对I I S服务器进行完全的控制,而恰恰许多电子商务站点是基于这套系统的。<BR>尽管I I S存在一些漏洞,但它的强大功能正被许多程序开发者所认识,而微软也在不断地发<BR>行更高版本的A S P,以提高其安全性。我们不能因为一些缺陷而放弃功能如此强大而又易于学习<BR>使用的服务器应用程序开发环境。为了尽量使自己的网站安全,使自己的A S P应用程序安全,应<BR>合理进行I I S的系统配置。<BR>以下是I I S系统配置的安全性建议,希望能给大家一些帮助:<BR>• 使用最新版本的I I S 4 . 0,并安装N T最新版本的Service Pack5,服务器的文件系统不要使用<BR>FAT,应该使用N T F S。<BR>• 把I I S中的s a m p l e、s c r i p t s、i i s a d m i n和m s a d c等We b目录设置为禁止匿名访问并限制I P地址。<BR>在微软还没有提供补丁之前,把i s m . d l l有关的应用程序映射删除。<BR>• 有条件的话就采用防火墙机制,最简单的方法有, We b服务器开在前台,目录放在后台。<BR>如果能用一个服务器一台机当然最好。<BR>• We b目录、C G I目录、s c r i p t s目录和w i n n t目录等重要目录要用N T F S的特性设置详细的安全<BR>权限,包含注册表信息的Wi n n t目录只允许管理员完全控制,一般的用户只读的权限也不<BR>要给。凡是与系统有关的重要文件,除了A d m i n i s t r a t o r,其他账号都应该设置为只读权限,<BR>而不是e v e r y o n e。<BR>• 只开你需要的服务,关掉所有不应该打开的端口,如N e t B i o s端口1 3 9,这是一个典型的危险<BR>端口;怎样禁止这些端口?除了使用防火墙外, N T的T C P / I P设置里面也提供了这种功能:<BR>打开“控制面板|网络|协议| T C P / I P |属性|高级|启用安全机制|配置”,这里面提供了T C P和<BR>U D P端口的限制和I P协议的限制功能。<BR>• 管理员的账号要设置得复杂一些,建议加入特殊字符。<BR>第1章A S P初次接触使用7<BR>下载<BR>• 把F T P、Te l n e t的T C P端口改为非标准端口,通常笔者都是设置到10 000~65 000的范围。<BR>• 删除可以删除的所有共享,包括打印机共享和隐藏的共享如I C P $和A d m i n $等,微软说这<BR>些特殊共享资源很重要,大多数情况下不能删除,而实际上放在I n t e r n e t上的机器大多数不<BR>需要共享。IPC$: 适用于远程管理计算机和查看共享资源,在网上最好不要用。Admin$: 实<BR>际上就是c : \ w i n n t,也没有必要共享。C$: 登录为A d m i n和B a c k u p - o p e r a t o r的用户可以用\ \<BR>计算机名\ C $的方式访问C盘,虽然仅限于局域网,但是远程黑客也有办法伪装成局域网的<BR>登录用户,所以都应该关掉。Print$: 这是放打印机驱动程序的目录,也是个很危险的入口。<BR>Netlogon: 这是处理域登录请求的共享。如果你的机器为主域控制器,域内有其他机器要<BR>登录进来,就不要删除它,否则照样可以删除。用“服务器管理器”|“共享目录”|“停<BR>止共享”。<BR>• 将A S P的目录集中管理,为A S P的程序目录设置详尽的访问权限。<BR>• 把w i n n t下的s a m . 文件改名,实践证明这个可能泄露密码的文件可以删除不要。<BR>• 对于已知的N T安全漏洞,都应该在自己的机器上做测试检查。并及时安装补丁程序。<BR>• 有必要的情况下采用I I S 4 . 0提供的S S L安全通信机制来防止数据在网上被截获。</DIV> </div> <!-- <div class="Blog_con3_1">管理员在2009年8月13日编辑了该文章文章。</div> --> <div class="Blog_con2_1 Blog_con3_2"> <div> <!--<img src="/image/default/tu_8.png">--> <!-- JiaThis Button BEGIN --> <div class="bdsharebuttonbox"><A class=bds_more href="#" data-cmd="more"></A><A class=bds_qzone title=分享到QQ空间 href="#" data-cmd="qzone"></A><A class=bds_tsina title=分享到新浪微博 href="#" data-cmd="tsina"></A><A class=bds_tqq title=分享到腾讯微博 href="#" data-cmd="tqq"></A><A class=bds_renren title=分享到人人网 href="#" data-cmd="renren"></A><A class=bds_weixin title=分享到微信 href="#" data-cmd="weixin"></A></div> <script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script> <!-- JiaThis Button END --> </div> 阅读(1106) | 评论(0) | 转发(0) | <div class="HT_line3"></div> </div> <div class="Blog_con3_3"> <div><span id='digg_num'>0</span><a href="javascript:void(0)" id='digg' bid='1901395' url='/blog/digg.html' ></a></div> <p>上一篇:<a href="/uid-20671486-id-1901394.html">庆祝祖国六十华诞生日</a></p> <p>下一篇:<a href="/uid-20671486-id-1901396.html">A S P的内嵌对象</a></p> </div> </div> <!-- <div class="Blog_con3_4 Blog_con3_5"> <div class="Blog_tit2 Blog_tit7">热门推荐</div> <ul> <li><a href="" title="" target='blank' ></a></li> </ul> </div> --> </div> </div> <div class="Blog_right1_7" id='replyList'> <div class="Blog_tit3">给主人留下些什么吧!~~</div> <!--暂无内容--> <!-- 评论分页--> <div class="Blog_right1_6 Blog_right1_12"> </div> <!-- 评论分页--> <div class="Blog_right1_10" style="display:none"> <div class="Blog_tit3">评论热议</div> <!--未登录 --> <div class="Blog_right1_8"> <div class="nologin_con1"> 请登录后评论。 <p><a href="http://account.chinaunix.net/login" onclick="link(this)">登录</a> <a href="http://account.chinaunix.net/register?url=http%3a%2f%2fblog.chinaunix.net">注册</a></p> </div> </div> </div> <div style="text-align:center;margin-top:10px;"> <script type="text/javascript" smua="d=p&s=b&u=u3118759&w=960&h=90" src="//www.nkscdn.com/smu0/o.js"></script> </div> </div> </div> </div> <input type='hidden' id='report_url' value='/blog/ViewReport.html' /> <script type="text/javascript"> //测试字符串的长度 一个汉字算2个字节 function mb_strlen(str) { var len=str.length; var totalCount=0; for(var i=0;i<len;i++) { var c = str.charCodeAt(i); if ((c >= 0x0001 && c <= 0x007e) || (0xff60<=c && c<=0xff9f)) { totalCount++; }else{ totalCount+=2; } } return totalCount; } /* var Util = {}; Util.calWbText = function (text, max){ if(max === undefined) max = 500; var cLen=0; var matcher = text.match(/[^\x00-\xff]/g), wlen = (matcher && matcher.length) || 0; //匹配url链接正则 http://*** var pattern = /http:\/\/([\w-]+\.)+[\w-]+(\/*[\w-\.\/\?%&=][^\s^\u4e00-\u9fa5]*)?/gi; //匹配的数据存入数组 var arrPt = new Array(); var i = 0; while((result = pattern.exec(text)) != null){ arrPt[i] = result[0]; i++; } //替换掉原文本中的链接 for(var j = 0;j<arrPt.length;j++){ text = text.replace(arrPt[j],""); } //减掉链接所占的长度 return Math.floor((max*2 - text.length - wlen)/2 - 12*i); }; */ var allowComment = '0'; //举报弹出层 function showJuBao(url, cid){ $.cover(false); asyncbox.open({ id : 'report_thickbox', url : url, title : '举报违规', width : 378, height : 240, scroll : 'no', data : { 'cid' : cid, 'idtype' : 2 , 'blogurl' : window.location.href }, callback : function(action){ if(action == 'close'){ $.cover(false); } } }); } $(function(){ //创建管理员删除的弹出层 $('#admin_article_del').click(function(){ $.cover(false); asyncbox.open({ id : 'class_thickbox', html : '<div class="HT_layer3_1"><ul><li class="HT_li1">操作原因:<select class="HT_sel7" id="del_type" name="del_type"><option value="广告文章">广告文章</option><option value="违规内容">违规内容</option><option value="标题不明">标题不明</option><option value="文不对题">文不对题</option></select></li><li class="HT_li1" ><input class="HT_btn4" id="admin_delete" type="button" /></li></ul></div>', title : '选择类型', width : 300, height : 150, scroll : 'no', callback : function(action){ if(action == 'close'){ $.cover(false); } } }); }); $('#admin_delete').live('click' , function(){ ///blog/logicdel/id/3480184/url/%252Fblog%252Findex.html.html var type = $('#del_type').val(); var url = '/blog/logicdel/id/1901395/url/%252Fuid%252F20671486.html.html'; window.location.href= url + '?type=' + type; }); //顶 js中暂未添加&过滤 $('#digg').live('click' , function(){ if(isOnLine == '' ) { //showErrorMsg('登录之后才能进行此操作' , '消息提示'); showErrorMsg('操作失败,您需要先登录!', '消息提示', 'http://account.chinaunix.net/login'); return false; } var bid = $('#digg').attr('bid'); var url = $('#digg').attr('url'); var digg_str = $.cookie('digg_id'); if(digg_str != null) { var arr= new Array(); //定义一数组 arr = digg_str.split(","); //字符分割 for( i=0 ; i < arr.length ; i++ ) { if(bid == arr[i]) { showErrorMsg('已经赞过该文章', '消息提示'); return false; } } } $.ajax({ type:"POST", url:url, data: { 'bid' : bid }, dataType: 'json', success:function(msg){ if(msg.error == 0) { var num = parseInt($('#digg_num').html(),10); num += 1; $('#digg_num').html(num); $('#digg').die(); if(digg_str == null) { $.cookie('digg_id', bid, {expires: 30 , path: '/'}); } else { $.cookie('digg_id', digg_str + ',' + bid, {expires: 30 , path: '/'}); } showSucceedMsg('谢谢' , '消息提示'); } else if(msg.error == 1) { //showErrorMsg(msg.error_content , '消息提示'); showErrorMsg('操作失败,您需要先登录!', '消息提示', 'http://account.chinaunix.net/login'); } else if(msg.error == 2) { showErrorMsg(msg.error_content , '消息提示'); } } }); }); //举报弹出层 /*$('.box_report').live('click' , function(){ if(isOnLine == '' ) { //showErrorMsg('登录之后才能进行此操作' , '消息提示'); showErrorMsg('操作失败,您需要先登录!', '消息提示', 'http://account.chinaunix.net/login'); return false; } var url = $('#report_url').val(); var cid = $(this).attr('cid'); $.cover(false); asyncbox.open({ id : 'report_thickbox', url : url, title : '举报违规', width : 378, height : 240, scroll : 'no', data : { 'cid' : cid, 'idtype' : 2 }, callback : function(action){ if(action == 'close'){ $.cover(false); } } }); });*/ //评论相关代码 //点击回复显示评论框 $('.Blog_a10').live('click' , function(){ if(isOnLine == '' ) { //showErrorMsg('登录之后才能进行此操作' , '消息提示'); showErrorMsg('操作失败,您需要先登录!', '消息提示', 'http://account.chinaunix.net/login'); return false; } if(allowComment == 1) { showErrorMsg('该博文不允许评论' , '消息提示'); return false; } var tid = $(this).attr('toid');//留言作者id var bid = $(this).attr('bid');//blogid var cid = $(this).attr('cid');//留言id var tname = $(this).attr('tname'); var tpl = '<div class="Blog_right1_9">'; tpl += '<div class="div2">'; tpl += '<textarea name="" cols="" rows="" class="Blog_ar1_1" id="rmsg">文明上网,理性发言...</textarea>'; tpl += '</div>'; tpl += '<div class="div3">'; tpl += '<div class="div3_2"><a href="javascript:void(0);" class="Blog_a11" id="quota_sbumit" url="/Comment/PostComment.html" tid="'+tid+'" bid="'+bid+'" cid="'+cid+'" tname="'+tname+'" ></a><a href="javascript:void(0)" id="qx_comment" class="Blog_a12"></a></div>'; tpl += '<div class="div3_1"><a href="javascript:void(0);" id="mface"><span></span>表情</a></div>'; tpl += '<div class="clear"></div>'; tpl += '</div>'; tpl += '</div>'; $('.z_move_comment').html(''); $(this).parents('.Blog_right1_8').find('.z_move_comment').html(tpl).show(); }); //引用的评论提交 $('#quota_sbumit').live('click' , function(){ if(isOnLine == '' ) { //showErrorMsg('登录之后才能进行此操作' , '消息提示'); showErrorMsg('操作失败,您需要先登录!', '消息提示', 'http://account.chinaunix.net/login'); return false; } var bid = $(this).attr('bid'); var tid = $(this).attr('tid');//被引用人的id var qid = $(this).attr('cid');//引用的id var url = $(this).attr('url'); var text = $('#rmsg').val(); var tname = $(this).attr('tname'); if(text == '' || text=='文明上网,理性发言...') { showErrorMsg('评论内容不能为空!' , '消息提示'); return false; } else { if(mb_strlen(text) > 1000){ showErrorMsg('评论内容不能超过500个汉字' , '消息提示'); return false; } } $.ajax({ type: "post", url: url , data: {'bid': bid , 'to' : tid , 'qid' : qid , 'text': text , 'tname' : tname }, dataType: 'json', success: function(data){ if(data.code == 1){ var tpl = '<div class="Blog_right1_8">'; tpl+= '<div class="Blog_right_img1"><a href="' +data.info.url+ '" >' + data.info.header + '</a></div>'; tpl+= '<div class="Blog_right_font1">'; tpl+= '<p class="Blog_p5"><span><a href="' +data.info.url+ '" >' + data.info.username + '</a></span>' + data.info.dateline + '</p>'; tpl+= '<p class="Blog_p7"><a href="' + data.info.quota.url + '">' + data.info.quota.username + '</a>:'+ data.info.quota.content + '</p>'; tpl+= '<p class="Blog_p8">' + data.info.content + '</p><span class="span_text1"><a href="javascript:void(0);" class="Blog_a10" toid=' + data.info.fuid + ' bid=' + data.info.bid + ' cid=' + data.info.cid + ' tname = ' + data.info.username + ' >回复</a> |  <a class="comment_del_mark" style="cursor:pointer" url="' + data.info.delurl + '" >删除</a> |  <a href="javascript:showJuBao(\'/blog/ViewReport.html\','+data.info.cid+')" class="box_report" cid="' + data.info.cid + '" >举报</a></span></div>'; tpl+= '<div class="z_move_comment" style="display:none"></div>'; tpl+= '<div class="Blog_line1"></div></div>'; $('#replyList .Blog_right1_8:first').before(tpl); $('.z_move_comment').html('').hide(); } else if(data.code == -1){ //showErrorMsg(data.info , '消息提示'); showErrorMsg('操作失败,您需要先登录!', '消息提示', 'http://account.chinaunix.net/login'); } }, error: function(){//请求出错处理 } }); }); //底部发表评论 $('#submitmsg').click(function(){ if(allowComment == 1) { showErrorMsg('该博文不允许评论' , '消息提示'); return false; } var bid = $(this).attr('bid'); var toid = $(this).attr('toid'); var text = $('#reply').val(); var url = $(this).attr('url'); if(text == '' || text=='文明上网,理性发言...') { showErrorMsg('评论内容不能为空!' , '消息提示'); return false; } else { if(mb_strlen(text) > 1000){ showErrorMsg('评论内容不能超过500个汉字' , '消息提示'); return false; } } $.ajax({ type: "post", url: url , data: {'bid': bid , 'to' : toid ,'text': text}, dataType: 'json', success: function(data){ if(data.code == 1) { var tpl = '<div class="Blog_right1_8">'; tpl += '<div class="Blog_right_img1"><a href="' +data.info.url+ '" >' + data.info.header + '</a></div>'; tpl += '<div class="Blog_right_font1">'; tpl += '<p class="Blog_p5"><span><a href="' +data.info.url+ '" >' + data.info.username + '</a></span>' + data.info.dateline + '</p>'; tpl += '<p class="Blog_p6">' + data.info.content + '</p>'; tpl += '<div class="div1"><a href="javascript:void(0);" class="Blog_a10" toid=' + data.info.fuid + ' bid=' + data.info.bid + ' cid=' + data.info.cid + '>回复</a> |  <a class="comment_del_mark" style="cursor:pointer" url="' + data.info.delurl + '">删除</a> |  <a href="javascript:showJuBao(\'/blog/ViewReport.html\','+data.info.cid+')" class="box_report" cid="' + data.info.cid + '">举报</a></div>'; tpl += '<div class="z_move_comment" style="display:none"></div>'; tpl += '</div><div class="Blog_line1"></div></div>'; $('.Blog_tit3:first').after(tpl); $('#reply').val('文明上网,理性发言...'); } else if(data.code == -1) { showErrorMsg(data.info , '消息提示'); } }, error: function(){//请求出错处理 } }); }); //底部评论重置 $('#reset_comment').click(function(){ $('#reply').val('文明上网,理性发言...'); }); //取消回复 $('#qx_comment').live('click' , function(){ $('.z_move_comment').html('').hide(); }); $('#rmsg, #reply').live({ focus:function(){ if($(this).val() == '文明上网,理性发言...'){ $(this).val(''); } }, blur:function(){ if($(this).val() == ''){ $(this).val('文明上网,理性发言...'); } } }); //删除留言确认 $('.comment_del_mark').live('click' , function(){ var url = $(this).attr('url'); asyncbox.confirm('删除留言','确认', function(action){ if(action == 'ok') { location.href = url; } }); }); //删除时间确认 $('.del_article_id').click(function(){ var delurl = $(this).attr('delurl'); asyncbox.confirm('删除文章','确认', function(action){ if(action == 'ok') { location.href = delurl; } }); }); /* //字数限制 $('#rmsg, #reply').live('keyup', function(){ var id = $(this).attr('id'); var left = Util.calWbText($(this).val(), 500); var eid = '#errmsg'; if(id == 'reply') eid = '#rerrmsg'; if (left >= 0) $(eid).html('您还可以输入<span>' + left + '</span>字'); else $(eid).html('<font color="red">您已超出<span>' + Math.abs(left) + '</span>字 </font>'); }); */ //加载表情 $('#face').qqFace({id : 'facebox1', assign : 'reply', path : '/image/qqface/'}); $('#mface').qqFace({id : 'facebox', assign : 'rmsg', path:'/image/qqface/'}); /* $('#class_one_id').change(function(){ alert(123213); var id = parseInt($(this).val() , 10); if(id == 0) return false; $('.hidden_son_class span').each(function( index , dom ){ if( dom.attr('cid') == id ) { } }); }); */ //转载文章 var turn_url = "/blog/viewClassPart.html"; $('#repost_bar').click(function(){ if(isOnLine == '' ) { //showErrorMsg('登录之后才能进行此操作' , '消息提示'); showErrorMsg('操作失败,您需要先登录!', '消息提示', 'http://account.chinaunix.net/login'); return false; } var id = $(this).attr('bid'); asyncbox.open({ id : 'turn_class_thickbox', url : turn_url, title : '转载文章', width : 330, height : 131, scroll : 'no', data : { 'id' : id }, callback : function(action){ if(action == 'close'){ $.cover(false); } } }); }); /* //转发文章 $('#repost_bar').live('click' , function(){ if(isOnLine == '' ) { //showErrorMsg('登录之后才能进行此操作' , '消息提示'); showErrorMsg('操作失败,您需要先登录!', '消息提示', 'http://account.chinaunix.net/login'); return false; } var bid = $(this).attr('bid'); var url = $(this).attr('url'); asyncbox.confirm('转载文章','确认', function(action){ if(action == 'ok'){ $.ajax({ type:"POST", url:url, data: { 'bid' : bid }, dataType: 'json', success:function(msg){ if(msg.error == 0){ showSucceedMsg('转发成功!', '消息提示'); }else if(msg.error == 1){ //location.href = '/index.php?r=site/login'; showErrorMsg('操作失败,您需要先登录!', '消息提示', 'http://account.chinaunix.net/login'); }else{ showErrorMsg(msg.error_content, '消息提示'); } } }); } }); }); */ }); </script> <!--该部分应该放在输出代码块的后面才起作用 --> <script type="text/javascript"> SyntaxHighlighter.autoloader( 'applescript /highlight/scripts/shBrushAppleScript.js', 'actionscript3 as3 /highlight/scripts/shBrushAS3.js', 'bash shell /highlight/scripts/shBrushBash.js', 'coldfusion cf /highlight/scripts/shBrushColdFusion.js', 'cpp c /highlight/scripts/shBrushCpp.js', 'c# c-sharp csharp /highlight/scripts/shBrushCSharp.js', 'css /highlight/scripts/shBrushCss.js', 'delphi pascal /highlight/scripts/shBrushDelphi.js', 'diff patch pas /highlight/scripts/shBrushDiff.js', 'erl erlang /highlight/scripts/shBrushErlang.js', 'groovy /highlight/scripts/shBrushGroovy.js', 'java /highlight/scripts/shBrushJava.js', 'jfx javafx /highlight/scripts/shBrushJavaFX.js', 'js jscript javascript /highlight/scripts/shBrushJScript.js', 'perl pl /highlight/scripts/shBrushPerl.js', 'php /highlight/scripts/shBrushPhp.js', 'text plain /highlight/scripts/shBrushPlain.js', 'py python /highlight/scripts/shBrushPython.js', 'ruby rails ror rb /highlight/scripts/shBrushRuby.js', 'scala /highlight/scripts/shBrushScala.js', 'sql /highlight/scripts/shBrushSql.js', 'vb vbnet /highlight/scripts/shBrushVb.js', 'xml xhtml xslt html /highlight/scripts/shBrushXml.js' ); SyntaxHighlighter.all(); function code_hide(id){ var code = document.getElementById(id).style.display; if(code == 'none'){ document.getElementById(id).style.display = 'block'; }else{ document.getElementById(id).style.display = 'none'; } } </script> <!--回顶部js2011.12.30--> <script language="javascript"> lastScrollY=0; function heartBeat(){ var diffY; if (document.documentElement && document.documentElement.scrollTop) diffY = document.documentElement.scrollTop; else if (document.body) diffY = document.body.scrollTop else {/*Netscape stuff*/} percent=.1*(diffY-lastScrollY); if(percent>0)percent=Math.ceil(percent); else percent=Math.floor(percent); document.getElementById("full").style.top=parseInt(document.getElementById("full").style.top)+percent+"px"; lastScrollY=lastScrollY+percent; if(lastScrollY<200) { document.getElementById("full").style.display="none"; } else { document.getElementById("full").style.display="block"; } } var gkuan=document.body.clientWidth; var ks=(gkuan-960)/2-30; suspendcode="<div id=\"full\" style='right:-30px;POSITION:absolute;TOP:500px;z-index:100;width:26px; height:86px;cursor:pointer;'><a href=\"javascript:void(0)\" onclick=\"window.scrollTo(0,0);\"><img src=\"\/image\/top.png\" /></a></div>" document.write(suspendcode); window.setInterval("heartBeat()",1); </script> <!-- footer --> <div class="Blog_footer" style='clear:both'> <div><a href="http://www.chinaunix.net/about/index.shtml" target="_blank" rel="nofollow">关于我们</a> | <a href="http://www.it168.com/bottomfile/it168.shtml" target="_blank" rel="nofollow">关于IT168</a> | <a href="http://www.chinaunix.net/about/connect.html" target="_blank" rel="nofollow">联系方式</a> | <a href="http://www.chinaunix.net/about/service.html" target="_blank" rel="nofollow">广告合作</a> | <a href="http://www.it168.com//bottomfile/flgw/fl.htm" target="_blank" rel="nofollow">法律声明</a> | <a href="http://account.chinaunix.net/register?url=http%3a%2f%2fblog.chinaunix.net" target="_blank" rel="nofollow">免费注册</a> <p>Copyright 2001-2010 ChinaUnix.net All Rights Reserved 北京皓辰网域网络信息技术有限公司. 版权所有 </p> <div>感谢所有关心和支持过ChinaUnix的朋友们 <p><a href="http://beian.miit.gov.cn/">16024965号-6 </a></p> </div> </div> </div> </div> <script language="javascript"> //全局错误提示弹出框 function showErrorMsg(content, title, url){ var url = url || ''; var title = title || '消息提示'; var html = ''; html += '<div class="HT_layer3_1 HT_layer3_2"><ul><li><p><span class="login_span1"></span>' + content + '</p></li>'; if(url == '' || url.length == 0){ html += '<li class="HT_li1"><input type="button" class="HT_btn2" onclick=\'close_windows("error_msg")\'></li>'; } else { html += '<li class="HT_li1"><input type="button" class="login_btn1" onclick="location.href=\'' + url + '\'"></li>'; } html += '</ul></div>'; $.cover(true); asyncbox.open({ id: 'error_msg', title : title, html : html, 'callback' : function(action){ if(action == 'close'){ $.cover(false); } } }); } //全局正确提示 function showSucceedMsg(content, title , url ){ var url = url || ''; var title = title || '消息提示'; var html = ''; html += '<div class="HT_layer3_1 HT_layer3_2"><ul><li><p><span class="login_span2"></span>' + content + '</p></li>'; if(url == '' || url.length == 0){ html += '<li class="HT_li1"><input type="button" class="HT_btn2" onclick=\'close_windows("error_msg")\'></li>'; } else { html += '<li class="HT_li1"><input type="button" class="HT_btn2" onclick="location.href=\'' + url + '\'"></li>'; } html += '</ul></div>'; $.cover(true); asyncbox.open({ id: 'error_msg', title : title, html : html, 'callback' : function(action){ if(action == 'close'){ $.cover(false); } } }); } //关闭指定id的窗口 function close_windows(id){ $.cover(false); $.close(id); } //公告 var tID; var tn; // 高度 var nStopTime = 5000; // 不同行间滚动时间隔的时间,值越小,移动越快 var nSpeed = 50; // 滚动时,向上移动一像素间隔的时间,值越小,移动越快 var isMove = true; var nHeight = 25; var nS = 0; var nNewsCount = 3; /** * n 用于表示是否为第一次运行 **/ function moveT(n) { clearTimeout(tID) var noticev2 = document.getElementById("noticev2") nS = nSpeed; // 只在第一次调用时运行,初始化环境(有没有参数) if (n) { // 设置行高 noticev2.style.lineHeight = nHeight + "px"; // 初始化显示位置 tn = 0; // 刚进入时在第一行停止时间 nS = nStopTime; } // 判断鼠标是否指向层 if (isMove) { // 向上移动一像素 tn--; // 如果移动到最下面一行了,则移到顶行 if (Math.abs(tn) == nNewsCount * nHeight) { tn = 0; } // 设置位置 noticev2.style.marginTop = tn + "px"; // 完整显示一行时,停止一段时间 if (tn % nHeight == 0) { nS = nStopTime; } } tID = setTimeout("moveT()", nS); } moveT(1); // 此处可以传入任何参数 </script> <script type="text/javascript"> // var _gaq = _gaq || []; // _gaq.push(['_setAccount', 'UA-20237423-2']); // _gaq.push(['_setDomainName', '.chinaunix.net']); // _gaq.push(['_trackPageview']); // // (function() { // var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; // ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; // var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); // })(); </script> <script type="text/javascript"> var _bdhmProtocol = (("https:" == document.location.protocol) ? " https://" : " http://"); document.write(unescape("%3Cscript src='" + _bdhmProtocol + "hm.baidu.com/h.js%3F0ee5e8cdc4d43389b3d1bfd76e83216b' type='text/javascript'%3E%3C/script%3E")); function link(t){ var href= $(t).attr('href'); href+="?url="+encodeURIComponent(location.href); $(t).attr('href',href); //setCookie("returnOutUrl", location.href, 60, "/"); } </script> <script type="text/javascript" src="/js/jquery.qqFace.js"></script> </body> </html>