|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
问题是他们究竟是喜欢他们是使用软件时,速度快还是速度慢好.(当然在3秒以内).无论是他们输入资料时,查找资料时,分析资料时.假定如今你要在站点上创建一个多页面的定货表单,从而实行从站点经由过程email发给定单誊写人,并假定这些独自的页面、页面的个数和页面上的输出域都能够依据实践要订购的产物而改动。
假如我们将每一个页面都分离提交给FrontPage的email导游或CGI的email程序,那末不幸的定单誊写人就要为定单的每页都收到一个独自的邮件信息。固然我们能够经由过程session变量、埋没域或查询字符串将定货数据从一页传送到另外一页,可是在内存中贮存这些数据会形成使用程序不屈衡,别的潜伏地必要大批的剧本。并且当页面上的域变更时还必需要修正剧本代码,以是代码不太可以再使用。
假如可以写出一套剧本能够用在一切这些定单页面中,只把HTML页面的计划留给WEB计划者,那就太好了。
一个复杂的谜底是,将每一个页面中的数据保留在一个文件中,然后将一切这些文件毗连起,再将之用Email体例发送给定单誊写人。这类办法别的另有一个优点是假如乐意能够在硬盘上坚持一时文件,那末在晚些时分用户能够持续一个未完成的定单。最好的一点是,实行这一举措不必要第三方组件,而只必要session变量,ASP剧本和Scripting.FileSystemObject工具。
起首要为这些独自的页面数据文件断定独一的名字,如许在定单停止时能够将它们放在一同,而且不会被使用程序中的别的文件所掩盖。同时,必要从单个session变量暗示的文件举行聚合中,如许就不会偶尔将一个旧session中的数据包括到以后的定单中。
由IIS所供应的Session变量("SessionID")在一个Session过程当中在收集服务器上是独一辨认的,可是到了前面,Session就能够被复制。(现实上,SessionID在今后会话Session时老是要被复制的,SessionID存储在客户机的一个cookie中。当收集服务器从客户机中吸收到一个已往会话的SessionID时,若它没有被另外一个举动会话所利用,就利用不异的值,如许就不必向扫瞄器发送另外一个cookie了,有关的信息能够拜见微软MSDN上的ManagingSessions。
为了独一辨认session,我们要创立一个本人的session辨认器Session("SessionToken"),利用工夫磨练的办法:
向SessionID附加日期和工夫。
SubSetSessionToken
dimdtTemp
dimsDate
dimsTime
dtTemp=date
sDate=Year(dtTemp)&Month(dtTemp)&Day(dtTemp)
dtTemp=Time
sTime=Hour(dtTemp)&Minute(dtTemp)&Second(dtTemp)
Session("SessionToken")=Session.SessionID&"-"&sDate&"-"&sTime
EndFunction
经由过程将SetSessionToken封装成函数,能够容易地修正算法来天生一个session标记,而不必影响代码的别的部分。在第一页定单的顶端将挪用SetSessionToken。
每页都要有一个独一的页码,要将它附加到session标记变量上往发生文件名。给页面利用任何一种标记都能够,可是在这里的使用程序中,页面必需要依照输出的按次被输入,以是就利用一个捕获这一按次的页码。跟后面一样,将这个文件名算法封装到一个函数中,今后修正起来就很简单了。
FunctionBuildFilename(iPage)
--ifthesessionhasexpired,returnanullfilename.
IfSession("SessionToken")=""Then
BuildFilename=""
Else
BuildFilename=Session("SessionToken")&iPage&".txt"
EndIf
EndFunction
在定单第一页前面每页的顶端,都挪用WritePage函数将夙昔一页提交的数据写进文件。最初一页以后也挪用这个函数。
FunctionWritePage(iPrevPage)
dimsFilename
dimobjFSO
dimobjTS
dimobjField
sFilename=buildFileName(iPrevPage)
SetobjFSO=CreateObject("Scripting.FileSystemObject")
SetobjTS=objFSO.OpenTextFile(sFilename,2,True)
--notethatusingFor..EachontheRequest.Form
collectiondoesnotreturnthefieldsinany
specificorder.
ForEachobjFieldinRequest.Form
--writeonefieldperlinetotheoutputfile,name=value
objTS.WriteLineobjField&"="&Request.Form(objField)
Next
objTS.Close
SetobjTS=nothing
SetobjFSO=nothing
EndFunction
要记着每页的数据都由前面一页来卖力写进文件,以是第二页必需晓得它是跟从第一页的,顺次类推。用一个session变量CurrDataPage把以后表双数据页码从这一页的入手下手带到下一页的WritePage()挪用中,而不是在挪用中利用每一个页码的硬编码。一会儿就可以看到,将一切页码分离起来的程序要晓得最初一个页码是甚么,以是利用一个子程序来给CurrDataPage赋值,同时检察它是否是最初一页的页码。
<%
SubSetCurrPage(iPageNum)
IfiPageNum>Session("MaxDataPage")Then
Session("MaxDataPage")=iPageNum
EndIf
Session("CurrDataPage")=iPageNum
EndSub
%>
如许,每页(第一页除外)在剧本<BODY>区的顶端都是如许的:
<%
WritePage(Session("CurrDataPage"))
SetCurrPage({thispagesnumber})
%>
而第一页剧本是:
<%
SetSessionToken
SetCurrPage(1)
%>
数据的最初一页将被提交给一个确认页,这是任何电子商务站点上的尺度步骤。我们的情形必要一个确认页,以供应一个时机来写出最初一页定单的数据,并创建传输数据的文件。(假如不想用一个确认页,也能够用一个剧本在开头重定向到纯ASP页。)
GetAllData函数将前往在分歧页中输出的一切数据元素的组合值。
FunctiongetAllData
dimsFilename
dimI
dimobjFSO
dimobjTS
dimsLine
dimsBody
dimiNumPages
iNumPages=Session("MaxDataPage")
sBody=""
SetobjFSO=CreateObject("Scripting.FileSystemObject")
--retrievepagesinpage-numberorder
ForI=1toiNumPages
sFilename=buildFileName(I)
--notallpagesexistforeveryorder
IfobjFSO.FileExists(sFileName)Then
SetobjTS=objFSO.OpenTextFile(sFilename,1)
DoWhileNotobjTS.AtEndOfStream
sLine=objTS.ReadLine
sBody=sBody&sLine&vbcrlf
Loop
objTS.Close
SetobjTS=nothing
EndIf
Next
SetobjFSO=nothing
getAllData=sBody
EndFunction
要注重GetAllData函数在每行停止时利用回车换行符(carriage-return)组合,而不是用HTML的<BR>元素。假如在确认页上用inline文本或HTML显现一切定单数据,这就会是一个很长的页。假如这么做,就会将用户接口的关头部分“用户呼应时用的按钮和控件”都推到屏幕的可视部分以外,如许,这个页面就远远不克不及说是很注重用户友爱性。要使页面不是太长,能够在一个转动文本框中显现定单数据,而不是利用全体的HTML。要回忆这些数据时,用户必需利用转动条,可是他们不用转动全部扫瞄器窗口。
经由过程在<TEXTBOX>元素的VALUE子句中嵌进一些ASP剧本,能够显现定单的情形:
<FORMMETHOD="POST"ACTION="mailer.asp">
<TEXTAREAROWS="20"><%Response.WritegetAllData%>
</TEXTAREA></FORM>
onfocus事务的处置并非交给ASP,而是由客户真个javascript实行。用<TEXTAREA>元素作为转动显现框
的成绩是用户能够在框中显现的数据之上打字。This.blur()使核心到下一个把持上,如许用户就不克不及在文本区打字了。他们能够从文本区当选择文本,乃至能够在个中安排文本指针,可是不克不及真正修正它。
假如你对用户在数据确认显现中打字感应担心,那末就能够不利用javascript,另外一种选择是利用一个埋没的域,除实践显现的文本区以外,将它添补到ASP中。依据你的页面的排版情形,乃至能够把两个文本区处置成独自的表单,如许用户看到的这一个不是带有提交按钮表单的一部分。
如今一切的数据都会合在一个表单中,能够用FrontPage文件或email导游来处置它,大概用CDO或MAPI的办法来email它们。要发送HTML格局的email,就要在组合的定单申明顶用<BR>元素代替回车换行符。假如必要撑持这两种格局,能够在GetAllData中增添第二个参数来指明输入是否是必要间接的文本大概HTML格局。
长处和弱点
任何一种工具或办法的代价取决于试图办理的成绩和特定的情况。如今来看看这类办法的正反两面:
长处
○不必要第三方把持;
○不必要任何客户端表单处置(除确认页上一点javascript之外,而那也是能够选择的);
○剧本与HTML很好地分别。多半剧本代码位于页面的顶端和底部;
○最小的内存需求。
弱点
○必要更多的磁盘空间,最少是一时的;
○更多的磁盘输出输入,在轻型-中型服务器负载下,大概会比在内存中处置的办理办法速率慢;
○利用了Session变量(更多的细节请看利用Session变量的长处与弱点)。
结论
这个处置多页面表单的办法很简单了解,实行起来也很间接,可是有很多中央分明地必要增强。起首,能够用另外一种办法贮存一时数据,多是数据库。另外一种多是利用一个XML文件,如许就能够免去每页都必要一个独自的数据文件的必要,并且能够使用MicrosoftXML分化工具:IE5和XMLDOMAPI。XML文件更简单被别的使用程序利用,也更简单文档化。
特别是在一个多服务器的情况中,我们大概会选择用Session工具来办理session。在session变量的办理手艺办法上有两篇很好的文章,是JeffBenson的"SerializeYourSessionwithaHomegrownStateManagementComponentforASP",和CraigMcQueen的"MaintainingUserStatewiththeActiveUserObject(AUO)"。
最初,我们大概想要改动创立session辨认号的体例。把用户帐号与定单的日期和工夫分离起来,就同意用户从头入手下手一个之前未完成的定单。大概也能够把之前的session辨认号贮存在一个cookie中偏重新装载到下一个session中。
点击此处下载本文相干文档。
在实现ERP等高端的ASP应用时,用户需要提供核心的经营资料,需要ASP商有很高的信用度。楼上说交互性不好,太牵强了吧。在微软提供的一套框架中,利用asp做网站,开发效率高,使用人数少,减少不必要的开销。交互性是互动方式,是有开发人员决定的。 |
|