精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● 群件>>开发>>脚本LotusScript>>Lotus notes/domino技巧(转 )

主题:Lotus notes/domino技巧(转 )
发信人: killfighter()
整理人: kamkam(2002-05-03 21:59:35), 站内信件
从Domino R4.6 5.0,使用Serverlet的方式已经有了一些改变,这儿有关于在R5中 怎样使用它们的更新。在我们详细讨论细节之前,这儿对那些不熟悉Serverlet的 同志介绍一下其背景。 设计Serverlet的目的是为服务器提供”轻量级”服务,比如,一个Serverlet可 以从关系型数据库中分析表并把它们转化成XML.Serverlet通常用于完成一个指定 的任务。因此可以被认为是一个“小服务器“。 让一个Serverlet在Domino中运行是很简单的任务。但有一些地方要注意,我们将 从一个假想的情况开始。使用一个标准的HTML表单,我们可以获取用户输入的数 据并建立一个Notes文档。当然,实际上使用一个Notes表单更简单一点。但让我 们假定Domino仅用于作为一个Web服务器和一个数据库,并没有实际提供对数据库 的实际存取。 要使得Serverlet实际能够运行,首先在服务器上建立一个目录来存放Serverlet 并相应的.jar文件。编辑服务器配置文档以允许serverlet能通过Domino server 管理。然后编辑域以指向serverlet的URL(默认情况是/servelet)并编辑类路径 以指向.class和.jar文件的地方。 建议编辑notes.ini文件以包括以下两行: DominoEnableJavaServlets=1 JavaUserClassess=< classpath of the servelet class和.jar 文件> 现在建立一个Servelet以执行该工作并建立一个文档。Serveltt 必须工作于HTT P post 请求,所以有这种可能性,即从标准的httpservlet 中继承其特性,并建 立一个方法以响应表单的post请求。处理post请求的代码类似如下: ... NotesThread.sinitThread(); connectDB(); writeDetails(request); NotesThread.stermThread(); try { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("

Servlet Submit Response

"); out.println(" 
Data written to Notes Document

"); } catch (IOException e) { System.out.println(e.getMessage()); connectDB() 方法仅仅是建立一个和 Domino server的session. public void connectDB() { try { session = NotesFactory.createSession(); db = session.getDatabase(null,"Servlet.nsf"); } catch (NotesException ne) { System.out.println(ne.getMessage()); } } writeDetails(request) 把数据写到一个 Notes 文档. public void writeDetails(HttpServletRequest request) { try { doc = db.createDocument(); doc.appendItemValue("Form","ServletForm"); Enumeration enum = request.getParameterNames(); while (enum.hasMoreElements()) { String paramName = (String)enum.nextElement(); doc.appendItemValue(paramName, request.getParameter(paramName)); } doc.save(); } catch (NotesException ne) { System.out.println(ne.getMessage()); } } 需要引起重视的地方是NotesThread在开始时被初试化,然后被终止。这是因为没 有NotesThread运行,Serverlet就不能和Domino建立serssion. 看看Serverlet的编写并运行servelet是学习的好方法。 我们提供了源文件.jav a,完整的代码.class,数据库.nsf和html表单用于下载,以指导你一个好的开始。 每当Servcelet被重新编译,domino都需要重新启动以生效。 
1、lotus notes 5.0 数据库应用程序开发的合理顺序是怎样的? 

答: 一、首先做好各个共享域、共享操作。 
二、首先开发所有表单 
三、其次开发所有视图
四、再次开发大纲 
五、然后开发页面 
六、然后开发框架集 
2、如何在IE中显示视图的操作按纽?

答: 一、操作必须有内容,即不能为空操作。
二、操作的公式必须正确,如果是错误的也显示不出来。
三、在视图的高级属性中必须起用小程序。 

3、怎样在notes 或 IE 中显示时使用框架集?
答: 一、首先创建框架集。
二、然后指定框架集中个框架的内容(内容可以是视图、大纲、或表单),并指定目标帧。
三、在数据库的高级属性中指定在浏览此数据库时使用框架集,并指定框架集的名字。

4、何时做大纲比较合理?
答:由于大纲是组织视图的,所以如果在作好大纲后并指定了各视图,以后你又修改了视图 的名字,则大纲不能提取到所要求的某个视图,则大纲便会连所有其他内容也不显示, 正常情况下,在页中嵌入一个已经存在的大纲时,会看到大纲的内容,如果大纲有错误 (比如,所要求的视图名不存在了)则不会看到大纲的全部内容。所以如果你在作好大 纲后有修改了视图名字,则建议把大纲删除掉,重新建立一个同名大纲。

5、为什么 有时 视图中的某些列在设置了分类属性后仍然象没有分类似的?但这些列在IE中 显示分类却是正常的? 
答:你的列属性设置是正常的,只是notes的设计刷新功能不健全,也就是你怎么刷新都不 会把一些无用的信息去掉,这种情况下应该从新启动notes,如果还不行就要从新启动 服务器,这样就肯定可以了。这种问题在notes的其他设计中也会遇到的。 

6、如何在IE和Notes中都显示数据库的帧结构集?
答:这需要设置数据库的启动属性,在notes启动时设置为帧结构集,在IE中启动时也设置 为帧结构集。 

7、如何在IE中实现文档保存后返回视图? 
答: 一、在表单的“保存”操作中实现公式: · @If(@Command([FileSave]);@Command([FileCloseWindow]);@Return("")) 
二、在表单中增加一个隐藏的保留域:$$return,其属性设置为计算文本。其值用公式实现 为"[/" + @Subset(@DbName;-1)+"/"+"v_make_nowdept"+"?OpenView]" 其中 v_make_nowdept是个某个视图名。这样就能返回视图v_make_nowdept了。当然可以用 @subset(@ViewTitle;-1)来取得打开某个文档时视图名字。但是当我们这样做时发现: 在视图的“创建”操作进入表单时@ViewTitle的值却总是不能返回,这个问题还有待于 进一步解决。 

8、我使用了帧结构集,并且是双帧结构,左边是大纲,右边是视图,但我在点左边的大纲项 时,右边相应的大纲项没有刷新,并且在IE中的创建内容在notes中不能完全显示出来,在 notes中创建的内容也不能完全在IE中显示出来,这是为什么? 
答:你肯定在大纲的属性中设置了“使用java小程序”的选项,当使用“使用java小程序” 选项时可以使大纲在IE中显示出和notes中一样的效果。而使用“使用HTML ”选项时, Domino将忽略大纲的“展开”图表,和大纲的背景而仅显示大纲的文本,但使用“使用 java小程序”时,Domino在右边视图的刷新和“与notes保持同步”方面都不能正确处 理,从而出现上述错误。所以建议目前使用大纲时其属性还是设置为“使用HTML "为 好。

9、我怎样使得每次双击某个文挡时都让文挡在右面帧中显示? 
答:你应该在表单的属性中设置启动时在指定的帧中显示。

10、我怎样在阅读文档时隐藏表单的“保存”“发布”操作? 
答:你应该在表单操作的安全属性页中设置当公式为真时隐藏操作,其公式一般为: !@IsDocBeingEdited|status="1" 

11、我怎样在按某个视图打开文档后,用户按“返回”操作能返回相应的视图?
答:当你从某个视图打开文档后,相应的视图的名字就保存在公式@viewtitle中,所以返 回相应的使徒只需要让“返回”按纽“运行相应的打开视图的公式如: @Command([OpenView];@If(@ViewTitle="";"v_make_nowdept";@Subset(@ViewTit le;-1))) 其中v_make_nowdept是某个视图的名字,你需要把他改成你的某个视图名字。 按理说IE和notes都支持公式,但实际上上述公式在IE中使用时没有问题,但在notes 中使用时,有时会不能正确返回。 如果用javascript则只要简单的一句 history.back()即可实现返回,但javascript 不被notes支持。即只能在IE中用。 如果使用公式 if(@Command([FileSave]);@Command([FileCloseWindow]);@Return("")) 则可以在notes中正确实现返回,但这个公式在IE中有时不能正确返回, 综上所述,要既能在IE中实现准确返回和在notes中实现准确返回则必须创建两个“返 回”操作 其中一个使用javascript,并在notes中隐藏。一个使用公式,并在IE中隐藏。

12、为什么我每次修改表单时,表格的相对位置都要从新调?
答:这是因为表格设置为自动后,系统在你每次修改表单是从新给出表格的大小,所以需 要每修改一次表单都要从新调一下表格的相对位置。

13、我不想在IE中显示视图的名称,我该怎么办?
答:你在建立视图时,要同时赋予该视图名称和别名,在所有工作作好以后,你如果不想 在IE中显示该名称,则你应该用空格来取代原来视图的名称,Domino回自动寻找别名 来匹配的。 如果你不去掉名称的话,在IE中浏览时Domino会自动把名称显示在视图的上方的。

14、我如何控制设计元素在IE中显示时,附加一些其他风格?
答:如果Domino允许该种元素在IE中浏览时附加其他风格,则在设计时在该种元素的属性 里面会给你一个HTML属性页,你可以在该属性页里面添加其他HTML属性。

15、为什么我一点击某一大纲项,我的大纲就全没有了,取而代之的是一些没有层次的视图名 称?
答:这种情况肯定是你的大纲所在帧的目标帧没有设置,你应该把他设置为你想要连接的 那个帧,比如:一般情况下右边的 content 帧。   

16、为什么我的RTF域在IE中浏览时看不到其中的内容? 
答:有可能你把这个域放在表格中了吧!,如果放在表格中在IE中浏览时是看不到其中的 内容的解决办法是把它放在表格外边即可。 也有可能你在该RTF域中设置了“使用java applet "的属性,但没有设置HTML属性, 因为默认的HTML属性是RTF域的长、宽都为0,这样在浏览时是看不到的,所以你应该 把它的HTML属性设置一下,比如:"HEIGHT=\"120\" WIDTH=\"600\""。

17、我怎样设计表单来跟踪文档的作者?
答:你可以在表单上加一个隐藏的共享域,其名字可以为 from 运行公式为: @If(@IsNewDoc ; @UserName; From),这样这个域就记录了这片文档的作者了。 

18、我怎样设计表单来跟踪文档是否已经发布?
答:你可以在表单上加一个隐藏的域,其名字可以为 status 类型为单选按纽,初试值设 置为”0“。在你的表单的发布操作中加上一句 status="1"即可来表示此文挡已经发 布。 

19、我怎样控制文挡的操作权限?
答:对已经存在的文挡来说,权限分为编辑和阅读两种,你可以给表单增加一个”修改 “操作用以修改文档,(其运行公式为: @Command([EditDocument]))并设置该操作 的隐藏属性为当公式为真时隐藏,这样你就可以设置当文档已经发布、目前的用户不是 本文档的作者、用户不具备发布角色等任何一个条件满足时隐藏该操作,从而实现对文 档修改权限的控制。典型的公式如:@IsDocBeingEdited|!@IsMember("[发布公 告]";@UserRoles)|status="1"|from!=@UserName  

20、我如何在IE里面实现notes中的 对话框列表? (即可以添加新的项目的列表框) 
答:在notes中这种列表框是系统自身就有的,实现起来比较容易,但这个功能不被IE所支 持,要在IE中实现该功能只能是采用另一种方式来仿效这种效果。 在IE中实现时,首先要把对话框列表的属性设置为不可添加新内容。(否则在IE中不 能显示为列表框,而是编辑框),其次再增加一个文本编辑域。这个域用来输入新的 项目,那么怎么才能让新的项目加入到列表框中去呢?这里用到一个小技巧,这个技 巧首先被NOtes开发人员所使用:列表框中的项目要动态的从一个视图中提取它的一个 已经分类的列,这个列实际上就是你的新输入项目所间接存取的域。 具体操作方法是: 一、对应于要在IE中实现的某个对话框列表域name,你再建一个对话框列表域web_name, 但要把它的属性设置为不可添加新内容。 
二、再建一个文本编辑域web_new_name。在name的属性设置中你要设置为“为选项使用公 式”并把公式写为:@If(!@IsNewDoc & @IsDocBeingLoaded;@Unavailable; @DbColumn("":"nocache"; ""; "视图名字";1)) 
三、在name的 input translation事件中 输入公式 @If(@ClientType = "Notes"; @Trim(name); if(@Trim(web_new_name)="";@Trim(Web_name);@Trim(web_new_name))) 
四、在web_name的属性设置中你要设置为“为选项使用公式”并把公式写为 @DbColumn("":"nocache"; ""; "v_bulletin_classsel";1) 五、在notes中隐藏web_name和web_new_name域。 


[关闭][返回]