ASP 3.0高级编程二

| 收藏本文 下载本文 作者:李初弥

这次小编给大家整理了ASP 3.0高级编程二(共含10篇),供大家阅读参考,也相信能帮助到您。同时,但愿您也能像本文投稿人“李初弥”一样,积极向本站投稿分享好文章。

ASP 3.0高级编程二

篇1:ASP3.0高级编程三

ASP3.0高级编程(三)

访问和更新Cookies集合

Cookies的值比ASP其他集合(例如Form和ServerVariables)的值要复杂得多。Cookie是一小块由浏览器存贮在客户端系统上的文本,且随同每次请求发往它们应用于的域中的服务器。

ASP使得应用cookie较为容易,可以从Request对象的Cookies集合中获得所有随同请求发出的cookie值,并可创建或修改cookie,通过Response对象的Cookies集合发回给用户。

Cookie包含可用两种方式构造的信息,单值cookie提供其值给代码是通过一个一般的类ASP集合。然而,集合的每个成员可能本身也是一个集合,包含这种信息的cookie通过称为多值(multiple-Value)cookie。

创建一个单值的cookie较为简单,如下所示:

Response.Cookies(“item-name”) = “item-value”

创建一个多值的cookie,可以使用如下命令:

Response.Cookies(“item-name”)(“sub-item-name”) = “sub-item-value”

设置cookie应用的域及路径及其有效期,我们使用:

Response.Cookies(“item-name”).domain = “domain-url”

Response.Cookies(“item-name”).path = “virtual-path”

Response.Cookies(“item-name”).expires = #date#

通常,客户只在对创建cookie的目录中的页面提出请求时,才将cookie随请示发住服务器。通过指定path属性,可以指定站点中何处这个cookie是合法的,并且这个cookie将随请求发送。如果cookie随对整个站点的页面请求发送,设置path为“/”。

假如Expires属性没有设置,关闭当前的浏览器实例时,cookie将被自动消除。

注意,我们在向浏览器发送任何输出时,已经创建了cookie。因为,这些cookie是页面HTTP报头的一部分。

在ASP 3.0中,缓冲的缺省状态是打开的,且没有输出被发送,除非使用Response.Flush指定做这个工作或者页面已到末端。这意味着创建cookie的代码可以在页面上的任何位置,直到任何输出“刷新”(flush)到客户端前,它都可以被执行。

要读现有的cookie,使用Request.Cookies集合。可以单独访问其中的项目,方法类似于创建它们时使用的方法。

StrSingleValue = Request.Cookies(“item-name”)

StrSubItemValue = Request.Cookies(“item-name”)(“sub-item-name”)

注意Request.Cookies集合(和所有其他Request集合一样)是只读的。Response.Cookies集合是只写的,事实上可以访问这个集合中一系列cookie的名称,而不是它们的值。

遍历Cookies集合

为了使用Cookies集合更加方便,可使用名称为Haskeys的附加属性。假如访问的cookie本身也是个集合,即它是一个多值的cookie,这将返回True。使用Haskeys属性,可以遍历完整的Request.Cookies集合,从而获得所有cookie的列表及它们的值。

For Each objItem In Request.Cookies

If Request.Cookies(objItem).HasKey Then

‘Use another For Each to iterate all subkeys

For Each objItemKey in Request.Cookies(objItem)

Response.Write objItem & “(“ & objItemKey & “) = “_

& Request.Cookies(objItem)(objItemKey) & “

Next

Else

‘Print out the cookie string as normal

Response.Write objItem & “ = ”& Request.Cookies(objItem) & “

End If

Next

这非常类似于前面的从Request.Form集合中提取多个值的复杂代码。但是这里可以使用Haskeys属性来判别每个条目是否为一个集合。而在Form例子里,必须查询Request.Form(item_name).Count属性,这是因为Form集合(和所有的除cookie外的其他集合)成员不可能是真正的集合。ASP只是做了“幕后”的工作,得到了每个多条目集合的值。

Form和QueryString的差异

了解了访问各种ASP集合的技术以后,需要解决另一个问题是:Form和QueryString集合之间的差异是什么?假如准备使用ASP,毫无疑问应该清楚这种差异,但需要参考HTTP工作方式来重新认识,理解它们。

通过HTTP从Web服务器请求页面或其他资源,有两个通用的方法。可使用GET方法直接获得资源,也可使用POST把值传给相应资源。GET方法是缺省的,可以看一下本章前面的一个HTTP请求的实例:

7/8/99 10:27:16 Sent GET /Store/Download.asp HTTP/1.1

假如把一个或多个成对的名称/值附在请求页面的URL后,就变成请求的查询字符串,且在QueryString集合中提供给ASP页面。单击Web页面、Email消息或其它文档的超链接,或在浏览器的地址栏中输入地址并按回车,或单击浏览器中的Links或Favorites按钮,所有这些都要使用GET方法。

因此,对这些动作中传递值给ASP的唯一方法是通过QueryString集合,把值附在URL后。

出现在Request.QueryString集合中并被访问的值,与前面看到的Form集合实例中的工作方式相同。URL和查询字符串的结合:

mysite.com/process_page.asp?FirstName=Priscilla&LastName=Descartes

可以采用如下方式访问在QueryString集合中提供的值:

strFirstName = Request.QueryString(“Fi

rstName”) ‘Return “Priscilla”

strLastName = Request.QueryString(“LastName”) ‘Return “Descartes”

strRaw = Request.QueryString

‘Return “FirstName=Priscilla&LastName=Descartes”

窗体的GET和POST方法

在一个页面内使用

2) 修改现有的cookie

可以使用ASP修改现有的cookie,但不能只修改cookie中的一个值。当更新一个在Response.Cookies集合中的Cookie时,现有的值将丢失。我们可以用如下代码创建一个cookie,可以使用:

Response.Cookies(“VisitCount”)(“StartDate”) = dtmStart

Response.Cookies(“VisitCount”)(“LastDate”) = Now

Response.Cookies(“VisitCount”)(“Visits”) = CStr(intVisits)

Response.Cookies(“VisitCount”).Path = “/” ‘Apply to entire site

Response.Cookies(“VisitCount”).Expires = DateAdd(“m”,3,Now)

假如想要更新Visits和LastDate的值,必须先不需改变的所有值,然后重写整个的cookie:

datDtart = Response.Cookies(“VisitCount”)(“StartDate”)

intVisits = Response.Cookies(“VisitCount”)(“Visits”)

Response.Cookies(“VisitCount”)(“StartDate”) = dtmStart

Response.Cookies(“VisitCount”)(“LastDate”) = Now

Response.Cookies(“VisitCount”)(“Visits”) = Cstr(intVisits)

Response.Cookies(“VisitCount”).Path = “/”

Response.Cookies(“VisitCount”).Expires = DateADD(“m”,3,Now + 1)且对于几乎所有的其他Response方法和属性,应该在写入任何内容(即打开标记或任何文本或其他的HTML)到响应之前完成这个工作。

篇2:ASP3.0高级编程四

ASP3.0高级编程(四)

使用ServerVariables集合

当讨论Request对象内容时,要研究的集合之一就是ServerVariables集合。这个集合包含了两种值的结合体,一种是随同页面请求从客户端发送到服务器的HTTP报头中的值,另外一种是由服务器在接收到请求时本身所提供的值。为显示ServerVariables集合中值的使用方式,在Request Object页面(Show_request.asp)中,点击“ServerVariables Examples”链接,打开另外一个页面,如下图所示:

下图所示窗口显示的是ServerVariables集合中一些非常有用的值的一个子集。

“自引用”页面

在ServerVariables集合中返回的值包含Web服务器的详细信息和当前页面的路径信息。在任何地方创建一个页面都可使用这些信息。例如创建一个“自引用”页面,此页面能够再次调用自身完成另一项任务,我们可以用以下代码:

” METHOD=”POST”>

同样的效果可以用HTTP的“SCRIPT_NAME”值获得:

” METHOD=”POST”>

使用元素打开一个不同页,可以使用:

...

...

”>Next Page

...

即使原始页面的名称或位置发生变化,这些实例都能正常工作,因为使用了当前页面的路径信息(当然,第二个例子在分离的目标页的名称发生变化时运行会失败)。

换句话说,如果为搜索引擎的子会话自动建立URL,可以收集ServerVariable的一些值:

strFullURL =    ;& Request.ServerVariables(“LOCAL_ADDR”) _

& “:” & Request.ServerVariables(“SERVER_PORT”) _

& Request.ServerVariables(“PATH_INFO”)

这将创建一个完整的URL包括端口号(这种情况下,不是标准值80)。例如,结果可能是:

194.74.60.254:1768/thispath/thispage.asp

检测浏览器的版本

ServerVariables集合中,另外一个有用的值是用户浏览器的用户代理字符串。在“Detecting the Browser Type”页面(browsertype.asp),使用ServerVariables集合中的“HTTP_USER_AGENT”值来获得用户代理字符串,一些脚本用来解析该信息并寻找生产厂家名称和浏览器版本。

对IE 5.0和Navigator 4.61的搜索结果分别不同,对于其他厂家的浏览器,可以得到一个链接在Alta Vista Web站点自动开始搜索厂家的名称。

注意,Netscape在用户代理字符串中不提供厂家的名称,因而无法绝对保证一个浏览器一定是Navigator。

检测浏览器的语言

ServerVariables集合中另外一个有用的值是“HTTP_ACCEPT_LANGUAGE”,它包含了一个当浏览器安装时指定的,或硬编码进用户的地区版本的语言代码。语言代码的例子有en-us(英国、美国)、de-at(德国、澳大利亚)和es-pe(西班牙、秘鲁)。

语言代码可以是一般的且省略方言标识:例如,在我们的站点Wrox者,大批浏览者都是将en(英语)作为语言代码。

因此,可以检测语言代码并自动装载一个合适的特定地区或指定语言版本的页面。

StrLocale = Lcase(Left(Request.ServerVariables(“HTTP_ACCEPT_LANGUAGE”),2))

Select Case strLocale

Case “en”: Response.Redirect  uk_site.co.uk/ ”

Case “de”: Response.Redirect  de_site.co.de/ ”

Case “fr”: Response.Redirect  fr_site.co.fr/ ”

‘... etc

Case Else: Response.Redirect  us_sitel.com/ ”

End Select

或者根据特定的方言,重定向页面:

strLocale = Lcase(Request.ServerVariables(“HTTP_ACCEPT_LANGUAGE”))

Select Case strLocale

Case “en-gb”: Response.Redirect  uk_site.co.uk/ ”

Case “en-us”: Response.Redirect  us_site.com/ ”

Case “es-pe”: Response.Redirect  es_site2.co.pe/ ”

‘...

Case Else: Response.Redirect  us_site1.com/ ”

End Select

其他有用的ServerVariables集合的值

可以访问和使用ServerVariables集合中的任何一成员,控制ASP页面响应一个请求的方式。可以检查一个浏览者访问站点时使用的是否是缺省端口80或还是另一个。在这个例子里,寻找通过端口443的访问――这个端口提供的是安全套接字层(Secure Socket Layer,SSI)访问(和其他的协议),且将它们重定向到一个相应的页面。

If Request.ServerVariables(“SERVER_PORT”) = “443”) Then

Response.Redirect “/securesite/default.asp” ‘Secure user

Else

Response.Redirect “/normalsite/default.asp” ‘Non-secure user

End If

假如要求浏览者注册且由服务器验证(而不是允许他们在Web服务器的IUSER帐号下匿名访问,这个问题将在后面章节中详细讨论),可以查询用

户名称,来判定正在与我们打交道的用户是谁,是否装载页面给该用户。例如,下面的这个代码将只向名为Administrator的用户显示管理链接。

...

Change Display Configuration

Change Display Colors

Change Keyboard Configuration

Administer All Users

Administer Logon Information

...

注意ASP不填写ServerVariables集合直到你访问其中的一个成员。首次访问该集合的一个成员将使IIS得到它的全部,应只在需要时才使用ServerVariables集合。

其他Request和Response技巧

现在,来看一下几个使用Request和Response对象的有用技巧,包括:

・ 连接、缓冲和页面重定向的管理。

・ HTTP报头、缓存与“到期”页面的操作。

・ 利用客户证书。

・ 创建定制的日志文件消息。

1. 连接、缓冲和页面重定向的管理

ASP的一个很有用的特点就是使用户能够从一个ASP网页转向到另一个网页(ASP或HTML),或另一个源文件(例如一个ZIP文件或文本文件)。这对用户来说是透明的,实际上是浏览器做这个工作。当使用Response.Redirect方法来载入一个新的网页时,实际上是发送回一个特殊的HTTP报头到客户。此报头为:

HTTP/1.1 302 Object Moved

Location /newpath/newpage.asp

浏览器读到此报头信息,并按Location值的指示载入页面。这在功能上与在Web页中使用客户端HTML标记相同,例如:

这带来的一个问题是,服务器与用户之间的代理服务器可能会提供它自己的包含与新页面的链接的消息,而不是直接载入新页面。而且浏览器根据厂商和版本可能做同样的工作。这就去除了假定的透明,而且对用户来说一直收到的是错误信息,则对你的站点的访问变得比较麻烦。

在发送诸如文本或HTML等任何页面内容后,我们就不能再使用Redirect方法。然而,一个看起来能够限制“代理服务器影响”的方法是,先确定没有输出(包括HTTP报头)被发送到客户。在ASP 2.0中,必须打开缓冲,然后使用Clear方法来清空缓冲区:

Response.Buffer = True

‘Some condition to select the appropriate page:

If Request.ServerVariables(“SERVER_PORT”) = 1856 Then

StrNewPage = “/newpath/this_page.asp”

Else

StrNewPage = “/newpath/the_other_page.asp”

End If

Response.Clear

Response.Redirect strNewPage

在ASP 3.0中,缓冲缺省为打开,所以第一行可被忽略,但它是无害的,而且能确保我们的网页即使在ASP 2.0环境中也仍然能工作。

与其使用这种类型的HTTP报头重定向,不如使用ASP 3.0的一个新特性,它允许我们通过Server对象的Transfer方法转换为执行另一个网页,我们将在第4章进一步研究这个问题。

1) ASP页面缓冲区

正如已看到过的,IIS 5.0中ASP 3.0页面缓冲是缺省打开的,在早期的版本中是缺省关闭的。微软告诉我们缓冲在IIS 5.0中提供了更有效的网页传送,这就是缓冲缺省状态被改变的原因。在大部分情况下,这对我们没有影响。但是,假如有一个非常大的网页,或一个用ASP或别的服务器端代码和组件花费一定时间创建的.网页,当其各部分完成时,我们能够分批刷新它们到客户:

...

... Code to create first part of the page

...

Response.Flush

...

... Code to create next part of page

...

Response.Flush

...

有时可能希望在页面结束之前的某些点上停止代码的执行,可以通过调用End方法去刷新所有的当前内容到客户并中止任何进一步的处理过程。

...

... Code to create first part of the page

If strUserName = “” Then Response.Clear

...

... Code to create a new version of this part of the page

...

这里有两上演示缓冲和重定向的实例网页,可以从“Response Object”主页面(sow_response.asp)下载它们。第一个Response.Redirect例子网页命名为redirect.asp,它在缓冲的页面中定入一些内容,清除缓冲区,并重定向到另一个网页:

For intLoop = 1 To 1000000

Response.Write “.”

Next

Response.Clear

Response.Redirect “show_redirect.asp”

Response.End

目标页show_response.asp,做同样的工作,但重定向则是回到“Response Object”主页。因为这些网页都在缓冲区内,而且所有的输出在重定向之前必须清除,故在浏览器中没有可见的输出。然而,可以通过观察浏览器的状态看到发生的每一次重定向。如下图所示:

在“Response Object”主页中,点击“Response.Flush”链接将打开第二个示例网页usebuffer.asp,它简单地遍历一个字符串的每一个字符,以一定的延迟将它们刷新到客户,这虽是Web服务器和ASP极低效率的使用方式,但它演示了缓冲的工作方式。

下面是所要求的最小化的ASP代码,注意我们分别把每个字符刷新到浏览器,因为不这样的话它将被存放在缓冲区中,直至网页完成:

strText = “This text has been flushed to the browser using “ & _

“Response.Flush

For intChar =1 To

Len(strText)

For intWrite = 1 To 100000

Next

Response.Write Mid(strText,intChar,1)

Response.Flush

Next

2) Response.IsClientConnected属性

IsClientConnected属性在ASP 2.0中已经存在了,但却有些不可靠。在其返回一个准确的结果之前必须发送一些输出到客户。这一问题在ASP 3.0中已被解决。现在这一属性可被自由使用。

IsClientConnected是观察用户是否仍连到服务器和正在载入ASP创建的网页的有用方式。如果用户断开连接或停止下载,我们就不用再浪费服务器的资源创建网页,因为缓冲区内容将被IIS丢弃。所以,对那些需要大量时间计算或资源使用较多的网页来说,值得在每一阶段都检查浏览器是否已离线:

...

... Code to create first part of the page

...

If Response.IsClientConnected Then

Response.Flush

Else

Response.End

End If

...

... Code to create next part of page...

1. 操作HTTP报头

我们已经在几处见到ASP如何创建或修改在响应页面请示时被发送到客户的HTTP报头。在Response对象中有几个属性和方法可帮助我们做到一点。下面是一些报头方法:

・ 控制缓存和有效期。

・ 创建状态和定制的HTTP报头。

・ 指定MIME类型或内容类型。

・ 添加PICS标签。

接下来将简要地研究每一个方面。可在“Response Object”主页(show_response.asp)上,单击相关属性名或方法名,来检查我们所说的属性和方法,如下图所示:

1. 缓存和“到期”ASP网页

用户的浏览器以及他们和服务器这间的任一代理服务器,都可以缓存HTML和用ASP创建的网页。当用户随后请求页面时,浏览器就发送一个“最新修改”的请求到服务器(使用一个包含缓存版本的日期的HTTP_IF_MODIFIED_SINCE报头),询问网页是否已被修改。

若没有被修改,服务器应用状态码和消息“304 Not Modified”来响应,浏览器将使用缓存的内容而不会通过网络下载一个副本。若已经存在已修改的版本,它就会与“200 OK”状态码和消息一道被发送出去。

1) Response.CacheContol属性

其他的一些因素也会影响这一处理过程。然而,任一被网页使用的网络路由内的代理服务器(一般位于客户机端),能被通过设置Response.CacheControl属性为Private来放弃缓存网页。在ASP 3.0中对ASP网页这是缺省的,不用设置。但在网页为个别访问者特别定制时尤其有用。这可以阻止别的在同一网络上的用户进入同一网页。当CacheControl的属性值被设定为Public时,允许服务器缓存网页。注意,一些代理服务器可能表现得不尽相同,或忽视或越过这个报头。

在IE4中,在代理服务器缓存可用时,有可能得到一个虚假的“This page has expired”消息。我们已提供了一个网页(expiretest_form.asp),可以通过自己的代理服务器在网络上做试验,来检查这一属性的影响。可以通过在“Response Object”主页中单击“Response. CacheControl”链接来显示这个网页。如下图所示:

篇3:ASP 3.0高级编程二

ASP 3.0高级编程(二)

使用Form和QueryString集合

当用户填写页面

可通过访问ASP的Form集合来访问其控件内的值:

strFirstName = Request.Form(“FirstName”)

strLastName = Request.Form(“LastName”)

也可使用窗体中控件的整型索引,索引的范围从在HTML中第一个定义的控件开始,然后根据定义的顺序排序:

strFirstName = Request.Form(1)

strLastName = Request.Form(2)

然而,后面的这种以整型为索引的技术不推荐使用,因为一旦有HTML中的控件发生了变化,或者插入一个新的控件,则ASP代码将得到错误的值。进一步而言,对于阅读代码的人来讲,极容易混淆。

1) 访问集合的全部值

可以通过引用集合把整个Form上的一系列值变成单个的字符变量,且不用提供键或索引。

StrAllFormContent = Request.Form

假如文本框包含值Priscilla和Descartes,则Request.Form语句将返回下列字符:

FirstName=Priscilla&LastName=Descartes

注意,提供的值是以名称/值对的形式出现的(即控件名称=控件值),并且每一对名称/值相互之间是用符号“&”相分隔的。假如打算把窗体中的内容传递单独的,希望得到值的标准格式的可执行应用程序或DLL,这个技术是很有用的。然而,一般说来,都是通过以窗体中控件的名称为文本键来访问集合中的内容。

2) 遍历一个ASP集合

有两种方式遍历一个ASP集合中的所有成员,方式与普通VB集合的基本相同。每个集合提供一个Count属性,返回的是集合中条目数量。可通过使用一个整型索引使用Count属性来遍历。

For intLoop=1 To Request.Form.Count

Response.Write Request.Form(intLoop) & “

Next

假如先前的窗体包含Priscilla和Descartes值的两个文本框,将得到如下结果:

Priscilla

Descartes

然而,更好的方法是使用For Each...Next结构。

For Each objItem In Request.Form

Response.Write objItem & “=” & Request.Form(objItem) & “

Next

这带来的好处是既可以访问控件的名称又可访问其值。上述代码将得到如下结果:

FirstName = Priscilla

LastName = Descartes

注意,一些浏览器返回到ASP的

在Form集合中,将为“OtherHobby”创建一个条目。然而,它将包括从三个文本框中得到的值。假如在提交时,用户留下了一个或多个为空,则返回的值为空字符串。假如用户在第一和第三个文本框分别输入Gardening和Mountaineering,第二个文本框为空,在我们的ASP代码中访问Request.Form(“OtherHobby”),将返回字符串:

Gardening, ,Mountaineering

为了能够在这种情况下,访问单个值,可以用复杂一些的代码:

For Each objItem In Request.Form

If Request.Form(objItem).Count >1 Then ‘More than one value in this item

Response.Write objItem & “:

For intLoop = 1 To Request.Form(objItem).Count

Response.Write “Subkey” & intLoop & “value =&

nbsp;“_

& Request.Form(objItem) (intLoop) & “

Next

Else

Response.Write objItem & “ = ” & Request.Form(objItem) & “

End If

Next

对于前面的包含三个OtherHobby控件的窗体实例,这将返回:

OtherHobby:

Subkey 1 value = Gardening

Subkey 2 value =

Subkey 3 value = Mountaineering

然而,由于很少给多个文本框相同的名字,因此这种技术很少用到。

a) HTML中的单选或选页按钮控件

在HTML中,需要给几个控件相同的Name属性的情况是单选(或选项)按钮,例如:

因为用户只能选择多项中的一个(这就是给它们相同的名字的原因),将仅得到一个返回值,浏览器只能发送所选择控件的值。因此,假如这个窗体的用户已经选择了“Europez”,将得到这个条目,通过遍历Form集得到其值:

Country = EU

由于为每个控件提供了不同的VALUE属性,反映了每个条目所对应的国家或地区的名称。假如省略了VALUE属性,浏览器将返回的值为“on”,因此将得到:

Country = on

这是不经常用到的,因此一般对使用相同名称的单选控件使用VALUE属性。

b) HTML复选框控件

当一个窗体中HTML源码包含一个复选框控件时,一般都给定唯一的名称,例如:

在这种情况下,提交窗体时,假如仅是第一和第三个复选框被选中(加标记),遍历Form集合时,会得到下列值:

Reading = on

Sleeping = on

然而,假如为每个复选框提供一个值,把这个值发往服务器代替字符串“on”。例如窗体如下:

如果除第三个复选框外,全部提交,在Request.Form集合会产生下列结果:

Hobby = Hobby025, Hobby003, Hobby010

假如编写更复杂一些集合遍历代码,如先前所述(单独显示每个子键),就得到这样结果:

Hobby:

Subkey 1 value = Hobby025

Subkey 2 value = Hobby003

Subkey 3 value = Hobby010

需要注意的是两种情况,没有选中的控件根本不返回任何值。在第一种情况的结果里,没有欺骗性的逗号,第二种情况也没有空值。这与上述的使用文本框的相当的.测试的结果不一样。使用文本框时,每个文本框都返回一个值,即使是一个空字符串。这是浏览器造成这样的结果。因此在ASP代码中访问集合时,要注意这个问题。

上述情况一个棘手的负作用是使用复选框时,复选框值的索引与在原始的HTML中控件的位置没有任何联系,在上述的例子中第四个复选框的子键数为3,因为当窗体提交时,第二个控件没有选中。

c) HTML列表控件

HTML中的

CT>标记用来产生标准的下拉列表框,其值以一种有趣的混合方式表示。下列的窗体创建了包含5个值可供用户选择,由于包含了MULTIPLE属性,因此可以通过选择时按下Shift或Ctrl键,选择不仅一个的条目。

下图所示为该页面,显示的是选中了三个条目。

这种特殊的情况返回的是在Form集合中单个条目,它包含选择的值(单个的

Hobby = Hobby025, Hobby003, Hobby010

假如使用更加复杂一些的集合遍历代码(单独显示每个子键),将得到:

Hobby:

Subkey 1 value = Hobby025

Subkey 2 value = Hobby003

Subkey 3 value = Hobby010

这与上述相同名称的复选框的情况相同。事实上可以认为一个SELECT列表是一列复选框的列表供选择(不是选中)相应的条目。

然而,列表框也有指定的值,假如在

Hobby = Swimming, Reading, Sleeping

并且,同样,复杂一些的集合遍历代码将返回如下结果:

Hobby:

Subkey 1 value = Swimming

Subkey 2 value = Reading

Subkey 3 value = Sleeping

当然,假如单个项目被选择,且在

Hobby = Hobby025

如果没有提供VALUE属性,得到:

Hobby = Swimming

这允许既可以缺省(即无VALUE)显示选项文本,也可做相应的改变。后一种情况在某些情况下是极为有用的,如要显示(一个说明的字符串)和传递一个完全不同的内容(如用一个短码代表一个说明性的字符串)。

d) HTML提交和图像控件

复选框和单选框是布尔型控件的例子,选中或选择返回的为“on”,不像文本框和大多数其他的HTML控件,浏览器不包含没有选中或没有选择的控件的值。

还有另外一种常用的布尔型控件,称为HTML按钮。如类型。

BUTTON类型的控件不返回任何值,因其对窗体没有直接的影响。即使使用用来调用窗体的Submit方法,浏览器在任何请求中将不包含BUTTON类型控件的值。同样,一个按钮的值也决不会发往服务器。

然而,输入按钮控件SUBMIT和IMAGE类型实际提交窗体给服务器,其VALUE属性包含窗体的其他控件的值(只要在HTML定义中包含一个NAME属性)。例如,这个窗体可能是向导类型Web应用程序的一部分,允许用户一步步进行或取消进程:

在一个窗体中,可以包括多个SUBMIT按钮。在这种情况下,应该给每一个按钮唯一的VALUE属性,如上所示。当一个窗体被提交时,遍历Request.Form集合的值,将产生一个值,这个值依赖于按下哪个按钮用于提交这个窗体。假如用户按下的“Previous”按钮,将得到:

btnSubmit = Previous

因此,可查询Request.Form集合来决定下一个显示的页面,例如:

Select Case Request.Form(“btnSubmit”)

Case “Next”

Response.Redirect “page_3.asp”

Case “Previous”

Response.Redirect “page_1.asp”

Case “Cancel”

Response.Redirect “main_menu.asp”

End Select

同时,也可根据需要对每个按钮使用不同的NAM

E属性。且选择其值包含在Form集合中的控件名称。在控件没有一个完整的标记而是随后跟着较长的文本标签的情况下,极为有用,如下图所示。

此屏幕上的界面由下列代码产生:

在ASP页面中,接收到数据后,可以检查按扭名称提供的值来判断按下的是哪个按钮。

If Len(Request.Form(“btnNext”)) Then Response.Redirect “page_3.asp”

If Len(Request.Form(“btnPrevious”)) Then Response.Redirect “page_1.asp”

If Len(Request.Form(“btnCancel”)) Then Response.Redirect “main_menu.asp”

这个工作是查询一个键上的ASP集合,如果不存在则返回一个空的字符串。换句话说,如果第二个按钮(previous页)按下,则Request.Form(“btnNext”)的值是一个空字符串,则其长度为零而不至于产生一个错误。当第二个按钮按下时,则在Form集合中这个条目的值Request.Form(“btnPrevious”),将是“ ”其长度大于零。

e) 提高使用Request集合的效率

访问一个ASP集合来下载一个值是费时的需计算资源的过程,因为这个操作包含了一系列对相关集合的搜索,这比访问一个局部变量要慢得多。因此,如果打算在页面中多次使用集合中的一个值,应该考虑将其存贮成为一个局部变量,例如:

strTitle = Request.Form(“Title”)

strFirstName = Request.Form(“FirstName”)

strLastName = Request.Form(“LastName”)

If Len(stTitle) Then strTitle = strTitle & “ “

If strFirstName = “ “ Then

StrFullName = strTitle & “ “ & strLastName

ElseIf Len(strFirstName) = 1 Then

StrFullName = strTitle & strFirstName & “・ “ & strLastName

Else

StrFullName = strTitle & strFirstName & “ ” & strLastName

End If

f) 搜索所有的Request集合

在某些情况下,可能知道一个值的键名将出现在Request集合中,但不能准确地知道是哪一个集合。例如,假如有几个页面(或一个页面的不同段)发送一个值给同一个ASP脚本,它可能在Form或者QueryString集合中出现。

本章后面部分将研究Form和QueryString集合的差异。

要看一下一个值为什么可能出现在不同的集合中,考虑一下这种情况:使用了超级链接元素请求一个页面。在这种情况下,增加一个值到请求的唯一方法是把它加到URL上。然而,同样的值可能已出现在另一个页面的

...

...

For help go to the Help Page

...

在这种情况下,按下窗体上的Help按钮,将发送Request.Form集合中一对名称/值“page=Help”。然而,按下超级链接也可能发送名称/值“Page=Help”,但是这次却是在QueryString集合里。为访问这个值,可使用ASP Request对象的一个特殊功能:

strPage

= Request(“page”)

这将按序搜索全部的集合――QueryString、Form、Cookies、ClientCertificate、ServerVariables,直到发现第一个匹配值的名称。这样做比直接访问适当的集合效率低,并且是不安全的,除非能绝对保证这个值不会出现在另外一个集合中。

例如,可能希望搜集满足客户请求的Web服务器的名称,这通过出现在每个查询中的Request.ServerVariables集合中寻找“SERVER_NAME”来实现。然而,假如任一其他的集合也包含名为“server_name”的值(记住键名不区分大小写),当使用Request(“server_name”)时,得到的是错误的结果。使用Reqeust.ServerVariables(“server_name”)句法,我们将很难进行错误追踪。

总而言之,使用“搜索全部集合”技术要格外小心,且只在没有其他技术能够提供你需要的结果时使用。

g) 访问其他的集合

本章的这一节里,已经集中讨论了Form集合,这可能是使用得最多的一个。然而,所有这些技术同样适用于其他的对象。包括那些由Request对象提供的(即Form、QueryString、Cookies、ServerVariables和ClientCertificate)集合,及由Response对象提供的cookies(及将在下两章遇到的其他对象提供的集合)。

我们将简短了解一个值如何进入一个QueryString集合,及其优点和不足。然而,同时这两个Cookies集合有额外的功能,可以使使用cookie更加方便,下面讨论这个内容。

篇4:flash 高级编程指南

编程|高级

此篇教程由本人在法国的朋友章鑫杰为本站提供,所有内容均由作者本人手书.网站:www.openvue.net

btw:作者本人现从移动领域的开发,原本应还有更多的章节,但由于工作较忙,不能完成后续的章节.些教程中的四节,主要是针对macromedia组件的探讨.如果你对macromedia组件有兴趣或是对你现有的开发不知到底使用哪一种方式来做,兴许会适合你.

我向来觉得Flash MX 是一个面向程序员,尤其是Java,C#程序员的产品,从这款产品你可以看出Macromedia的发展方向,它要让Flash及其配套的服务器端产品成为电子商务的主要开发平台,从程序员的角度学Flash MX 2004,我最关注的是它背后的程序设计模式,它用XML非常好的融合了表现层,中间层,和数据库层,是设计数据库网络应用程序,或者说电子商务类程序很好的开发平台,并提供了一套非常强大的组件来加速开发进程,很多人学MX2004,只关注它的UI Component,这是皮毛,它的精髓在于和数据库相关的几个组件。

让我们站在高处来看一看这几个非常重要组件,大致了解一下在Flash MX 2004这么个环境下,一个典型的数据库应用程序应该怎么编。

首先,用Connector(包括XMLConnector, WebServiceConnector,RemotingConnector)来连接服务器,取得原始数据,这些原始数据一般要求是XML格式的,RemotingConnector除外,这些数据取得后,进入DataSet做一个缓存和数据格式的转换,这就是.NET和J2EE里面的Offline Database的概念,这不但可以融合不同数据源的数据,而且通过缓存可以大大提高效率。DataSet里面的数据可以通过Binding连接到UI Component上去,每个UI Component都有一个Binding面板,你可以把它们关联到DataSet。这样你只需要写一行代码就可以把数据展现给你的用户,就是:xmlconnector.trigger 或者webservice.trigger()。Trigger命令会连接服务器并取得数据,剩下的工作因为你已经设置了Binding,所以数据自动在组件中间流动。

那么数据在客户端被修改后怎么传回服务器,进而把这些修改反映在数据库呢?Flash MX 2004为我们提供两个非常强悍的组件:RDBMSResolver和XUpdateResolver,这连个组件可以和DataSet关联,DataSet会把用户修改的数据按特定的格式传到这两个Resolver上去,RDBMSResolver用的格式是Macromedia自己定义的,很简单的格式,你可以在他们网站上找到参考资料。XUpdateResolver用的是XUpdate格式,是一种标准格式,很多Xml数据库都用它作数据库更新语言。这样DataSet可以自动通过Resolver连接服务器来修改数据。

你看,整个过程实际上不用怎么写代码,只需要设置一些属性,拖拉一些组件,把它们邦定一下就可以了,是不是很简单呢?

在(一)中我讲到Flash MX 2004有三种Connector,即XMLConnector, WebServiceConnector,RemotingConnector,如果你的Flash编辑环境中没有RemotingConnector,请到Macromedia的网站上去下载。

XMLConnector是最简单的一种连接器,服务器端可以是任何语言的脚本,ASP,PHP,JSP等都可以,它的好处是服务器程序不需要加载额外的库,只要你返回的内容是XML的就可以了。这样实际上方便了程序员用最少的成本将原有的服务器端脚本稍作更新,以配合Flash富客户端。它的坏处在于,这样的脚本使前后台程序员之间的配合比较困难,因为它的接口是隐藏的,因为如果你不能和脚本开发人员密切沟通,你对接口和参数的信息就一无所知,至少不全面,甚至不知道其中是否有后门。但如果你既开发前台又开发后台另当别论,另外很多习惯于传统的Web服务器脚本开发的人员也可以比较快的上手。

我们跳过WebServiceConnector,讲讲RemotingConnector,这个连接器基于Flash Remoting 技术,有不少的朋友很热衷于Remoting技术,但我并不是很看好它。应该说Remoting 技术的设计思想和Flash的SWF文件格式的设计思想是一脉相承的。它们都极力的强调带宽的重要,对于在Internet上传输的内容要尽量的精简,压缩。因为前一阵子,我曾经想开发一个J2ME版的Flash Player,所以我对SWF格式做过比较深入的研究,它在压缩方面做的相当到位,每一个bit都尽量利用,Remoting也是希望通过二进制字节流减少传输量来提高效率,所以我说它们的出发点是一样的。Remoting在本质上属于RPC的一种,它和DCOM,CORBA,JAVA RMI属于一类的技术,不同之处在于Remoting 的通讯协议采用HTTP,这样它就具备了WebService这样的跨越多个域,跨越防火墙的功能。在效率上Remoting毋庸置疑要高于WebService,但这不是我们取舍一个技术的决定因素,要不然,DCOM,CORBA这些东西的性能更强悍,但他们在Web时代却得不到广泛的使用。另外,Remoting是Macromedia的“私有财产”,MM拥有绝对的主动权对它进行修改和扩充,就像MM对Flash格式和AS进行大刀阔斧的改革一样,开发人员是很忌讳这种事情的。虽然MM公开了Remoting AMF通讯协议的大部分内容,但它实际上故意对媒体流的传输协议秘而不宣。很多人热衷Remoting很大程度上受了MM那个视频聊天DEMO的诱惑,而实际上为了要视频聊天,你需要付出惨重的代价,首先服务器必须用MM的软件,因为没有第三方知道怎么和Flash客户端交流媒体流,而MM的服务器软件按照connection收钱,贵的吓死你,用盗版另当别论。基于以上原因,我个人比较不赞成使用Remoting.

WebServiceConnector我放在最后讲。这是目前最有前途的RPC技术,有人说WebService 是个很糟糕的技术,因为Microsoft的极力推广才有它的今天。我对此不以为然,抛开对Microsoft的成见,它所推出的技术一般都相当成功,就像现在的.NET, C#,作为一个程序员,我只能用艺术品来形容它们。WebService 也许不是一个最完美的技术,但在当下,它最适合Web分布式计算。时至今日,它已经越来越成熟,而且在很多世界级的大型项目中得到了应用和考验。一个技术它被应用的越广泛,其价值也就水涨船高,它带来的一个显著的好处在于,你可以不用被绑死在一个开发平台上,无论是服务器端还是客户端,比如如果有一天你的客户要求你用SVG或者Java Applet开发客户端,因为你在服务器端采用了WebService,就可以很快的跨越到另一个客户端技术。不要以为这种情况不太会发生,实际上如果你看过SVG 2的技术文档,你就会发现Flash有一天很可能会被它取而代之,它真的很强大,也很适合开发富客户端应用程序,这时候你的服务器脚本如果采用了Remoting 技术,你可惨大了。再者,从开发环境而言,象VisualStudio.NET,WebSphere,JBuilder 等都对WebService提供了相当好的开发和调试环境。相对于XMLConnector,WebServiceConnector的优点还在于允许你在设计时(DesignTime)绑定(Binding)它的参数(Paremeters )和结果(Results)。比如你可以绑定你的复选框(CheckBox)到WebService的一个参数上,复选框里的选择内容被改变时,WebService被触发(Trigger),WebService连接服务器从数据库中取回新的数据更新DataSet,然后DataSet又更新和它邦定的其他组件,你看一个Master-Detail结构的数据库应用程序就这么简简单单的生成了,这个过程你真正要动手编的程序可能只有3,4而已。

总结:如果服务器端允许,你也具备一定的WebService编程经验,最好采用WebServiceConnector。尽量避免使用Flash Remoting。XMLConnector的使用取决于你项目的具体情况,比如规模,开发模式,是否需要重用大量的已有脚本等。

我在这个教程的前几篇里面,我尽量让大家站在高处看Flash MX 2004在数据库编程方面框架性的东西,知其然知其所以然,帮大家逐步分析每一个组件它的功能和MM为什么会推出这些组件,而不是其他的。在教程的最后我会给出一个比较复杂的例子让大家动动手。

这节,我们来分析Dataset这个东西,这是MX 2004数据库编程框架里面灵魂性的组件,是核心。MM的Flash 2004出来的很晚,故此它有机会从微软的.NET和Sun的J2EE中吸取了不少养分,

Dataset就是MM博采众长后搞出来的一个非常棒的数据库组件。

(1)Dataset的首要功能是在内存中部分或全部的缓存数据库镜像,缓存是提高数据库应用程序性能的最主要的途径,也是Flash应用程序区别于HTML类应用程序的一个重要特征,HTML是无状态(Stateless)语言,当你请求下一个页面的时候,前面的状态就不存在了,由服务器从新产生所有的状态,它的坏处很多,比如我们经常碰到这样的情况,某网站让你填大堆的注册信息,一页一页,好多页,你填到一半的时候,忽然网络延时,表单发不出去,怎么办?退回上一页吗?不行了,因为安全性的缘故,上一页已经过期(Expired)了,你进也不行,退也不行,怎么办?只好从头填起。还好你只是在填你的注册信息,要是你正在在线做笔交易,那方方面面的问题就大了。这也是HTML最被人诟病的地方,Flash 程序就没有这个问题,因为只要你不关了它,它的状态一直保持。Dataset就是用来保持本地数据库状态的一个很好的途径,网络延时或者暂时网络不通,没问题,咱等网络好了,再和远程数据库进行同步,你不用担心会丢失重要的数据。

(2)Dataset的另一个功能是将不同质的数据库同质化。比如一个大公司,以前它的各子公司各自为政,分别做了一套管理系统,数据区也千差万别,从Access, MySQL,SQLServer到DB2千七百怪的都有,总公司要统一做一套管理系统,但把所有数据库升级的代价很大,怎么办呢?我们可以在通过第二节所说的连接器,把不同数据源的原始数据读到Dataset中,那么对于客户端而言,数据源的差别就被弥合了,它们就被同质化,你就像操作单个数据库一样,方便得对多个数据库进行操作。

(3)数据格式转换,数据库里的原始数据往往不能直接显示,而需要经过转换,最简单的例子就是日期,数据库返回回来的日期往往是一串长长的精确到毫秒的甚至带有时区的字符串,通常你要对它处理一下,插进去“年”,“月”,“日”等符合国人阅读习惯的文字,在Dataset中,你可以对每一个字段指定一个编码(Encoding),它可以帮你把原始数据翻译成你想要的格式。你也可以订制编码器,比如:

if (积分 < 20)

return 菜鸟;

else

reutrn 老鸟;

这样“积分”这个字段通过编码器就被转换成了大家更能理解的文字。

(4)Dataset最强悍的功能当属它自动产生更新脚本这一项。通常的数据库应用程序,当用户做了一些修改后,你需要逐一的把它们更新到数据库里去,其过程用伪代码可能如下:

for (被修改的每一行)

如果它的状态是“新增”,就执行Server.AddNew(...)

如果它的状态是“被删除”,就执行Server.Delete(...)

如果它的状态是“被更新”,就执行Server.Update(...)

Dataset则不然,你把它里面的字段绑定到UI Component上后,在UI Component上做修改,Dataset会在相应的纪录(Record)和字段(Field)上做标志,然后当用户要求将修改保存到数据库的时候,Dataset把所有的修改打包,假设你事先已经将Dataset的dataPacket属性和XUpdateResolver的dataPacket属性绑定,那么当程序执行到resolver.ApplyUpdate()的时候,resolver会把DataSet的修改脚本转化成XUpdate命令发送到服务器,让服务器端程序执行相应的修改命令,并返回结果。

你有没有注意过DataHolder这个组件呢?我想看这个教程的大多数人都没有用过这个东西。我不是说它是一个和Dataset一样的非常核心的组件,但是如果你善用这个组件会有意想不到的效果。

我在学每个组件的时候都会问自己一个问题,为什么是它?MM在开发Flash MX 2004的时候,实际上网上已经有了针对Flash的大量形形色色的组件,MM在开发标准组件的时候,肯定要考虑到它要有广阔的适用范围,那么DataHolder这个玩艺儿有什么本事让MM把它纳入到标准组件里呢?在前面的几个教程里面,我一直在重复一个词:绑定。它可以让我们少写n多的代码,而且使程序易于维护。但是有些东西你没法通过绑定来实现,比如有一个文本框,它是某几个字段经过复杂计算后的结果,这时候,你一般要写些代码来手工修改这个文本框的内容。再比如,你调用一个传统的Web服务器脚本,来读取数据的时候可能需要传入参数,象这样

www.openvue.net/getOrderDetails.php?OrderID=233&CustomerID=8324

请注意,当你为XMLConnector设置这样的连接参数的时候,其中的OrderID和CustomerID在程序执行期间是要变化的,不是固定的,你可能需要在程序里面手工写一个字符串连接代码来设定正确的参数。

上面所说的不是一般的绑定能够实现的,DataHolder就是把这些“不可能的任务”变为可能。DataHolder相当于一个提供动态绑定的杂货铺,你可以在里面放任何东西,来提供绑定到其他组件的数据源,

以前面所举的两个例子做一下说明:

(1)有一个叫“总数”的文本框,它是一个叫“单价“的文本框和一个叫“数量”的NumericStepper(这个组件中文不知道怎么叫,不好意思)乘积,那么你设置一个DataHolder,它里面放三个变量,一个叫“UnitPrice ”(单价),一个叫“Quantity ”(数量)一个叫“Total ”(总数),把“单价“文本框绑定到“UnitPrice ”,把“数量”NumericStepper绑定到“Quantity ”,把“总数”文本框绑定到“Total ”,然后写一个触发器,当UnitPrice 或者Quantity 变化时自动计算Total:

var calculateTotal = function()

{

dataholder.Total = dataholder.UnitPrice * dataholder.Quantity;

}

dataholder.AddEventListener(“UnitPrice”, calculateTotal);

dataholder.AddEventListener(“Quantity”, calculateTotal);

好,现在当用户在“单价“文本框里输入数字,或者当NumericStepper里面的数值被改变时,“总数”文本框里面的数值会跟着变动。看上去还蛮智能的:)

(2)连接参数的动态绑定,拖个DataHolder到Form上,DataHolder中设置3个参数(OrderID,CustomerID和OrderDetailsURL),设置一个XMLConnector,他的URL绑定到DataHolder的OrderDetailsURL上面,然后为DataHolder写个触发器:

var generateURL= function()

{

dataholder.OrderDetailsURL= “www.openvue.net/getOrderDetails.php?OrderID=” + dataholder.OrderID + “&CustomerID=” + dataholder.CustomerID;

}

dataholder.AddEventListener(“OrderID”, generateURL);

dataholder.AddEventListener(“CustomerID”, generateURL);

这个有什么用呢,好,让我加入两个分别叫OrderID和CustomerID的文本框,这两个组件分别绑定到DataHolder中的OrderID和CustomerID,现在当用户在OrderID和CustomerID输入数字的时候你的程序就会自动产生合适的URL去到服务器上作查询,返回相应的OrderDetails。

篇5:PL/SQL编程(二)

1 For循环

语法:begin

for i in reverse 1..10 loop

insert into users values(i,’ ‘);

end loop;

end;

注意:循环变量 i 是隐含增加的,所以无法看到

2 goto语句

goto 语句用于跳转到特定的位置去执行语句,由于goto语句会减少程序的可读性,所以一般情况下

不建议使用goto语句

3 null语句

null语句不会执行任何操作,但是可以增加程序的可读性

4 创建返回值是一个结果集的存储过程

(1) 创建一个包:

SQL>create or replace package testpackage as

type test test_cursor is ref cursor;

end testpackage;

(2) 创建存储过程

SQL>create or replace procedure sp_procedure1

(stuNo in number, param_cursor out testpackage.test_cursor) is

begin

open param_cursor for select * from emp where sutno=stuNo;

end;

5 分页

(1) sql语句

select * from

(select *,rownum NO from

(select * from emp) where rownum <=20) where rownum >=10;

(2) 创建一个包

create or replace package testpackage2 as

type test test_cursor is ref cursor;

end testpackage2;

(3) 创建存储过程

SQL>create or replace procedure procedureName2

(tableName in varchar2, -- 表名

pageSize in number, -- 每页显示的记录数

pageNow in number, -- 当前是第几页

pageCount out number, -- 总页数

p_cursor out testpackage2.test_cursor) is

v_sql varchar2(1000);

v_beginNum number := (pageNow -1)* pageSize + 1;

v_endNum number := pageNow * pageSize;

begin

v_sql := 'select * from (select *,rownum NO from (select * from '|| tableName ||')

where rownum <= '|| v_endNum ||') where rownum >= '|| v_beginNum;

open p_cursor for v_sql;

-- 创建一个sql语句

v_sql := 'select count(*) from ' || tableName;

-- 执行sql语句,将结果保存

execute immediate v_sql into rows;

if mod(rows,pageSize) = 0

then pageCount := rows / pageSize;

else

pageCount := rows / pageSize + 1;

end if;

-- 关闭游标

close p_cursor;

end;

6 异常处理

(1) 预定义异常

(2) 非预定义异常

(3) 自定义异常

例1

SQL>declare v_name emp.ename%type;

begin

select ename into v_name from emp where empno = &no;

dbms_output.put_line('名字:' || v_name);

exception

when no_data_found

then dbms_output.put_line('编号没有!');

end;

预定义异常

a case_not_found

在编写case 语句时,如果在when子句中没有包含必须的条件分支(没有符合条件的),就会触发case_not_found异常

b cursor_already_open

当重新打开已经打开的游标时触发此异常

c dup_val_on_index

在唯一索引所对应的列上插入重复值时触发此异常

d invalid_cursor

当试图在不合法的游标上进行操作时触发此异常

e invalid_number

当输入的数字无效时触发此异常

f too_many_rows

当返回值不止是一条记录时触发此异常

g zero_divide

当进行 x/0,即除数为零的操作时触发此异常

h value_error

当进行赋值操作时,如果变量的长度不足以存储实际数据时触发此异常

i login——denide

当用户非法登录时会触发此异常

j not_logged_on

如果用户没有登录就执行DML操作,就会触发此异常

k storage_error

如果超出了内存空间,就会触发此异常

l timeout_on_resource

当Oracle等待资源时,如果发生超时情况,就会触发此异常

自定义异常

SQL>create or replace procedure procedureName2(sp_empNo number) is

MyExpception Exceptiom; -- 自定义一个异常

begin

update emp set sal = sal * 1.2 where empno = &no;

if sql%notfound then

raise MyExpception; -- 触发自定义异常

end if;

exception

when no_data_found

then dbms_output.put_line('没有更新数据!');

end;

篇6:ASP 3.0高级编程三

ASP 3.0高级编程(三)

访问和更新Cookies集合

Cookies的值比ASP其他集合(例如Form和ServerVariables)的值要复杂得多。Cookie是一小块由浏览器存贮在客户端系统上的文本,且随同每次请求发往它们应用于的域中的服务器。

ASP使得应用cookie较为容易,可以从Request对象的Cookies集合中获得所有随同请求发出的cookie值,并可创建或修改cookie,通过Response对象的Cookies集合发回给用户。

Cookie包含可用两种方式构造的信息,单值cookie提供其值给代码是通过一个一般的类ASP集合。然而,集合的每个成员可能本身也是一个集合,包含这种信息的cookie通过称为多值(multiple-Value)cookie。

创建一个单值的cookie较为简单,如下所示:

Response.Cookies(“item-name”) = “item-value”

创建一个多值的cookie,可以使用如下命令:

Response.Cookies(“item-name”)(“sub-item-name”) = “sub-item-value”

设置cookie应用的域及路径及其有效期,我们使用:

Response.Cookies(“item-name”).domain = “domain-url”

Response.Cookies(“item-name”).path = “virtual-path”

Response.Cookies(“item-name”).expires = #date#

通常,客户只在对创建cookie的目录中的页面提出请求时,才将cookie随请示发住服务器。通过指定path属性,可以指定站点中何处这个cookie是合法的,并且这个cookie将随请求发送。如果cookie随对整个站点的页面请求发送,设置path为“/”。

假如Expires属性没有设置,关闭当前的浏览器实例时,cookie将被自动消除。

注意,我们在向浏览器发送任何输出时,已经创建了cookie。因为,这些cookie是页面HTTP报头的一部分。

在ASP 3.0中,缓冲的缺省状态是打开的,且没有输出被发送,除非使用Response.Flush指定做这个工作或者页面已到末端。这意味着创建cookie的代码可以在页面上的任何位置,直到任何输出“刷新”(flush)到客户端前,它都可以被执行。

要读现有的cookie,使用Request.Cookies集合。可以单独访问其中的项目,方法类似于创建它们时使用的方法。

StrSingleValue = Request.Cookies(“item-name”)

StrSubItemValue = Request.Cookies(“item-name”)(“sub-item-name”)

注意Request.Cookies集合(和所有其他Request集合一样)是只读的。Response.Cookies集合是只写的,事实上可以访问这个集合中一系列cookie的名称,而不是它们的值。

遍历Cookies集合

为了使用Cookies集合更加方便,可使用名称为Haskeys的附加属性。假如访问的cookie本身也是个集合,即它是一个多值的cookie,这将返回True。使用Haskeys属性,可以遍历完整的Request.Cookies集合,从而获得所有cookie的列表及它们的值。

For Each objItem In Request.Cookies

If Request.Cookies(objItem).HasKey Then

‘Use another For Each to iterate all subkeys

For Each objItemKey in Request.Cookies(objItem)

Response.Write objItem & “(“ & objItemKey & “) = “_

& Request.Cookies(objItem)(objItemKey) & “

Next

Else

‘Print out the cookie string as normal

Response.Write objItem & “ = ”& Request.Cookies(objItem) & “

End If

Next

这非常类似于前面的从Request.Form集合中提取多个值的复杂代码。但是这里可以使用Haskeys属性来判别每个条目是否为一个集合。而在Form例子里,必须查询Request.Form(item_name).Count属性,这是因为Form集合(和所有的除cookie外的其他集合)成员不可能是真正的集合。ASP只是做了“幕后”的工作,得到了每个多条目集合的值。

Form和QueryString的差异

了解了访问各种ASP集合的技术以后,需要解决另一个问题是:Form和QueryString集合之间的差异是什么?假如准备使用ASP,毫无疑问应该清楚这种差异,但需要参考HTTP工作方式来重新认识,理解它们。

通过HTTP从Web服务器请求页面或其他资源,有两个通用的方法。可使用GET方法直接获得资源,也可使用POST把值传给相应资源。GET方法是缺省的,可以看一下本章前面的一个HTTP请求的实例:

7/8/99 10:27:16 Sent GET /Store/Download.asp HTTP/1.1

假如把一个或多个成对的名称/值附在请求页面的URL后,就变成请求的查询字符串,且在QueryString集合中提供给ASP页面。单击Web页面、Email消息或其它文档的超链接,或在浏览器的地址栏中输入地址并按回车,或单击浏览器中的Links或Favorites按钮,所有这些都要使用GET方法。

因此,对这些动作中传递值给ASP的唯一方法是通过QueryStrin

g集合,把值附在URL后。

出现在Request.QueryString集合中并被访问的值,与前面看到的Form集合实例中的工作方式相同。URL和查询字符串的结合:

mysite.com/process_page.asp?FirstName=Priscilla&LastName=Descartes

可以采用如下方式访问在QueryString集合中提供的值:

strFirstName = Request.QueryString(“FirstName”) ‘Return “Priscilla”

strLastName = Request.QueryString(“LastName”) ‘Return “Descartes”

strRaw = Request.QueryString

‘Return “FirstName=Priscilla&LastName=Descartes”

窗体的GET和POST方法

在一个页面内使用

2) 修改现有的cookie

可以使用ASP修改现有的cookie,但不能只修改cookie中的一个值。当更新一个在Response.Cookies集合中的Cookie时,现有的值将丢失。我们可以用如下代码创建一个cookie,可以使用:

Response.Cookies(“VisitCount”)(“StartDate”) = dtmStart

Response.Cookies(“VisitCount”)(“LastDate”) = Now

Respons

e.Cookies(“VisitCount”)(“Visits”) = CStr(intVisits)

Response.Cookies(“VisitCount”).Path = “/” ‘Apply to entire site

Response.Cookies(“VisitCount”).Expires = DateAdd(“m”,3,Now)

假如想要更新Visits和LastDate的值,必须先不需改变的所有值,然后重写整个的cookie:

datDtart = Response.Cookies(“VisitCount”)(“StartDate”)

intVisits = Response.Cookies(“VisitCount”)(“Visits”)

Response.Cookies(“VisitCount”)(“StartDate”) = dtmStart

Response.Cookies(“VisitCount”)(“LastDate”) = Now

Response.Cookies(“VisitCount”)(“Visits”) = Cstr(intVisits)

Response.Cookies(“VisitCount”).Path = “/”

Response.Cookies(“VisitCount”).Expires = DateADD(“m”,3,Now + 1)且对于几乎所有的其他Response方法和属性,应该在写入任何内容(即打开标记或任何文本或其他的HTML)到响应之前完成这个工作。

篇7:ASP 3.0高级编程四

ASP 3.0高级编程(四)

使用ServerVariables集合

当讨论Request对象内容时,要研究的集合之一就是ServerVariables集合。这个集合包含了两种值的结合体,一种是随同页面请求从客户端发送到服务器的HTTP报头中的值,另外一种是由服务器在接收到请求时本身所提供的值。为显示ServerVariables集合中值的使用方式,在Request Object页面(Show_request.asp)中,点击“ServerVariables Examples”链接,打开另外一个页面,如下图所示:

下图所示窗口显示的是ServerVariables集合中一些非常有用的值的一个子集。

“自引用”页面

在ServerVariables集合中返回的值包含Web服务器的详细信息和当前页面的路径信息。在任何地方创建一个页面都可使用这些信息。例如创建一个“自引用”页面,此页面能够再次调用自身完成另一项任务,我们可以用以下代码:

” METHOD=”POST”>

同样的效果可以用HTTP的“SCRIPT_NAME”值获得:

” METHOD=”POST”>

使用元素打开一个不同页,可以使用:

...

...

”>Next Page

...

即使原始页面的名称或位置发生变化,这些实例都能正常工作,因为使用了当前页面的路径信息(当然,第二个例子在分离的目标页的名称发生变化时运行会失败)。

换句话说,如果为搜索引擎的子会话自动建立URL,可以收集ServerVariable的一些值:

strFullURL =  ;& Request.ServerVariables(“LOCAL_ADDR”) _

& “:” & Request.ServerVariables(“SERVER_PORT”) _

& Request.ServerVariables(“PATH_INFO”)

这将创建一个完整的URL包括端口号(这种情况下,不是标准值80)。例如,结果可能是:

194.74.60.254:1768/thispath/thispage.asp

检测浏览器的版本

ServerVariables集合中,另外一个有用的值是用户浏览器的用户代理字符串。在“Detecting the Browser Type”页面(browsertype.asp),使用ServerVariables集合中的“HTTP_USER_AGENT”值来获得用户代理字符串,一些脚本用来解析该信息并寻找生产厂家名称和浏览器版本。

对IE 5.0和Navigator 4.61的搜索结果分别不同,对于其他厂家的浏览器,可以得到一个链接在Alta Vista Web站点自动开始搜索厂家的名称。

注意,Netscape在用户代理字符串中不提供厂家的名称,因而无法绝对保证一个浏览器一定是Navigator。

检测浏览器的语言

ServerVariables集合中另外一个有用的值是“HTTP_ACCEPT_LANGUAGE”,它包含了一个当浏览器安装时指定的,或硬编码进用户的地区版本的语言代码。语言代码的例子有en-us(英国、美国)、de-at(德国、澳大利亚)和es-pe(西班牙、秘鲁)。

语言代码可以是一般的且省略方言标识:例如,在我们的站点Wrox者,大批浏览者都是将en(英语)作为语言代码。

因此,可以检测语言代码并自动装载一个合适的特定地区或指定语言版本的页面。

StrLocale = Lcase(Left(Request.ServerVariables(“HTTP_ACCEPT_LANGUAGE”),2))

Select Case strLocale

Case “en”: Response.Redirect uk_site.co.uk/”

Case “de”: Response.Redirect de_site.co.de/”

Case “fr”: Response.Redirect fr_site.co.fr/”

‘... etc

Case Else: Response.Redirect us_sitel.com/”

End Select

或者根据特定的方言,重定向页面:

strLocale = Lcase(Request.ServerVariables(“HTTP_ACCEPT_LANGUAGE”))

Select Case strLocale

Case “en-gb”: Response.Redirect uk_site.co.uk/”

Case “en-us”: Response.Redirect us_site.com/”

Case “es-pe”: Response.Redirect es_site2.co.pe/”

‘...

Case Else: Response.Redirect us_site1.com/”

End Select

其他有用的ServerVariables集合的值

可以访问和使用ServerVariables集合中的任何一成员,控制ASP页面响应一个请求的方式。可以检查一个浏览者访问站点时使用的是否是缺省端口80或还是另一个。在这个例子里,寻找通过端口443的访问――这个端口提供的是安全套接字层(Secure Socket Layer,SSI)访问(和其他的协议),且将它们重定向到一个相应的页面。

If Request.ServerVariables(“SERVER_PORT”) = “443”) Then

Response.Redirect “/securesite/default.asp” ‘Secure user

Else

Response.Redirect&nbs

p;“/normalsite/default.asp” ‘Non-secure user

End If

假如要求浏览者注册且由服务器验证(而不是允许他们在Web服务器的IUSER帐号下匿名访问,这个问题将在后面章节中详细讨论),可以查询用户名称,来判定正在与我们打交道的用户是谁,是否装载页面给该用户。例如,下面的这个代码将只向名为Administrator的用户显示管理链接。

...

Change Display Configuration

Change Display Colors

Change Keyboard Configuration

Administer All Users

Administer Logon Information

...

注意ASP不填写ServerVariables集合直到你访问其中的一个成员。首次访问该集合的一个成员将使IIS得到它的全部,应只在需要时才使用ServerVariables集合。

其他Request和Response技巧

现在,来看一下几个使用Request和Response对象的有用技巧,包括:

・ 连接、缓冲和页面重定向的管理。

・ HTTP报头、缓存与“到期”页面的操作。

・ 利用客户证书。

・ 创建定制的日志文件消息。

1. 连接、缓冲和页面重定向的管理

ASP的一个很有用的特点就是使用户能够从一个ASP网页转向到另一个网页(ASP或HTML),或另一个源文件(例如一个ZIP文件或文本文件)。这对用户来说是透明的,实际上是浏览器做这个工作。当使用Response.Redirect方法来载入一个新的网页时,实际上是发送回一个特殊的HTTP报头到客户。此报头为:

HTTP/1.1 302 Object Moved

Location /newpath/newpage.asp

浏览器读到此报头信息,并按Location值的指示载入页面。这在功能上与在Web页中使用客户端HTML标记相同,例如:

这带来的一个问题是,服务器与用户之间的代理服务器可能会提供它自己的包含与新页面的链接的消息,而不是直接载入新页面。而且浏览器根据厂商和版本可能做同样的工作。这就去除了假定的透明,而且对用户来说一直收到的是错误信息,则对你的站点的访问变得比较麻烦。

在发送诸如文本或HTML等任何页面内容后,我们就不能再使用Redirect方法。然而,一个看起来能够限制“代理服务器影响”的方法是,先确定没有输出(包括HTTP报头)被发送到客户。在ASP 2.0中,必须打开缓冲,然后使用Clear方法来清空缓冲区:

Response.Buffer = True

‘Some condition to select the appropriate page:

If Request.ServerVariables(“SERVER_PORT”) = 1856 Then

StrNewPage = “/newpath/this_page.asp”

Else

StrNewPage = “/newpath/the_other_page.asp”

End If

Response.Clear

Response.Redirect strNewPage

在ASP 3.0中,缓冲缺省为打开,所以第一行可被忽略,但它是无害的,而且能确保我们的网页即使在ASP 2.0环境中也仍然能工作。

与其使用这种类型的HTTP报头重定向,不如使用ASP 3.0的一个新特性,它允许我们通过Server对象的Transfer方法转换为执行另一个网页,我们将在第4章进一步研究这个问题。

1) ASP页面缓冲区

正如已看到过的,IIS 5.0中ASP 3.0页面缓冲是缺省打开的,在早期的版本中是缺省关闭的。微软告诉我们缓冲在IIS 5.0中提供了更有效的网页传送,这就是缓冲缺省状态被改变的原因。在大部分情况下,这对我们没有影响。但是,假如有一个非常大的网页,或一个用ASP或别的服务器端代码和组件花费一定时间创建的网页,当其各部分完成时,我们能够分批刷新它们到客户:

...

... Code to create first part of the page

...

Response.Flush

...

... Code to create next part of page

...

Response.Flush

...

有时可能希望在页面结束之前的某些点上停止代码的执行,可以通过调用End方法去刷新所有的当前内容到客户并中止任何进一步的处理过程。

...

... Code to create first part of the page

If strUserName = “” Then Response.Clear

...

... Code to create a new version of this part of the page

...

这里有两上演示缓冲和重定向的实例网页,可以从“Response Object”主页面(sow_response.asp)下载它们。第一个Response.Redirect例子网页命名为redirect.asp,它在缓冲的页面中定入一些内容,清除缓冲区,并重定向到另一个网页:

For intLoop = 1 To 1000000

Response.Write “.”

Next

Response.Clear

Response.Redirect “show_redirect.asp”

>Response.End

目标页show_response.asp,做同样的工作,但重定向则是回到“Response Object”主页。因为这些网页都在缓冲区内,而且所有的输出在重定向之前必须清除,故在浏览器中没有可见的输出。然而,可以通过观察浏览器的状态看到发生的每一次重定向。如下图所示:

在“Response Object”主页中,点击“Response.Flush”链接将打开第二个示例网页usebuffer.asp,它简单地遍历一个字符串的每一个字符,以一定的延迟将它们刷新到客户,这虽是Web服务器和ASP极低效率的使用方式,但它演示了缓冲的工作方式。

下面是所要求的最小化的ASP代码,注意我们分别把每个字符刷新到浏览器,因为不这样的话它将被存放在缓冲区中,直至网页完成:

strText = “This text has been flushed to the browser using “ & _

“Response.Flush

For intChar =1 To Len(strText)

For intWrite = 1 To 100000

Next

Response.Write Mid(strText,intChar,1)

Response.Flush

Next

2) Response.IsClientConnected属性

IsClientConnected属性在ASP 2.0中已经存在了,但却有些不可靠。在其返回一个准确的结果之前必须发送一些输出到客户。这一问题在ASP 3.0中已被解决。现在这一属性可被自由使用。

IsClientConnected是观察用户是否仍连到服务器和正在载入ASP创建的网页的有用方式。如果用户断开连接或停止下载,我们就不用再浪费服务器的资源创建网页,因为缓冲区内容将被IIS丢弃。所以,对那些需要大量时间计算或资源使用较多的网页来说,值得在每一阶段都检查浏览器是否已离线:

...

... Code to create first part of the page

...

If Response.IsClientConnected Then

Response.Flush

Else

Response.End

End If

...

... Code to create next part of page...

1. 操作HTTP报头

我们已经在几处见到ASP如何创建或修改在响应页面请示时被发送到客户的HTTP报头。在Response对象中有几个属性和方法可帮助我们做到一点。下面是一些报头方法:

・ 控制缓存和有效期。

・ 创建状态和定制的HTTP报头。

・ 指定MIME类型或内容类型。

・ 添加PICS标签。

接下来将简要地研究每一个方面。可在“Response Object”主页(show_response.asp)上,单击相关属性名或方法名,来检查我们所说的属性和方法,如下图所示:

1. 缓存和“到期”ASP网页

用户的浏览器以及他们和服务器这间的任一代理服务器,都可以缓存HTML和用ASP创建的网页。当用户随后请求页面时,浏览器就发送一个“最新修改”的请求到服务器(使用一个包含缓存版本的日期的HTTP_IF_MODIFIED_SINCE报头),询问网页是否已被修改。

若没有被修改,服务器应用状态码和消息“304 Not Modified”来响应,浏览器将使用缓存的内容而不会通过网络下载一个副本。若已经存在已修改的版本,它就会与“200 OK”状态码和消息一道被发送出去。

1) Response.CacheContol属性

其他的一些因素也会影响这一处理过程。然而,任一被网页使用的网络路由内的代理服务器(一般位于客户机端),能被通过设置Response.CacheControl属性为Private来放弃缓存网页。在ASP 3.0中对ASP网页这是缺省的,不用设置。但在网页为个别访问者特别定制时尤其有用。这可以阻止别的在同一网络上的用户进入同一网页。当CacheControl的属性值被设定为Public时,允许服务器缓存网页。注意,一些代理服务器可能表现得不尽相同,或忽视或越过这个报头。

在IE4中,在代理服务器缓存可用时,有可能得到一个虚假的“This page has expired”消息。我们已提供了一个网页(expiretest_form.asp),可以通过自己的代理服务器在网络上做试验,来检查这一属性的影响。可以通过在“Response Object”主页中单击“Response. CacheControl”链接来显示这个网页。如下图所示:

这一页面提交到expiretest_result.asp网页时,能够设置Response.CacheControl属性,然后在网页中插入值和脚本被执行的时间:

<%

If Request.Form(“public”) = “on” Then ‘Cache-Control check box was ticked

Response.CacheControl = “Public”

Else

Response.CacheControl = “Private”

End If

%>

...

Cache-Control is:<% = Response.CacheControl %>

Value in text box is:<% Response.Write Request.Form(“textbox”)&n

bsp;%>

<%

Response.Write Right(“0” & Hour(Now),2) & “:” & Right(“0” & Minute(Now),_

& 2) & “:” & Right(“0” & Second(Now),2)

%>

通过单击浏览器上的“Back”和“Forward”,能看到代码是自动执行还是使用缓存的副本,如下图所示。结果随浏览器的不同而变化。

2) Response.Expires和Response.ExpiresAbsolute属性

控制缓存的网页存放时间的两个属性为Response对象的Expires和ExpriesAbsolute属性。Response.Expires定义了风页在从缓存区被丢弃前应保持有效的时间长度,以创建以来的分钟数形式表示。ExpiresAbsolute属性为到期时间设置了一个绝对的日期和时间。

我们提供一个命名为addheaders_form.asp的例子网页,用于演示如何使用这些属性。在“Response Object”主页中单击对这两种属性的链接,如下图所示:

在这一页面中,可加入自己定制的HTTP报头,并可设置一些影响响应的HTTP报头的多种属性。在“提交查询内容”按钮上单击时,页面show_headers.asp在返回的.数据流中添加所选的报头,然后显示用来完成此操作的代码,显示相应的执行时间,可用来检查页面是被缓存还是被再次执行,如下图所示:

show_headers.asp网页中的代码创建和添加HTTP报头,程序如下:

<%

‘Write HTTP headers before any other output

If Request.Form(“expires”) = “on” Then _

Response.Expires = Request.Form(“expires_value”)

If Request.Form(“expiresabs”) = “on” Then _

Response.ExpiresAbsolute = Request.Form(“expiresabs_value”)

If Request.Form(“lastmod”) = “on” Then _

Response.AddHeader “LAST-MODIFIED”, Cstr(Request.Form(“lastmod_value”))

If Request.Form(“pragma”) = “on” Then _

Response.AddHeader “PRAGMA”, CStr(Request.Form(“pragma_value”))

If Request.Form(“refresh”) = “on” Then _

Response.AddHeader “REFRESH”, CStr(Request.Form(“refresh_value”))

If Request.Form(“addheader”) = “on” And Len(Request.Form(“addheader_name”)) Then _

Response.AddHeader CStr(Request.Form(“addheader_name”)), _

CStr(Request.Form(“addheader_value”))

If Request.Form(“status”) = “on” Then _

Response.Status = Request.Form(“status_value”)

%>

...

... Show code and execution time

...

其余部分仅仅是显示已被执行的代码和执行时间。读者会注意到包含在网页中的定制的报头“PRAGMA”(至今我们还没讨论过)。一些(先前的)代理服务器使用它作为网磁是否应被缓存的指示。缺省是网页被缓冲,除非接受到HTTP报头“PRAGMA=NO-CACHE“。

2. 创建状态码和定制的HTTP报头

可使用先前在实例网页中所看到的Response对象的AddHeader方法来创建自己的状态码或自己喜欢的定制的报头。这一方法需要两个参数:HTTP报头名称或一个包含其值或分配给它的值的字符串。作为一个例子,下面的代码在页面中添加REFRESH报头:

Response.AddHeader “REFRESH”, ”60;URL=newpath/newpage.asp”

这等同于客户机端元素:

换句话说,也可配合Status属性使用AddHeader方法使浏览器载入一个新的页面:

Response.Status = “302 Object Moved”

Response.Addheader “Location”, “newpath/newpage.asp”

这等同于使用Response.Redirect方法:

Response.Redirect “newpath/newpage.asp”

Response.Status属性可被用来发送一些所需要的状态消息,例如添加如下几行:

Response.Status= “401 Unauthorized”

Response.Addheader “WWW-Authenticate”, “BASIC”

强制浏览器显示一个用

户名/口令对话框,然后使用BASIC验证把它们发送回服务器(将在本书后续部分看到验证方法)。

3. MIME类型和内容类型

当我们想向浏览器发送一个动态创建的字符串,而且它们自己提供给浏览器时没有直接指明内容类型,而是提供表示是否是磁盘文件的扩展名时,Response.ContentType是非常有用的。除非特别指定,所有ASP创建的网页缺省都为“text/type”。内容类型的标识符是MIME类型(MIME代表Multi-purpose Internet Multimedia Extension或Multi-pupose Internet Mail Extension,通常依据上下文来定)。

例如,若发送到客户的数据注解是通过从数据库读二进制值创建的图片,就需要在发送任何内容之前添加合适的CONTENT-TYPE报头:

Response.ContentType = “image/jpeg”

假如从一个数据库创建一个XML文件,使用MIEM类型“text/xml”;并且如果正在创建一个文本文件可以在文件编辑器中显示或作为一个磁盘文件在客户上被存储起来,使用“text/text”。

4. 添加PICS卷标

Respnse.Pics属性仅仅是添加一个PICS(Platform for Internet Content system)卷标到页面上,方式与通常用标记所用的方式相同:

QUOT = Chr(34)

StrPicsLabel = “(PICS-1.0” & QUOT & www.rsac.org/ratingsv01.html”_

& QUOT & “ 1 gen true comment “ & QUOT _

& “RSACi North America Server” & QUOT & “ for “ & QUOT _

& yoursite.com” & QUOT & “ on “ & QUOT _

& “.08.01T03:04-0500” & QUOT & “ r (n 0 s 0 v 2 l 3))”

Response.Pics(strPicsLabel)

这段代码添加了如下的PICS卷标:

(PICS-1.0 www.rsac.org/ratingsv01.html” 1 gen true comment “RSACi

North America Server” for yoursite.com” on “1999.08.01T03:04-0500”

r (n 0 s 0 v 2 l 3))

要得到关于PICS的更多的信息,或了解更多的定义页面内容的方式,请检www.rsac.org/站点。

在Internet Service Manager中定义报头

在第1章,已经说明了如何在Internet Service Manage(MMC插件)应用程序中设置每个Web网站和IIS 5.0目录的属性,这就定义了使用此站点或目录资源发送到客户机的所有请求的HTTP报头,也就提供了使用每个网页中的ASP脚本代码设置这些属性的替代方法。

在Web站点或目录上右击鼠标并选择“Properties”,在其对话框的“HTTP Headers”选项卡中,可设置页面内容有效期的相对时间或绝对日期,定义定制的报头,创建PICS内容等级标签,也可以通过MIME类型映射来定义内容类型,如下图所示:

在上图中,可以看到已创建了自定义的REFRESH HTTP报头,应用于从此目录载入的所有网页。即每一分钟自动地重载(刷新)一次(对于显示棒球比赛的最近比分是非常理想的,但对服务器而言负担太重了)。Custom HTTP Headers栏的Edit对话框如下图所示:

要在“MIME Map”框中添加自定义的内容类型映射,只需在“Properties”主对话框中单击“File Types”按扭把它们添加到清单中即可,如下图所示:

当使用HTTP报头开始试验时,你很快会发现不是所有的浏览器表现都相同,许多浏览器以不同的方式响应不同的HTTP报头,使得可靠地建立一个普遍适用的原则有时极为困难。

2. 使用客户证书

假如设立了一个安全的Web网站或部分内容具有安全机制的网站,可安装一个数字服务器证书,通过允许访问者使用证书中的加密的细节,来验证服务器。每一次对该站点或目录的页面请求,服务器都将发送证书的一个副本,浏览器可检查这个副本以确定正在和谁交谈。

同样,也可设置服务器,要求用户在进入网站时提供一个有效的数字证书。他们可从很多来源获得此证书,例如Verisignwww.verisign.com)或Thawte Consultingwww.thawte.com)。读者将在第25章看到这一处理过程的细节。

这些情况都使用了Request对象的ClientCertificate集合的值,本章的实例代码中,已包含了一个显示用户如何使用些集合值的一些方法的页面。

这一网页被命名为showcert.asp,而且其所做的一切就是遍历ClientCertificate集合显示其包含的所有值。可使用以前经常使用的简单代码来完成它,唯一的不同之处就是建立一个HTML表以容纳结果,并将其截为每60个字符一组。

<%

>For Each keyItem In Request.ClientCertificate

StrItemValue = Request.ClientCertificate(keyItem)

If Len(strItemValue) > 90 Then strItemValue = Left(strItemValue, 60) & “..etc.”

Response.Write “” & keyItem & “ = “ & strItemValue & “”

Next

%>

运行结果如下图所示:(由于豆豆没有申请服务器证书,该图略)

使用客户证书重定向

一旦要求所有访问网站或部分网站的浏览者给出的其客户证书,就可以使用其包含的信息来制作我们为此用户创建的网页。例如,可使用他们的证书的Organization条目来自动使他们重定向到该网站的指定部分,使别的访问者重定向到别的地方:

If Request.ClientCertificate(“SubjectO”) = “Wrox Press Inc” Then

Response.Redirect “/wrox_staff/default.asp” ‘Wrox staff site

Else

Response.Redirect “/public/Default.asp” ‘Normal public site

End If

相应地,可使用Country条目来使访问者重定向到一个相应的网站:

Select Case Request.ClientCertificate(“SubjectC”)

Case “UK”: Response.Redirect uk_site.co.uk/”

Case “DE”: Response.Redirect de_site.co.de/”

Case “FR”: Response.Redirect fr_site.co.fr/”

‘... ect.

Case Else: Response.Redirect us_site.com/”

End Select

3. 读写二进制数据

有两个方法提供了对从浏览器发送到服务器的HTTP数据流和从服务器返回到浏览器的数据流的二进制数据访问。Request.BinaryRead方法可得到指定要读取的字节数的参数,并返回变体类型的数组,其中包含从请求的POST段中得到的字节(例如在ASP的Form集合中数据)。下面的程序读数据的头64个字节:

varContent = Request.BinaryRead(64)

假如使用了BinaryRead方法,以后就不能访问ASP的Request.Form集合。同样,一旦我们采用任何方式引用了Request.Form集合,就不能使用BinaryRead方法。

把二进制数据写进ASP创建的响应流中也是可能的,可采用BinaryWrite方法。需要给其提供想写到客户的字节的变体类型数组:

Response.BinaryWrite(varContent)

这些方法都很少使用,除非从一个数据库创建非HTML源才用到这些方法。使用的一个实例就是从数据库读取组成图像的字节,并使用BinaryWrite方法把它发送到客户。

4. 创建定制的日志消息

假如设置了服务器,以W3C Extended Log File Format格式将请求记录到一个文本文件,可使用Response.AppendToLog方法在日志文件条目的结尾处添加一条消息字符串。若想为特定的网页存储一些值或消息,或在脚本中出现了特定的情况时,这种方式是非常有用的。

例如,通过的Intranet的“stationary order”应用程序,可以记录超过特定的条目数目的雇员的部门号码:

...

If intItemCount > 25 Then

Response.AppendToLog “Large order from ‘” & strDept & department.”

End If

...

设置扩展的日志

要使用AppendToLog方法,必须激活W3C Extended Log File Format日志设置。该设置方法是,进入Properties对话框中的Web Site选项卡,选中Enable Logging复选框,选择W3C Extended Log File Format并单击Properties按钮,如下图所示:

在出现的Extended Logging Properties对话框中,可选择想包括进日志文件的条目。确保选中URI Stem,否则AppendToLog方法将失败,如下图所示:

我们提供了一个试图在日志文件中写入一个条目的简单实例页面,可从Request Object主页(show_request.asp)中的AppendToLog方法链接处打开它。这一页面所做的全部工作就是创建一个包含当前日期和时间的简单字符串,然后执行AppendToLog方法:

strToAppend = “Page executed on ” & Now

Response.AppendToLog strToAppend

结果如下图所示:

小结

本章已经开始了对ASP

3.0的研究,而且我们也看到了ASP 3.0如何与Internet Informateion Server 5.0共同工作,以提供一个易用的、高效的创建动态Web网页和Web应用程序的方法。当然,仍有一些地方需要去研究,本章仅仅是学习了ASP内置的两个最基本的对象。

这两个最基本的对象是Request和Response对象,允许我们访问和使用作为客户机/服务器会话一部分的值,无论用户何时从Web网站请求和载入一个网页或资源,这种会话就会进行,意味着Request对象能够提供对用户请求的全部内容的访问,同时Response对象允许创建和修改服务器发回的响应。

这些对象能够通过集合和属性揭示会话的各个部分,并提供了多个能用来检索和修改各段的方法。假如把它们当作分解用户请求和使用相应的内容创建响应的工具,这有助你理解究竟发生了什么。这也将有助于理解各种方法如何影响客户、服务器和正在创建的网页。

篇8:ASP 3.0高级编程一

ASP 3.0高级编程(一)

ASP 3.0请求和响应的处理

这两个对象是ASP所提供的内置对象中最常用的两个。在浏览器(或其他用户代理)和Web服务器之间,请求与响应中发生的信息交流可以通过ASP中的两个内置对象来进行访问和管理,这两个对象称为Request和Response对象。

在ASP页中所要进行的工作几乎都要访问这两个对象,使用这两个对象的方式将影响页面的效率及可靠性。当然,它们的主要用途是访问用户发回到服务器的值,即从HTML页的

段获得或附在URL后面作为查询字符串,并创建合适的输出返回给用户,且它们可以共享很多相同的因素。例如两个对象都可以使用存储在客户端计算机上的cookie。

因此,我们把内容分成两个独立的部分(每个对象一部分),并且首先从客户端与服务器这间的信息交流入手,然后再研究每一个对象。

研究的内容是:

・ 客户端与服务器如何交流以传递Web或其他资源。

・ Request和Response对象的细节,以及它们之间的共同点。

・ 如何通过一个窗体和查询字符串访问相应的值。

・ 如何读入或创建cookie并存放在客户端的计算机上。

・ 服务器的变量是什么?如何访问和修改HTTP报头。

・ 说明其他相关条目的变化,如客户的证书使用。

客户端和服务器的交流

为节省篇幅,后面的内容中使用“浏览器”(browser)一词。但需要记住的是,能够访问Web页面的应用程序绝不仅只有浏览器,有许多特殊的应用程序从站点上下载网页,如为那些视力有缺陷用户设计的特殊的客户端程序或者是用通常的浏览器有其他困难的人。最显而易见的例子是搜索引擎用来访问Web上的站点的robot。全面考虑这些因素,包括普通的Web浏览器,准确的词汇应该是用户代理(user agent)。

页面请求的对话

当一个浏览器向Web站点提出页面请求时,显然必须告诉服务器,其请求的是哪一个页面。首先要做的是通过域名与服务器建立连接,然后提供所请求的页面的全路径和名称。为什么要全路径和名称?Web是一个无国界的环境,所以必须创造一个会话标识每个客户(将在以后介绍ASP如何做到这点)。

这就意味着每当服务器完成向客户发送页面后,服务器就彻底忘记了这个客户。因此,当客户请求下一个页面时,与一个新的访问者是完全相同的。服务器无法记住这个客户,相应的,也就无法判断它们上次请求的页面是哪一个。因为,不能使用相对路径来提供一个页面,即使页面包含一个相对的链接也不行,例如:

Next Page

浏览器将自动建立完整的新页面的URL,方法是使用当前页的域和路径;或使用页面段中的元素,告诉浏览器一个页面中所有链接的其URL是什么。例如:

" target=_blank>www.wrox.com/Store>;

当把鼠标指向一个页面的链接时,可在浏览器的状态栏中看到。当前页面的路径和当前域名或基域名或基路径已经与请求的页面名结合在一起了。

1、 客户请求的细节

所请求页面的全路径和名称的组合是浏览器请求页面时发住服务器的唯一住处浏览器的请求也能包含浏览器宿主的住处和客户端运行的操作系统。实际的信息内容将随着浏览器的不同而有相应的变化,只有很少一部分能够由其他的应用程序如搜索引擎robot提供。为了更清楚地了解该信息,下面是从IE 5.0发出的一个对页www.wrox.com/Store/

Download.asp的请求信息:

7/8/99 10:27:16 Sent GET /Store/Download.asp HTTP/1.1

Accept: application/msword, application/vnd.ms-execl, application/vnd.ms-

powerpoint, image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-

comet, */*

Accept-Language: en-us

Encoding: gzip, deflate

Referer: ww.wrox.com/main_menu.asp

Cookie: VisitCount=2&LASTDATE=6%2F4%2F99+10%3A10%3A13+AM

User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows 98)

Host: 212.250.238.67

Connection: Keep-Alive

从中可以看出,这些信息中有关于用户代理和用户连接的细节(如缺省的语言),也有能够接受的文件或应用程序的类型列表,这些都是MIME类型的,在后面将会见到更多。浏览器能够接受几种图像文件及多种Microsoft Office文件类型。“标准”的文件类型,如tesx/html和text/text没有列在其中。文件列表中*/*表示可向浏览器发回任何类型的文件,由浏览器解释或通过一个插件(plug-in)应用程序来进行解释。

cookie: 条目包含的cookie存放在客户端的计算机上,并仅对该域有效。假如请求是点击链接的`结果,而不是在浏览器的地址栏直接输入URL,则Referer:条目被显示出来,它包含了链接页面的完整的URL。

Host:条目包含客户计算机的IP地址或名称。然而,这还不足以准确辨别客户机。因为它们通过ISP连接时,IP地址是动态分配的,或者通过一个代理服务器连接时,IP地址是代理机的而不是实际的客户机的。

2、 服务器响应的细节信息

为响应上述的请求,并对匿名的浏览器(即用户不必提供用户名和访问口令)提供请求的页面,下面的内容是从服务器发往客户机的:

7/8/99 10:27:16 Received HTTP/1.1 200 OK

Server: Microsoft-IIS/5.0

Connection: Keep-Alive

Date: Thu, 8 Jul 1999 10:27:16 GMT

Content-Type: text/html

Accept-Ranges: bytes

Content-Length: 2946

Last-Modified: Thu, 8 Jul 1999 10:27:16 GMT

Cookie: VisitCount=3&LASTDATE=7%2F8%2F99+10%3A27%3A16+AM

… rest of page …

可以看出服务器向客户端说明自己所用的软件及版本,第一行表明所使用的是HTTP协议,及返回码的状态。信息“200 OK”表示请求被接受并得到了满足。后面的信息是被返回的页面的细节,包括MIME类型(Content-Length:)、大小(字节)、最近更改时间,和返回客户端存储的cookie。响应中的其他信息是页面内容的信息流。

在某些情况下,服务器响应一个请求后,不能返回一个页面,也许因为页面不存在,或都客户没有相应的权限来访问它。我们将在后面讨论安全问题。现在,对于请求页面不存在的情况(例如用户在浏览器的地址栏输入了错误的URL),返回的信息开头为:

7/8/99 14:27:16 Received HTTP/1.1 404 Not Found

Server: Microsoft-IIS/5.0

这里,状态码和信息表明客户请求的页面无法找到。浏览器可使用这个信息向用户显示相应的信息(这种情况在IE 5.0中不显示服务器的响应信息,而显示相应“帮助性”的错误提示页面),也可显示服务器创建的缺省页面(依赖服务器的设置)。

Request和Response对象

从ASP中能够应用客户请求和服务器响应的细节是通过ASP内置的Request和Response对象来实现的。

・ Request对象:为脚本提供了当客户端请求一个页面或者传递一个窗体时,客户端提供的全部信息。这包括能指明浏览器和用户的HTTP变量,在这个域名下存放在浏览器中的cookie,任何作为查询字符串而附于URL后面的字符串或页面的段中的HTML控件的值。也提供使用Secure Socket Layer(SSL)或其他加密通信协议的授权访问,及有助于对连接进行管理的属性。

・ Response对象:用来访问服务器端所创建的并发回到客户端的响应信息。为脚本提供HTTP变量,指明服务器和服务器的功能和关于发回浏览器的内容的信息,以及任何将为这个域而存放在浏览器里新的cookie。它也提供了一系列的方法用来创建输出,例如无处不在的Response.Write方法。

1、 Request对象成员的概述

a) Request对象的集合

Request对象提供了5个集合,可以用来访问客户端对Web服务器请求的各类信息,这些集合如下表:

Request对象的集合及说明

集合名称

说明

ClientCertificate

当客户端访问一个页面或其他资源时,用来向服务器表明身份的客户证书的所有字段或条目的数值集合,每个成员均是只读

Cookies

根据用户的请求,用户系统发出的所有cookie的值的集合,这些cookie仅对相应的域有效,每个成员均为只读

Form

METHOD的属性值为POST时,所有作为请求提交的段中的HTML控件单元的值的集合,每个成员均为只读

QueryString

依附于用户请求的URL后面的名称/数值对或者作为请求提交的且METHOD属性为GET(或者省略其属性)的,或中所有HTML控件单元的值,每个成员均为只读

ServerVariables

随同客户端请求发出的HTTP报头值,以及Web服务器的几种环境变量的值的集合,每个成员均为只读

b) Request对象的属性

Request对象唯一的属性及说明如下表所示,它提供用户请求的字节数量的信息,它很少用于ASP页,我们通常关注指定值而不是整个请求字符串。

属性

说明

TotlBytes

只读,返回由客户端发出的请求的整个字节数量

c) Request对象的方法

Request对象唯一的方法及说明如下表所示,它允许访问从一个段中传递给服务器的用户请求部分的完整内容。

Request对象的方法及说明

方法

说明

BinaryRead(count)

当数据作为POST请求的一部分发往服务器时,从客户请求中获得count字节的数据,返回一个Variant数组(或者SafeArray)。如果ASP代码已经引用了Request.Form集合,这个方法就不能用。同时,如果用了BinaryRead方法,就不能访问Request.Form集合

2、 Response对象成员概述

a) Response对象的集合

Response对象只有一个集合,如下表所示,该集合设置希望放置在客户系统上的cookie的值,它直接等同于Request.Cookies集合。

Response对象的集合及说明

集合名称

说明

Cookies

在当前响应中,发回客户端的所有cookie的值,这个集合为只写

b) Response对象的属性

Response对象也提供一系列的属性,可以读取(多数情况下)和修改,使响应能够适应请求。这些由服务器设置,我们不需要设置它们。需要注意的是,当设置某些属性时,使用的语法可能与通常所使用的有一定的差异。

Response对象的属性及说明

属性

说明

Buuffer=True|False

读/写,布尔型,表明由一个ASP页所创建的输出是否一直存放在IIS缓冲区,直到当前页面的所有服务器脚本处理完毕或Flush、End方法被调用。在任何输出(包括HTTP报送信息)送住IIS之前这个属性必须设置。因此在.asp文件中,这个设置应该在语句后面的第一行。ASP 3.0缺省设置缓冲为开(True),而在早期版本中缺省为关(False)

CacheCon

trol”setting”

读/写,字符型,设置这个属性为“Public”允许代理服务器缓存页面,如为“Private”则禁止代理服务器缓存的发生

Charset=”value”

读/写,字符型,在由服务器为每个响应创建的HTTP Content-Type报头中附上所用的字符集名称(例如:ISO-LATIN-7)

Content Type=”MIME-type”

读/写,字符型,指明响应的HTTP内容类型,标准的MIME类型(例如“text/xml”或者“Image/gif”)。假如缺省,表示使用MIME类型“text/html”,内容类型告诉浏览器所期望内容的类型

Expires minutes

读/写,数值型,指明页面有效的以分钟计算的时间长度,假如用户请求其有效期满之前的相同页面,将直接读取显示缓冲中的内容,这个有效期间过后,页面将不再保留在私有(用户)或公用(代理服务器)缓冲中

Expires Absolute #date [time]#

读/写,日期/时间型,指明当一个页面过期和不再有效时的绝对日期和时间

IsClientConnected

只读,布尔型,返回客户是否仍然连接和下载页面的状态标志。在当前的页面已执行完毕之前,假如一个客户转移到别一个页面,这个标志可用来中止处理(使用Response.End方法)

PICS(“PICS-Label-string”)

只写,字符型,创建一个PICS报头定义页面内容中的词汇等级,如暴力、性、不良语言等

Status=”Code message”

读/写,字符型,指明发回客户的响应的HTTP报头中表明错误或页面处理是否成功的状态值和信息。例如“200 OK”和“404 Not Found”

c) Response对象的方法

Response对象提供一系列的方法,如下表所示,允许直接处理为返回给客户端而创建的页面内容。

Response对象的方法及说明

方法

说明

AddHeader(“name”,”content”)

通过使用name和Content值,创建一个定制的HTTP报头,并增加到响应之中。不能替换现有的相同名称的报头。一旦已经增加了一个报头就不能被删除。这个方法必须在任何页面内容(即text和HTML)被发住客户端前使用

AppendToLog(“string”)

当使用“W3C Extended Log File Format”文件格式时,对于用户请求的Web服务器的日志文件增加一个条目。至少要求在包含页面的站点的“Extended Properties”页中选择“URL Stem”

BinaryWrite(safeArray)

在当前的HTTP输出流中写入Variant类型的SafeArray,而不经过任何字符转换。对于写入非字符串的信息,例如定制的应用程序请求的二进制数据或组成图像文件的二进制字节,是非常有用的

Clear()

当Response.Buffer为True时,从IIS响应缓冲中删除现存的缓冲页面内容。但不删除HTTP响应的报头,可用来放弃部分完成的页面

End()

让ASP结束处理页面的脚本,并返回当前已创建的内容,然后放弃页面的任何进一步处理

Flush()

发送IIS缓冲中所有当前缓冲页给客户端。当Response.Buffer为True时,可以用来发送较大页面的部分内容给个别的用户

Redirect(“url”)

通过在响应中发送一个“302 Object Moved”HTTP报头,指示浏览器根据字符串url下载相应地址的页面

Write(“string”)

在当前的HTTP响应信息流和IIS缓冲区写入指定的字符,使之成为返回页面的一部分

篇9:Delphi 与SQL编程(二).net

5 SQL编程实例 我们在学习了SQL程序的编写方法之后,我们便可以着手创建自己的应用程序了,通过创建应用程序我们对Delphi的强大功能就会有更深刻的印象,同时会进一步全面掌握有关SQL编程的知识,在本节中我们主要介绍两个例子,前一个例子主要是用静态的SQL

5 SQL编程实例

我们在学习了SQL程序的编写方法之后,我们便可以着手创建自己的应用程序了,通过创建应用程序我们对Delphi的强大功能就会有更深刻的印象,同时会进一步全面掌握有关SQL编程的知识,在本节中我们主要介绍两个例子,前一个例子主要是用静态的SQL语句编程,后一个例子是用动态SQL语句编程,

5.1 设计简单的SQL程序编辑器

例1:在这个例子中,我们设计一个交互式的SQL程序编辑器,在这个编辑器中,我们可以根据SQL语言的语法规则,编写常用的SQL命令,并通过单击编辑器中的有关的按钮,直接执行编写好的SQL命令,SQL命令的执行结果也会及时地通过一个TDBGrid 部件显示出来。

表3 SQL编辑器中个主要部件的属性

━━━━━━━━━━━━━━━━━━━━

部 件 属 性 值

────────────────────

Form1 Caption=SQL程序编辑器

DBGrid1 DataSource=DataSource1

Button1 Caption=执行(&E)

Button2 Caption=清除(&C)

Button3 Caption=退出(&X)

Button3 kind=bkClose

Memo1

DataSource1 DataSet=Query1

Query1 DatabaseName=DEMOS

━━━━━━━━━━━━━━━━━━━━

因为我们在设置Query1的DatabaseName属性时将其设置为DEMOS,所以我们设计的这个SQL程序编辑器只能对DEOMS中的数据库表进行操作。

单击按钮Button1的事件处理过程代码为:

程序清单17.1

procedure TForm1.Button1Click(Sender:TObject);

begin

Query1.close;

Query1.SQL.clear;

Query1.SQL.Add(Memo1.text);

Query1.Open;

end;

单击按钮Button2的事件处理过程为:

程序清单17.2

procedure TForm1.Button2Click(Sender:TObject);

begin

Query1.close;

Query1.SQL.clear;

Query1.ExceSQL;

end;

下面我们对程序清单17.1和程序清单17.2中的程序代码进行简要的分析:

程序清单17.1中的程序代码是用来执行查询的,

Query1.close;

这一行程序是用来关闭Query1的,我们在前面的章节中介绍过,只有在调用close 方法将TQuery部件关闭之后,才能修改其SQL属性值,执行close命令关闭查询是很安全的,如果查询已经被关闭了,调用该方法不会产生任何影响。

Query1.SQL.clear;

因为TQuery部件的SQL属性只能包含一条SQL语句,调用Clear 方法的目的是为了清除SQL属性原来的属性值即原来的SQL命令语句,如果不调用clear方法清除原来的SQL命令语句,当在后面的程序中调用Add方法为SQL属性设置新的SQL命令语句时,Delphi 会将新的SQL命令语句加在原来的SQL命令语句,这样使得SQL属性中包含两条独立的SQL语句,这是不允许的。

Query1.SQL.Add(Memo.text);

该条命令是将SQL编辑器的编辑区内的内容(TMemo部件Memo1)设置成Query1的SQL属性值。

Query1.open;

该语句用来执行Query1中的SQL命令语句,如果执行查询从数据库中获得查询结果,查询结果会在数据网格DBGrid1中显示出来。

程序清单2是用来清除查询的,其前两行语句跟程序清单1中的代码是一样的。Query1.ExecSQL有一些特别,调用ExecSQL方法也是打开Query1,ExecSQL方法与open方法不一样的,请参看前面的章节,当Query1中SQL属性值为空时,即没有SQL语句时,只能调用ExecSQL方法来打开Query1,如果调用 open 方法会返回一个错误。 在执行完 Query1.ExecSQL语句之后,应用程序将会清除数据网格DBGrid1中的所有内容。

共4页: 1 [2] [3] [4] 下一页

原文转自:www.ltesting.net

篇10:高级会计师考试试题[二]

[案例1]

资料:某国有企业集团总会计师李军参加了财政部门组织的会计职业道德培训班后,认识到会计诚信教育事关重大,随即组织了本集团会计人员职业道德培训。培训结束时进行了考试,试题中有一案例,要求学员进行分析,案例如下:

晓东电子公司会计赵丽因工作努力,钻研业务,积极提出合理化建议,多次被公司评为先进会计工作者。 赵丽的丈夫在一家私有电子企业任总经理,在其丈夫的多次请求下,赵丽将在工作中接触到的公司新产品研发计划及相关会计资料复印件提供给其丈夫,给公司带来一定的损失。公司认为赵丽不宜继续担任会计工作。

试分析回答下列问题:

(1)赵丽违反了哪些会计职业道德要求?

(2)哪些单位或部门可以对赵丽违反会计职业道德行为进行处理?并说明理由。

对问题(1)[赵丽违反了哪些会计职业道德要求?]主要有以下三种答案:

答案一:赵丽违反了“爱岗敬业”、“参与管理”、“坚持准则”会计职业道德要求;

答案二:赵丽违反了“诚实守信”、“廉洁自律”会计职业道德要求;

答案三:赵丽违反了“客观公正”、“提高技能”、“强化服务”会计职业道德要求。

对问题(2)[哪些单位或部门可以对赵丽违反会计职业道德行为进行处理?并说明理由。]主要有以下四种答案:

答案一:任何单位均不能对赵丽违反会计职业道德行为进行处理。主要理由:会计职业道德不是会计法律规范,而是一种软约束,需要依靠会计人员自律、自愿遵守,如果不遵守只能受到道义上的谴责。

答案二:只能由会计职业组织对赵丽违反会计职业道德行为进行处理。主要理由:会计职业道德是一种职业规范,应由会计职业组织对不遵守会计职业道德的会计人员(会员)进行惩戒,其他部门和单位均不宜处理。

答案三:只能由财政部门对赵丽违反会计职业道德行为进行处理。主要理由:财政部门负责管理会计工作和会计人员、颁发会计从业资格证书、开展会计人员评优表彰活动等工作,会计人员违反会计职业道德行为,应由财政部门进行处理。

答案四:财政部门、会计职业组织、本单位均可以对赵丽违反会计职业道德行为进行处理。主要理由:财政部门、会计职业组织、所在单位根据法律、规章的规定,可以在各自的职权范围内对违反会计职业道德行为进行处理。

要求:

从会计职业道德角度,分析判断每个问题中的答案,哪个答案是正确的?并分别说明理由。

[分析与提示]

1.问题(1)中的答案二(赵丽违反了诚实守信、廉洁自律会计职业道德要求)是正确的。

诚实守信是指会计人员应当做老实人,说老实话,办老实事,执业谨慎,信誉至上,不为利益所诱惑,不弄虚作假,不泄露秘密。廉洁自律是指会计人员应当公私分明、不贪不占,遵纪守法、尽职尽责。赵丽把在工作中接触到的公司新产品研发计划及相关会计资料复印件,提供给在一家私有电子企业任总经理的丈夫,这是因情感和利益诱惑等因素,违背了诚实守信、廉洁自律会计。

高级会计师行政事业单位财务与会计二

编程学习计划

数控编程技巧

数控车床编程个人简历

信息编程论文

全国高级会计师考试企业合并大纲二

高级会计师执业资格之模拟考试题二

网络编程个人求职信

网络和 编程基本知识

软件编程实习心得体会

ASP 3.0高级编程二(共10篇)

欢迎下载DOC格式的ASP 3.0高级编程二,但愿能给您带来参考作用!
推荐度: 推荐 推荐 推荐 推荐 推荐
点击下载文档 文档为doc格式
点击下载本文文档