Lotus Domino应用开发课程--第十章 在Web中使用LotusScript.doc_第1页
Lotus Domino应用开发课程--第十章 在Web中使用LotusScript.doc_第2页
Lotus Domino应用开发课程--第十章 在Web中使用LotusScript.doc_第3页
Lotus Domino应用开发课程--第十章 在Web中使用LotusScript.doc_第4页
Lotus Domino应用开发课程--第十章 在Web中使用LotusScript.doc_第5页
免费预览已结束,剩余10页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第10章 在Web中使用LotusScript第10章在Web中使用LotusScript110.1使用LotusScript的Web代理110.2激活一个代理的URL210.3编写WebQueryOpen代理310.4编写WebQuerySave代理610.5在代理中使用CGI变量710.5.1删除文档810.6在Web工作流中使用LotusScript11本章主要说明在Domino的Web开发中使用LotusScript的方法,关于LotusScript的程序设计知识请参考第三章和IBM 公司提供的帮助文档。10.1 使用LotusScript的Web代理LotusScript在Web上的唯一使用方法就是编写代理,完成比较复杂的程序逻辑,或者是只有通过操作Domino后端对象才能完成的功能。在Web上运行一个LotusScript代理有两种方法:l 使用URLOpen调用它的URL,例如,http:/server/db/agentname?OpenAgentl 使用公式ToolsRunMacro和RunAgent调用代理。当使用ToolsRunMacro调用代理时,有两种特殊的应用场合,即在文档的WebQueryOpen和WebQuerySave事件中调用代理。当你在Web上运行一个LotusScript代理时,代理可以访问由浏览器和Domino提供的信息,即CGI变量,如果使用第二种方式运行代理,还可以访问当前文档中的域的值,这些信息都包含在NotesSession中的DocumentContext属性中。DocumentContext属性是一个特别的N o t e s D o c u m e n t对象,它包含了关于当前环境的信息。这个文档内容类似于N o t e s U I D o c u m e n t对象,你可以使用它在表单保存前从表单中得到值。另外,DocumentContext属性包含在C G I变量表单中的关于环境的信息。现在来看下面的脚本:Sub InitializeDim session As New NotesSessionDim doc As NotesDocumentSet doc =session.DocumentContext CGI 变量Print User ID from browser= & doc.REMOTE_USER(0) & Print Browser software= & doc.HTTP_USER_AGENT(0) & Print Server software= & doc.SERVER_SOFTWARE(0) & 文档中的域Print 标题= & doc.InfoSubject(0) & Print 创建时间= & doc.InfoCreated(0)End Sub这个代理打印从环境变量中收集的信息,包含C G I变量和当前表单的域值。当你使用P O S T方法提交表单的时候,这些信息有效。输出结果可能类似于如下:User ID from browser= Browser software= Server software= 标题=IBM 网上的Lotus资源创建时间=2005-9-22 8:24:03注意代理输出时包含H T M L换行符。这是由于我们将直接输出到We b浏览器中。在一个Domino代理中, Print语句直接输出到用户的浏览器中,因此你完全可以使用H T M L标签对你的输出进行格式化。你还可以使用LotusScript的Print语句把浏览器重新指向不同的We b页,比如说你可以输出一个包含在方括号中的URL,例如:Print Print语句使用户能够非常简单地获得正在运行的信息,例如你可以使用Print语句:l 当用户输入无效值时显示错误信息。l 提示用户表单提交成功。l 显示相关数据库查询结果。l 根据用户的输出显示不同的响应。l 显示到其他文档或其他URL的链接。10.2 激活一个代理的URL你可以通过简单地将浏览器指向一个代理URL运行一个代理。例如下面的URL运行test代理http:/Server/Database/test?OpenAgent图表 1 使用OpenAgent激活代理当你使用这种方法运行代理的时候,代理可以访问C G I环境变量,但是不能访问当前文档域值,因为现在实际上并没有当前文档。这类似于在N o t e s中打开代理面板,选择代理,然后选择操作-运行,只是在此你将得到C G I变量。例如,假设你在表单中创建一个热点或者操作执行如下公式:Command(ToolsRunMacro;test);在数据库的属性中设置如下:图表 2 在Web中使用JavaScript代理可以访问当前文档中的域值,但是不能访问CGI变量。执行结果如下图:图表 3 代理访问当前文档中的域如果希望使用ToolsRunMacro运行代理时,能够访问CGI变量,请在表单中创建同CGI变量同名的域。10.3 编写WebQueryOpen代理WebQueryOpen代理就是在WebQueryOpen事件中调用的代理,运行于以下时候:l 用户请求一个文档之后。l 在计算域被刷新以后。l 文档被转换为H T M L以前。因为WebQueryOpen只在文档在浏览器显示之前执行,它不能在浏懒器上进行任何输出,因此将忽略所有Print语句。创建好代理后,在WebQueryOpen事中,用下述方法调用:Command(ToolsRunMacro; )WebQueryOpen代理存在的的主要目的是在文档被转换成Html之前执行一段程序逻辑,最常见的有在文档转换成html之前修改文档中域的值,或者执行数据库查询等。下面编写一个WebQueryOpen代理“HitTracker”跟踪文档的打开情况,统计阅读者和次数。1)在InfoContentForm中创建两个域存放数据:TotalHits,总点击次数;HitLog,记录阅读用户和时间。2)创建HitTracker代理。Sub InitializeOn Error Goto ErrhandleDim session As New NotesSessionDim doc,note As NotesDocumentDim item As NotesItemDim db As notesdatabaseDim i As IntegerDim hits As StringDim result As VariantDim foldername,dbpath ,msg,user As StringSet db = session.currentdatabasedbpath = db.filepathSet doc = Session.DocumentContextIf Not (doc.isnewnote Or doc.editmode(0)=1)Then 在非新文档和非编辑模式时统计阅读次数设置点击次数Set item=doc.getfirstitem(TotalHits)If(item Is Nothing) ThenCalldoc.appenditemvalue(TotalHits,0) 如果条目不存在,则创建End IfIf(doc.TotalHits(0)=)Thendoc.TotalHits=0End Ifi=Cint(doc.totalhits(0)i=i+1doc.totalhits=Cstr(i)设置点击历史Set item=doc.getfirstitem(HitLog)If(item Is Nothing) ThenCalldoc.appenditemvalue(HitLog,) 如果条目不存在,则创建End IfSet item=doc.getfirstitem(HitLog)result=Evaluate(Name(Abbreviate;UserName) 获取当前用户的姓名user=result(0)item.AppendToTextList(user+ 阅读文档于 +Now+)Call doc.save(True,False)End IfExit SubErrhandle:msg= 行号:+ Cstr( Erl()+ 错误号:+Cstr(Err()+ 错误内容:+Error()Msgbox msgExit SubEnd Sub3)设置HitTracker代理的属性。图表 4 设置代理的属性这一步很重要,只要代理作为“web”用户执行时,我们才可以使用下面的语句准确的获得当前用户的姓名:result=Evaluate(Name(Abbreviate;UserName) user=result(0)有的书籍可能提供了其它方法,但是在实际运行中都有一些问题。设置运行时安全等级为“允许具有完全管理权限的受限制操作”,这样允许“匿名”用户也可以执行代理,修改TotalHits和HitLog两个域的值。提示:WebQueryOpen代理不能用Print打印数据到浏览器,在错误处理代码中可以用msgbox输出到Domino控制台。或者输出到当前文档。图表 5 HitTrack代理的执行效果10.4 编写WebQuerySave代理WebQuerySave代理在以下情况下运行:l 当用户提交一个表单之后。l 当计算域和有效的公式被刷新之后。l 在文档保存在硬盘之前。WebQuerySave代理对于复杂的不能通过公式完成的有效性逻辑验证非常有用。当保存的时候工作流把文档自动指向不同的用户时,WebQuerySave代理也非常方便。使用WebQuerySave代理的常用方法是捕捉用户在表单中的兴趣或爱好的信息,然后当提交表单的时候据此进行反应。与WebQueryOpen 代理相同, WebQuerySave 代理也通过NotesSession 对象的DocumentContext属性访问当前文档。与WebQueryOpen代理不同的是,WebQuerySave代理可以输出到浏览器或把浏览器重新指向URL。我们要举的例子是用WebQuerySave完成一个比较复杂的校验。在“IBM认证系统”数据库中,为了防止一个学生多次注册,需要根据学号检查,数据库中是否已经有了该学生的信息。编写一个WebQuerySave代理“PreventRepeatedStudent”,保存文档时发现数据库中已经有该生的信息则把SaveOptions赋值为0。阻止保存文档。Sub InitializeOn Error Goto ErrhandleDim session As New NotesSessionDim doc,note As NotesDocumentDim db As notesdatabaseDim i As IntegerDim view As NotesViewDim foldername,dbpath As StringSet db = session.currentdatabasedbpath = db.filepathSet doc = Session.DocumentContextSet view=db.GetView(StudentList)Msgbox 开始检查是否重复创建If doc.stuno(0)= Thendoc.saveoptions=0Print /+dbpath+/messageboxform?openform&message=请学号不能为空!Exit SubEnd IfSet note=view.GetDocumentByKey(doc.stuno(0) 在数据库中寻找是否已经存在该文档If Not(note Is Nothing) And (doc.isnewnote) ThenMsgbox 有重复doc.SaveOptions=0Msgbox doc.saveoptions(0) 重复创建,设置为0,不保存Print /+dbpath+/messageboxform?openform&message=不能重复创建!Exit SubElsedoc.SaveOptions=1其它情况设置为1,或者为空,需要保存文档End IfExit SubErrhandle:Print 行号: Erl() 错误号:Err() 错误内容:Error()Exit SubEnd Sub通过在WebQuerySave代理中修改SaveOptions,控制文档的保存。10.5 在代理中使用CGI变量当你编写基于We b的LotusScript代理的时候, C G I变量非常有用。例如, HTTP_USER_AGENT返回用户浏览器的软件类型。可以使用这个信息使浏览器根据其软件的不同指向不同的URL(对于Netscape Navigator来说指向JavaScript ,对于Internet Explorer指向VBScript)。还可以使用HTTP_COOKIE变量从浏览器中得到cookie的信息, QUERY_STRING提供了把自变量传递到代理中的方法。我们使用Query_String作一个“删除文档”操作的例子10.5.1 删除文档Domino提供了可以在Web上删除文档的操作,我们在第6章中提到过,有两种方式:l 使用EditClear命令l 使用URL命令,http:/host/database/view/universalID?DeleteDocument当我们使用EditClear删除文档时,Domino返回文档已删除页面:图表 6 使用D eleteDocument URL命令这个界面很不友好,为此Domino允许创建一个表单“$ReturnDocumentDeleted”允许定制文档已删除信息。在其中创建域MessageString可以保存错误信息,还可以创建其他表单元素。同类型的表单有下面几种:图表 7 缺省消息表单表单名称条件$ReturnAuthenticationFailure不能校验用户名称和口令。$ReturnAuthorizationFailure用户对该数据库没有足够的存取级别。$ReturnDocumentDeleted成功删除文档。$ReturnGeneralError出现了其他错误条件。但是这些有时不能满足我们的要求:想根据特定文档的特定情况返回到特定的页面。可以通过创建代理来删除文档,利用在代理中使用print语句向浏览器输出结果,达到我们的目的。1)创建一个删除文档的代理“DeleteOneDoc”Sub Initialize该代理接受两个参数UNID,文档的ID;RETURNREF,返回到什么地方On Error Goto ErrhandleDim session As New NotesSessionDim doc,note As NotesDocumentDim db As notesdatabaseDim foldername,dbpath,arg1,arg2 As StringDim arg As String Dim result as VariantDim qslist List As StringSet db = session.currentdatabaseSet doc = Session.DocumentContextMsgbox 准备删文档获得该题目的ID解析querystringarg=doc.query_string(0)Call querystringaslist(Ucase(arg),qslist) 调用一个自定义函数把QueryString解析成列表arg1=qslist(UNID)arg2=qslist(RETURNREF)获得文档Set doc=Db.GetDocumentbyunID(arg1) 删除本身doc.remove(True) result=evaluate(“WebDbName”)dbpath=result(0)Msgbox 删除成功,转向SuccessForm表单Print +dbpath+/+SuccessForm?openform&message=成功删除文档,返回&returnref=+arg2+Exit SubErrhandle:Print 行号: Erl() 错误号:Err() 错误内容:Error()Exit SubEnd Sub2)创建自定义函数querystringaslist该代理调用了一个自定义函数querystringaslist()用于把Query_String解析成列表,便于操作。该函数定义在脚本库CommonFunction中,Sub QueryStringAsList(qs As String,qslist List As String)把QueryString解析成一个列表List, ListTag是参数的名称,Value是参数的值On Error Goto ErrhandleDim arg,arg0,arg1 As StringDim p1,i As IntegerDim templist List As Stringarg=qsi=0p1=Instr(arg,&)Do While(p10)i=i+1templist(Cstr(i)=Left$(arg,p1-1)arg=Mid$(arg, p1 + 1)p1=Instr(arg,&)LoopIf (arg) Theni=i+1templist(Cstr(i)=argEnd IfForall e In templistp1=Instr(e,=)If(p1=0) Thenqslist(e)=Elseqslist(Left$(e,p1-1)=Mid$(e,p1+1)End IfEnd ForallMsgbox end of subExit SubErrhandle:Print 行号: Erl() 错误号:Err() 错误内容:Error()Exit SubEnd Sub为了在代理中能够正常使用这个函数,需要在代理的(Options)中使用下面的语句:Use CommonFunction3)创建SuccessForm表单代理中,还使用了一个表单SuccessForm,接受提示信息message和重定向链接returnref。图表 8 成功执行信息表单表单中有两个域分别用公式UrlQueryString(message)和UrlQueryString(returnref)接受这两个参数。标单中还有一个按钮,可以转向到returnref。URLOpen(WebDbName+/+returnref)4)创建删除操作,调用代理在表单中创建一个删除操作如下:URLOpen( WebDbName+/+(DeleteOneDoc)?openagent&UNID=+Text(DocumentUniqueID)+&returnref=+InfoListViewForm)5)执行代理执行代理返回结果图表 9 代理的执行结果单击“转向”就可以到另外的表单和视图。当然也可以做自动转向。10.6 在Web工作流中使用LotusScript关于工作流的规划和程序设计在第5章作了讲解,这里简单讲解一下LotusScript在Web中的应用。并作一个简单的回顾。工作流是什么呢?许多N o t e s开发者乐于暗示其为科学的、复杂的名词。但是对于大多数N o t e s工作流应用程序来说事实上是相当简单的。工作流的应用程序的工作就是帮助把一个应用任务向前推进,例如书写和编辑一个文档,或者批准一个请求,通过对组织中的一系列人员指定路线完成这项工作。许多N o t e s客户应用程序要求所有的参与者都在服务器上拥有一个N o t e s邮件帐号。有些工作流应用程序使用存储的表单,这意味着诸如文档,表单等都被送到用户的N o t e s邮件数据库中。另外一种工作流应用程序使用N o t e s的文档连接属性在N o t e s便笺中发送一个到文档的链接。用户可以使用We b浏览器打开N o t e s邮件数据库并点击文档链接,该链接将转换为H T M L链接。现在要求用户使用一个单独的邮件包显得有点麻烦,尤其现在Domino服务器可以轻松地使用S M T P收发I n t e r n e t邮件。对于基于We b的工作流应用程序,向一个用户发送一个指向文档的链接的最好的方法是简单地把指向文档的URL附加在邮件中。大部分邮件软件把URL显示为一个链接,当点击这个链接的时候自动下载目标页面到用户的We b浏览器中。当使用这种方法的时候保持URL较短以免隐藏问题。工作流的推动机制,一般都是通过代理完成的,尤其是WebQuerySave代理。一般完成下面几件事情:l 修改文档状态;l 根据状态限制对文档的访问;l 向下一工作人员发送提示通知;l 使用时间标签,记录文档的状态和修改人。以“文档集”数据库为例,在处理工作流时,Notes用户保存文档触发QuerySave事件,Web用户保存文档时触发WebQ

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论