Domino中Servlet的应用

摘自: 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” 选项组,如下图:
---- 这些选项的描述如下:
  • Java servlet 支持-------------启用/禁用。可选项是:禁用、Domino Servlet 管理者和第三Servlet支持。
  • Servlet URL 路径-------------访问ServletURL,例如/servlet
  • 类路径 ---------------------Servlet所在的目录,相对于Domino 数据目录。例如domino/servlet,实际是Domino 数据目录下的domino/servlet
  • Servlet 文件扩展------------URL文件扩展名,用来告诉Domino它是一个Servlet,以逗号分隔。
  • 会话状态跟踪----------------启用/禁用指示Servlet管理者是否将中止空闲的会话。
  • 空闲超时时间----------------一个空闲会话在被中止前的时间(分钟)。此参数只有在启用最大活动会话时才有效。
  • 最大活动会话----------------最大活动Servlet会话数。
  • 会话持续----------------------启用/禁用。指示会话信息是否存入磁盘。
---- 一旦 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 properties 文件
---- Servlet 可由两种方法装载:第一种是 Servlet Manager HTTP 启动时按 servlets.properties 文件指定的参数装载 Servlet ,第二种是客户第一次调用 Servlet 时装载 Servlet Servlet HTTP 任务停止运行时从内存被清除。
---- 您应当尽可能使用第一种。在 HTTP 任务启动时就装载 Servlet ,以后用户请求不用再装载,相应时间和延迟就小。
---- servlets.properties 是一个 TXT 格式的配置文件,用来指定装载 Servlet 时的标准参数,位于 Domino 数据目录,例如: D:/r5server/data/servlets.properties 。您可以使用 TXT 编辑器创建它。
---- servlet properties 文件包括 Servlet 别名,初始化参数, URL 扩展映射, WEB 服务器启动时需装载的 Servlet
---- 本篇文章设想读者熟悉 JavaScript Java, Servlet, 了解 Domino 应用程序设计。

语法如下:
---- Servlet 别名 ------servlet.<alias-name>.code=<class-name>
---- 初始化参数 ------servlet.<alias or class name>.initArgs=<name1=value1>,<name2=value2>
---- Servlet 代码中可以使用 ServletConfig.getInitParameter 方法访问这些数据。
---- URL 扩展映射 ---servlet.<alias or class name>.extension=<extension> <extension> ...
---- 启动时装载 ------servlets.startup=<alias or class> <alias or class> ...

---- 以下是一个 servlets.properties 文件,这里指定 Test HelloWorld.class Servlet 的别名,指定了初始化参数,启动时装载。
---- # Example servlets.properties file
---- servlet.Test.code = HelloWorld
---- servlet.Test.initArgs = 1, 2, 3
---- servlets.startup = Test
---- 有关 Servlet 配置文件经常出现的错误有:
1.        文件目录放置错误,它必须是在您的 Domino 数据目录下。
2.        文件扩展名错误,许多编辑器例如 Notepad 使用 TXT 扩展名
3.        使用错误文件名,文件名必须是 servlets.properties
4.        大小写错误,文件名如同 Servlet 名字是大小写敏感的。
 
Domino Servlet 开发示例
---- Servlet 只装载入内存一次。装载时运行 init 方法,以后每一次客户请求 Servlet 时执行 service 方法,按照用户的请求执行 doPost doGet 方法。

Servlet 结构
---- 编写 Servlet ,使用以下 Servlet :
---- Javax.servlet.http.HttpServlet
---- Javax.servlet.GenericServlet
---- 定义方法描述 Servlet 功能, 经常用到的方法如下:
---- doGet() and doPost() 处理 GET POST 请求 .
---- getServiceInfo() 提供 servlet 描述
---- init() servlet 初始化代码
---- service() 处理请求
---- HTTP 请求可有两种: get post get 方法在 URL 结尾附加信息,可从环境变量 query_string 中得到; post 变量名 / 变量值 形式发送信息。
---- Servlet 代码开发时, get post 方法使用到 JSDK 中两个包: javax.servlet javax.servlet.http 。代码中需引入它们。
---- 在您编译 servlet 代码之前 , 使用到的 servlet 类需要增加到 CLASSPATH 环境变量中。然后您可以用您喜欢的 JAVA 编译器编译 servlet 代码。

使用 Servlet 访问 Domino 对象示例 1
---- 下面一个例子是 Servlet Domino 的集成, Servlet 访问 Domino 通信录中的对象。
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import lotus.domino.*;
public class Example_2 extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException{
res.setContentType("text/html");
PrintWriter toBrowser = res.getWriter();
toBrowser.println("<HTML");
toBrowser.println("<HEAD>");
toBrowser.println("<TITLE>Example 2</TITLE>");
toBrowser.println("</HEAD>");
toBrowser.println("<BODY>");
toBrowser.println("<H1>Example 2</H1>");
---- 调用 Domino 对象的代码必须包含在 try/catch 块中(见以下一段代码),首先创建一个 NotesThread 对象,然后创建一个新的会话对象。此处创建会话对象的方法中没有参数,即是用服务器的 ID 访问 Domino 对象,您也可指定使用某一用户的 Internet 用户名和口令作为参数,用此用户身份访问 Domino 对象,从通信录 (names.nsf) 数据库的 People 视图取得第一个文档。
try {
NotesThread.sinitThread(); /*
创建 NotesThread 对象
Session s = NotesFactory.createSession(); /*
创建新会话对象
Database db = s.getDatabase("","names.nsf"); /*
访问通信录数据库
View vw = db.getView("People"); /*
访问视图 People
Document doc = vw.getFirstDocument(); /*
获得第一个文档
ToBrowser.println(db.getTitle()); /* 获得数据库标题
toBrowser.println("<TABLE>");
while (doc != null)
{
toBrowser.println("<TR><TD>");
toBrowser.println(doc.getItemValueString("LastName"));
toBrowser.println("</TD></TR>");
doc = vw.getNextDocument(doc); /*
获得下一个文档
}
toBrowser.println("</TABLE>");
vw.recycle();
db.recycle();
s.recycle();
}
catch (NotesException n) {
---- toBrowser 行代码发送数据库标题给请求的客户端浏览器。 while (doc!=null) 行开始循环搜索视图中所有文档,将文档中的 “Last Name ” 值显示在浏览器上,完毕后释放 Domino 对象使用得内存。
---- 最后,显示任何 Notes 错误并在 finally 块中中止 NotesThread 对象。
System.out.println("Exception ID: " + n.id);
System.out.println("Exception description: " + n.text);
}
finally
{
NotesThread.stermThread(); }
toBrowser.println("</BODY></HTML>");
}
}


下图显示了运行结果。
 
使用 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 的特性是线程安全代码,支持网络访问,内存自动管理。
 
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值