摘自:
http://www.oaunion.com/oaunion/oaunion.nsf/doc/FD0597833377B67348256ECF0013798F?opendocument
一、电子商务与内容管理(
Content Management
)
|
----
Domino R5
对
Java Servlet
的支持使您在开发
Notes
应用时有了更多的选择。例如,您可以使用
Servlet
代替
Domino
代理
(Agent)
访问
Domino
对象,完成服务器端的处理。
|
----
本篇文章提供了有关
Domino Servlet
的开发和运行配置,包括:
|
----
Servlet
的特点,与
Agent
的区别,
Domino
对
Servlet
的支持
|
Domino
服务器运行
servlet
的配置
|
----
Servlet
的开发,通过两个
servlet
例子,介绍如何使用
Servlet
访问
Domino
对象。
|
----
本篇文章设想读者熟悉
JavaScript
,
Java, Servlet,
了解
Domino
应用程序设计。
|
Servlet
特点以及与
Agent
的区别
|
----
Servlet
是运行在服务器上的
Java
程序,提供类似于
CGI
应用和
Domino Agent
的功能。
Servlet
的主要优点是只装载入内存一次,而
Agent
和
CGI
程序是每次调用时都需装载入内存。
Sservlet
一次装载入内存后,以后所有调用都使用该实例。例如,针对连接数据库的任务,您可以选择
Servlet
来保持一个永久连接传输数据,提高运行效率。
|
----
尽管
Agent
和
Servlet
提供类似功能,但它们的实现差别很大。
Agent
存在于
Domino
数据库而
Servlet
在文件系统下。这立即带来了两个问题:分布和安全。
Agent
可以充分利用它所在的数据库,因此,可通过复制分布到其它服务器。同样,
Domino
安全模式控制
Agent
的访问。相反,
Servlet
存在于文件系统,因此由服务器、文件和目录安全来控制
Servlet
的访问。
Servlet
缺省是以服务器安全权限来运行,但也可以某一特定
Internet
用户名字和口令来运行。最后,除非使用
WinNT
目录复制,否则您必须拷贝或安装
Servlet
到其它需要的服务器。
|
关于Servlet开发环境JSDK
|
----
标准
Domino Designer
的开发环境并不支持
Servlet
开发,因此您必须使用第三方
IDE
或
SUN
命令行
JDK
开发
Servlet
代码。
|
----
开发
Servlet
所需的
JSDK
可从
SUN
免费得到,另外
JSDK
是
Domino
安装的标准部分,
jsdk.jar
位于
D
安装根目录。例如,您的
Domino
服务器安装在
D
盘的
r5server
目录下,则
JSDK
在
D:/r5server/jsdk.jar
。
|
----
注意:
Jar
文件是标准
JAVA
文件的压缩。类似于
Winzip,PKZip
或
Windows CAB
文件。
|
----
Domino 4.6.x
支持
JSDK 1.x. Domino 5.0
从
5.0.2b
以后版本支持
JSDK 2.0
。最新版本支持情况请参考随软件的产品发布信息。
|
设置
Domino
服务器运行
Servlet
|
----
Domino R5
有自己的
Servlet
管理者,但也可使用第三方
Servlet
引擎,推荐使用
IBM WebSphere
。
Domino
通信录的服务器文档含有
Servlet
设置部分。具体设置是:
|
----
打开
Domino
通信录
names.nsf
数据库
——
打开
“
服务器文档
”——
进入
“Internet
协议
”
项
——
进入
“Domino Web
引擎
”
项
——
编辑
“Java Servlets”
选项组,如下图:
|
|
----
这些选项的描述如下:
|
|
----
一旦
Domino
服务器配置成
“
启用
”Servlet
,以下与
Servlet
有关的行将出现在
Domino
数据目录下的
Domino
配置文件
(domino.cnf)
中:
|
# Java Servlet Settings ServerInit servlet:ServletInit d:/r5server/Data Service /servlet/* servlet:ServletService* ServerTerm servlet:ServletTerm |
----
Domino
支持
JVM
和
Servlet Manager
(包括
Domino
自己的和第三方的)。当
Servlet“
启用
”
时,
JVM
在
Domino HTTP
服务器启动之前装载;如果使用
Domino Servlet Manager
,在
JVM
装载之后,
Domino HTTP
服务器启动时装载
Servlet
;如果使用第三方
Servlet Manager
,则只装载
JVM
。
|
----
用户从浏览器访问
servlet
时,
URL
为:
http://myserver/servlet/ servletname
。例如,输入
http://myserver/servlet/HelloWorld
运行
HelloWorld servlet
。
|
----
WEB
服务器启动时装载
Servlet
,此刻后
Servlet
将在内存中,开始工作。但是,
Servlet
代码改变后,
Domino HTTP
服务器必须退出并重新启动,新代码才会起作用。
|
| ||||||||||||||||||||||||||||||
|
使用
Servlet
访问
Domino
对象示例
2
|
----
前面是
Servlet
与
Domino
对象的结合,下面一个实例是
Servlet
与
Domino
表单的结合。我们先分析代码,然后跟踪表单的建立过程。
|
----
下面代码是一个
Servlet
处理经表单确认后传送到服务器的变量
/
变量值。变量数值从表单中取得,用来向
Domino
数据库中添加文档。代码从标准行开始,然后从表单中取出
FName, LName, Email
和
Phone
字段值。
|
import javax.servlet.*; import javax.servlet.http.*; import lotus.domino.*; import java.io.PrintWriter; import java.io.IOException; public class Example_3 extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/html"); PrintWriter pw = res.getWriter(); pw.println("<html>"); pw.println("<head>"); pw.println("<title>Example 3</title>"); pw.println("</head>"); pw.println("<body>"); pw.println("<h1>Thank you!</h1>"); String fname = req.getParameter("FName"); /* 获得表单中的字段值 String lname = req.getParameter("LName"); String email = req.getParameter("Email"); String phone = req.getParameter("Phone"); |
----
下一步,正如前一个
Servlet
例子,创建一个
Domino
对象的会话,访问
Domino
通信录。这里我们只处理数据库能找到的情况。
|
try { NotesThread.sinitThread(); Session s = NotesFactory.createSession(); Database db = s.getDatabase("","names.nsf"); if (db != null) { |
----
然后创建一个新文档,设置新文档的表单值,用我们取得的变量数值作为新文档中字段的值。
|
Document doc = db.createDocument(); /*
创建一个新文档
doc.replaceItemValue("Form", "Person"); /* 使用表单 Person doc.replaceItemValue("FirstName", fname); doc.replaceItemValue("LastName", lname); doc.replaceItemValue("OfficePhoneNumber", phone); doc.replaceItemValue("MailAddress", email); |
----
然后我们保存文档,释放文档,数据库和会话对象占用的系统资源。
(
会话对象释放之前,如果数据库找不到,将出现错误信息。
)
|
doc.save(true); doc.recycle(); db.recycle(); } else { pw.println("An error was encountered."); } s.recycle(); } |
----
最后,我们处理与
Domino
有关的
exception
,中止线程,显示信息到浏览器。
|
catch (NotesException n) { pw.println("Notes Error: " + n.id); pw.println("Description: " + n.text); } catch (Exception e) { e.printStackTrace(); } finally { NotesThread.stermThread(); } pw.println(fname + " " + lname + " has been registered."); pw.println("</body></html>"); } } |
----
现在注意
Domino
表单建立过程。
|
|
----
上图是
Domino Designer
表单设计窗口,在标单设计中增加一个新的
HTML
标签指定执行该
Servlet
,增加一个
Submit
键,点击表单中的
Submit
键,执行
Javascript
代码确认表单,执行该
Servlet
。
|
----
以下是
HTML
代码,位于表单的顶部,将该表单重定向到
Servlet
:
|
[</form> <form name="NotesNetExample" action="http://your_server_name/servlet/Example_2">] |
----
这里指定
NotesNetExample
作为表单名,当用
JavaScript
访问表单的元素或表单确认时将用到此名字。
action
中指示表单确认时执行什么。
|
----
下图在
IE
中显示了该表单的调用,输入用户的
FirstName
,
LastName
,
OfficePhoneNumber
,
MailAddress
后,点击表单中的
Submit
键,表单确认时数据将发送到服务器,执行
Servlet
,登记此用户。
|
|
结论
|
----
Servlet
和
Agent
各有其特点,选择
Servlet
还是
Agent
有时取决于开发人员。如果开发人员有很多
WEB
开发经验或您希望使用
WebSphere
的强大
servlet manager
,您可选择
Servlet
;反之有经验的
Domino
开发人员可能选择
Agent
。
|
----
Java servlets
使您的
Domino
应用更强大。
servlets
增加服务器端功能
,
例如保持应用间交换数据的连接。另外,
servlets
的特性是线程安全代码,支持网络访问,内存自动管理。
|