loading ...

Q网志

my web and me.
显示标签为“Servlet”的博文。显示所有博文
WebSphere应用服务器中包括它自己的软件包,该软件包用于扩展和添加 Java Servlet API。这些扩展和添加简化了维护用户信息、个性化 Web 页面和分析 Web 站点使用情况。WebSphere应用服务器API 的 Javadoc 安装在产品的 doc/apidocs 目录下。WebSphere应用服务器 API 软件包为:

1.com.ibm.servlet.personalization.sessiontracking
对 JDSK 的这种 WebSphere应用服务器 扩展记录了分派页面,该页面引导访问者进入 Web 站点, 该设备同时在站点内跟踪访问者的位置,并关联了会话和用户标识符。IBM 还将会话群集支持添加到 API 中。

2.com.ibm.servlet.personalization.userprofile
提供维护有关 Web 访问者的详细信息的方法,并在 Web 应用程序合并这些信息, 以便能够提供一个个性化的用户经历。

3.com.ibm.servlet.connmgr
使 Servlet 能与连接管理器进行通信,该连接管理器对打开的数据库服务器和 JDBC 从属数据服务器产品的连接的缓冲池进行维护。 当 Servlet 从缓冲池接收到连接时,它可以用它的 API 直接与数据服务器进行通信。

4.com.ibm.db
将类包括在内,以简化对关系数据库的访问并同时提供增强访问功能,如结果高速缓存、 通过执行高速缓存进行更新和查询参数支持。

5.com.ibm.servlet.personalization.sam
使您能用站点活动监控程序(Site Activity Monitor)注册自己的 Web 应用程序,它是一个提供给您动态、实时查看您 Web 站点活动的applet。

6.com.ibm.servlet.servlets.personalization.util
包括特殊的 Servlet,它允许 Web 站点管理员动态地登记公告牌,并允许 Web 站点访问者之间交换信息。

7.1 数据库应用编程

1.Servlet 如何使用连接管理器

所有使用连接管理器的 Servlet 都将执行下列步骤:

(1) 创建连接规范:Servlet 为连接到基本数据服务器准备了一个用以标识必需信息的规范对象。其中某些信息是仅针对于特定数据服务器的,而一般信息则适用于所有下层数据服务器。Servlet 仅准备一次规范并将它应用于所有请求,或者为每个用户请求准备一份新的规范。如果要为每个用户请求准备新的规范,则必须在第 3 步(使用规范)之前,执行该操作。

(2) 获得连接管理器:Servlet 为与连接管理器交流而获取有关连接管理器的引用。这一操作只需在 Servlet 的生命期中执行一次。

(3) 获得与连接管理器的连接:Servlet 请求连接管理器以连接到特定数据服务器,该数据服务器使用第 1 步中准备的连接规范。返回的连接对象来自于连接管理缓冲池,并且是在连接管理器 API 中定义类别的实例,它不是一个来自于数据服务器下属 API 集合中的类的对象。先调用它来暂时连接一个连接管理器或一个 CM 连接。通常 Servlet 为每个用户请求获得一个 CM 连接。

(4) 使用 CM 连接以访问预先建立的数据服务器连接:Servlet 调用第 3 步中返回 CM 连接的方法,检索定义在下层数据服务器的 API 集合中的对象。调用该数据服务器连接对象(或暂时调用一个数据连接)以从 CM 连接中将它分辨出来。这个数据连接不同于 CM 连接,它是来自下层数据服务器 API 集合。这个数据连接不是为 Servlet 而创建 -- 相反这个 Servlet 使用预先建立的数据连接因为它拥有一个缓冲池到缓冲池的连接。将使用来自下层数据服务器 API 集合的方法,以将该数据连接用于与数据服务器的交互。例如,在 Servlet 代码示例中下层数据服务器是一个 JDBC 数据库,而且数据连接对象则是来自 JDBC API 的连接类。

(5) 和数据服务器的相互作用:Servlet 与数据服务器相互作用(如:检索数据和更新数据)使用的是数据连接对象的方法。这些方法针对的是下层数据服务器,因为数据连接实际上来自下层数据服务器的 API 集合。不同的下层数据服务器的数据连接具有不同的方法。方法的全部文档可用于特定数据服务器产品的 API 文档。例如为了实现一个 JDBC 数据连接,可能需要查看关于 java.sql 程序包的文档,以及任何正使用的启用 JDBC 的关系数据库文档。如果在同一用户请求中对多个数据服务器的交互使用数据连接,可能希望在 Servlet 中仍有关联的 CM 连接的其它交互之前进行验证。要验证 Servlet 中仍有连接,Servlet将依次调用 verifyIBMConnection() 方法以使连接管理器检查连接的验证时间标记。如果 Servlet 中仍有连接,则将最近使用时间标记自动更新为当前时间,并作为调用 VerifyIBMConnection() 方法的一部分。然后 Servlet 使用连接来与数据服务器进行通信,确认连接生效。当 Servlet 完成连接时,它将连接释放回连接缓冲池。连接管理器将正在使用标记设置为假,并将验证和最近使用时间标志设置为当前时间。

(6) 释放连接::Servlet 把 CM 连接返回到连接管理器缓冲池,释放连接以供另一个 Servlet 或该 Servlet 的另一个请求使用。

(7) 预备和发送响应:Servlet 准备响应,并将该响应发回给用户。在该步骤中可能不会使用任何连接管理器 API。

2.CM示例

// *******************************************************************
// * IBMConnMgrTest.java - 连接管理器示例的Sevlet,简称CM示例的servlet
// *******************************************************************

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;
import java.util.*;
import com.ibm.servlet.connmgr.*; // 使用了IBM的连接管理器软件包com.ibm.servlet.connmgr

public class IBMConnMgrTest extends HttpServlet {
// Use to communicate with connection manager.
static IBMConnMgr connMgr = null;
// Use later in init() to create JDBC connection specification.
static IBMConnSpec spec = null; // the spec
static String DbName = null; // database name
static String Db = "db2"; // JDBC subprotocol for DB2
static String poolName = "JdbcDb2"; // from Webmaster
static String jdbcDriver = "COM.ibm.db2.jdbc.app.DB2Driver";
static String url = null; // constructed later
static String user = null; // user and password could
static String password = null; // come from HTML form
static String owner = null; // table owner
// Name of property file used to complete the user, password,
// DbName, and table owner information at runtime。
static final String CONFIG_BUNDLE_NAME = "login";
// ****************************************************************
// * Initialize Servlet when it is first loaded *
// ****************************************************************
public void init(ServletConfig config)throws ServletException {
super.init(config);
try {
// Get information at runtime (from an external property file
// identified by CONFIG_BUNDLE_NAME) about the database name
// and the associated database user and password. This
// information could be provided in other ways. It could be
// hardcoded within this application, for example.
PropertyResourceBundle configBundle =
(PropertyResourceBundle) PropertyResourceBundle.getBundle(CONFIG_BUNDLE_NAME);
DbName = configBundle.getString("JDBCServlet.dbName");
url = "jdbc:" + Db + ":" + DbName;
user = configBundle.getString("JDBCServlet.dbUserid");
password = configBundle.getString("JDBCServlet.dbPassword");
owner = configBundle.getString("JDBCServlet.dbOwner");
}
catch (Exception e) {
System.out.println("read properties file: " + e.getMessage());
}
try {
// 第一步:创建连接规范
spec = new IBMJdbcConnSpec(poolName, true, jdbcDriver, url, user, password);
// 第二步:获得连接管理器
connMgr = IBMConnMgrUtil.getIBMConnMgr();
}
catch (Exception e) {
System.out.println("set connection spec, get connection manager: " +
e.getMessage());
}
}
// ****************************************************************
// * Respond to user GET request *
// ****************************************************************
public void doGet(HttpServletRequest req, HttpServletResponse res) {
IBMJdbcConn cmConn = null;
Connection dataConn = null;
Vector firstNameList = new Vector();
try {
// 第三步:获得与连接管理器的连接
cmConn = (IBMJdbcConn)connMgr.getIBMConnection(spec);
// 第四步:使用 CM 连接以访问预先建立的数据服务器连接
dataConn = cmConn.getJdbcConnection();
//第五步:和数据服务器的相互作用
Statement stmt = dataConn.createStatement();
String query = "Select FirstNme " + "from " + owner + ".Employee " + "where LASTNAME = 'PARKER'";
ResultSet rs = stmt.executeQuery(query);
while(rs.next()) {
firstNameList.addElement(rs.getString(1));
}
// Invoke close() on stmt, which also closes rs, freeing
// resources and completing the interaction. You must
// not, however, close the dataConn object. It must
// remain open and under the control of connection manager
// for possible use by other requests to this servlet or to other servlets.
stmt.close();
} catch (Exception e) {
System.out.println("get connection, process statement: " + e.getMessage());
}
// 第六步:释放连接
finally {
if(cmConn != null) {
try {
cmConn.releaseIBMConnection();
} catch(IBMConnMgrException e) {
System.out.println("release connection: " + e.getMessage());
}
}
}
// 第七步:预备和发送响应
// say Hello to everyone whose last name is 'Parker'
res.setContentType("text/html");
// Next three lines prevent dynamic content from being cached
res.setHeader("Pragma", "no-cache");
res.setHeader("Cache-Control", "no-cache");
res.setDateHeader("Expires", 0);
try {
ServletOutputStream out = res.getOutputStream();
out.println("<HTML>");
out.println("<HEAD><TITLE>Hello DBWorld</TITLE></HEAD>");
out.println("");
if(firstNameList.isEmpty()) {
out.println("<H1>Nobody named Parker</H1>");
}
else {
for(int i = 0; i < firstNameList.size(); i++) {
out.println("<H1>Hello " + firstNameList.elementAt(i) + " Parker</H1>");
}
}
out.println("</BODY></HTML>");
out.close();
} catch(IOException e) {
System.out.println("HTML response: " + e.getMessage());
}
}
}

3.连接管理器 API

结合上述示例,下面讨论部分的连接管理器 API。

(1) IBMJdbcConnSpec 类

创建该类的规范对象以将连接规范记录到期望的数据服务器上。这通常是在步骤 2 中执行的。规范对象实际上并没有设置规范,但是它却被另一个方法当作一个变量使用,该方法用于设置规范。请在IBMConnMgr 类中参阅 getIBMConnection() 方法。

目前,连接服务器仅支持遵从 JDBC 的数据服务器,因此只有 JDBC 规范的类是可用的。当支持其它数据服务器时,其它规范类也将变得可用。在建立规范对象后,请使用 get 和 set 方法指定连接要求。 通常,将在规范对象的初始建立过程中指定所有的要求。

public IBMJdbcConnSpec(String poolName,boolean waitRetry,String dbDriver,String url,String user,String password)
缓冲池名称:包含希望使用的连接类型的连接管理器缓冲池。请查询 Web 管理员以获知缓冲池名称。
等待重试:如果当前缓冲池中没有可用的连接时,是否要等待连接释放(若要等待,请指定为真)。 Web 管理员使用“连接超时”参数来设置等待整个缓冲池的时间长度,因此如果在给定的时间内仍不能使用连接,请求将告失败。如果缓冲池中的连接不可用,请指定为假表示立即失败。
数据库驱动程序:由特定的 JDBC 产品多提供的驱动程序类,或提供 JDBC-ODBC 桥接器的驱动程序名。请参阅 Web 管理员或数据库管理员以获得驱动程序名。
URL :数据库 URL。
用户:作为代表进行连接的数据库用户。
口令:用户的口令。


(2)IBMConnMgrUtil 类

使用该类的一种方法以获得有关连接管理器的引用。这通常是在步骤 2 步中执行的。将使用获得的引用来和连接管理器进行通讯并使用它所提供的服务。这里只讨论一个静态方法:
public static IBMConnMgr getIBMConnMgr();

该方法将引用返回到连接管理器。

(3) IBMConnMgr 类

正在运行的连接管理器实例是该类的一个实例。将在步骤 2 步中获得有关连接管理器的参考。 Servlet 从未创建一个连接管理器的实例,而是使用一个现有实例的参考。这里只讨论该类的一种方法:就是用于从缓冲池获得一个 CM 连接的 getIBMConnection() 方法(在步骤 3 中使用)。
public IBM Connection get IBM Connection (IBM ConnSpec connSpec) throws IBM ConnMgr Exception

参数connSpec包含了对一个专用下层数据服务器的详细连接要求。在示例中,它是 IBMJdbcConnSpec 对象(步骤 1 中创建的)。该方法从连接管理器缓冲池返回一个 IBMConnection 对象。

如果 CM 连接是可用的,则 getIBMConnection() 方法为 Servlet 从缓冲池中获得一个 CM 连接。仅获通过的参数是连接的规范对象(在步骤 1 中创建的)。如果一个 CM 连接不是马上可用,并且如果规范对象中的 waitRetry 设置为真,则 Servlet 可以等待 CM 连接变成可用为止。等待的时间长度是由 Web 管理员用“连接超时”参数设置的。Web 管理员还可以禁止等待或不确定地延长等待时间。如果在等待周期过后 CM 连接仍不可用,getIBMConnection() 方法将报告 IBMConnMgrException 异常。如果 waitRetry 设置为假,获取 CM 连接的失败将导致 getIBMConnection() 立刻报告异常。

返回的 IBMConnection 对象是一个“普通”连接对象,必须将它造型成您需访问的下层数据服务器的特定连接对象。例如,在示例 Servlet 中,返回的 IBMConnection 对象被造型成一个 IBMJdbcConn 对象。缺少了适当的造型,连接对象就不能使用其方法在步骤 5 中到达下层数据服务器。

(4) IBMJdbcConn 类

考虑到要访问的下层数据服务器,需将步骤 3 中检索的 IBMConnection 对象造型成一个连接对象。否则,就不存在与下层数据服务器关联的 API 访问。当前,只有一个这样的连接类可用,供访问 JDBC 数据服务器的 IBMJdbcConn 类。通过 IBMJdbcConn 对象访问 JDBC 服务器的工作通常是在步骤 4 中建立的。IBMJdbcConn 类只关心一种方法:
public Connection getJdbcConnection()

该方法将一个连接对象返回至下层 JDBC 数据服务器。连接类来自 JDBC API ,并由 java.sql 软件包存档。连接类的方法让您可使用 JDBC 数据服务器进行交互。该文档的其它部分较多地使用了连接类,而非数据连接,以将其和 CM 连接区分开。 CM 连接不是下层数据服务器 API 集合的一部分。

(5) IBMConnection 类

IBMJdbcConn 类是 IBMConnection 类的一个扩展。因此,IBMConnection 中的多数方法也包括在 IBMJdbcConn 类的实例中。这里讨论的是 IBMConnection 类(即 IBMJdbcConn 类)的两种方法:
public boolean verifyIBMConnection() throws IBMConnMgrException

使用该方法以验证 CM 连接是否仍然有效。可步骤 5 中可选地使用该方法。如果 CM 连接在指定的时间内一直是非活动的(由 Web 管理员检查以确定该由连接管理器配置的操作),则连接管理器可能从 Servlet 中移走 CM 连接。如果在一个用户请求中对几个交互操作使用数据连接,可能希望在每个交互操作在缓冲池中检查 Servlet 中是否仍有关联的 CM 连接之前,调用 verifyIBMConnection() 方法。如果 Servlet 中仍有连接,该方法将返回真,且调用的方法也将重新设置一个最近使用时间标记。

如果预见 Servlet 与数据服务器的交互操作(从一个用户请求中)将在几秒中之内完成,并且如果连接管理器缓冲池的“最长周期”参数至少长达有几分钟,则可能不需要使用 verifyIBMConnection() 方法,请求将在连接管理器移走连接的很早以前就完成。
public void releaseIBMConnection() throws IBMConnMgrException

使用该方法将 CM 连接返回到缓冲池。可在步骤 6 中可选地使用它。当一个 Servlet 不再需要 CM 连接对象时, Servlet 便会使用这种方法将连接释放回缓冲池。这应该在每个用户请求的最后完成。

4.数据访问 JavaBean

访问遵从 JDBC 关系数据库的 Java 应用程序(和 Servlet)通常使用 java.sql 软件包中的类和方法来访问数据。数据访问JavaBeans 是遵守JavaBeans 规约的 Java 类,这种类是用来存取数据库中数据。由于数据访问类是 JavaBean,可以使用在集成开发环境(IDE)下, 如 IBM 产品 VisualAge for Java,允许程序员用可视方法操纵 Java 类,而非编辑 Java 代码的行。由于 JavaBean 也是 Java 类,所以程序员在写 Java 代码时,可以象使用普通的类一样使用 JavaBean。

可以使用软件包com.ibm.db 中的类和方法,来替代使用 java.sql 软件包。软件包 com.ibm.db 提供了:

(1) 查询结果的高速缓存:可以立刻检索所有的 SQL 查询结果并将其放入高速缓存。应用程序(或 Servlet)可以在高速缓存中向前和向后移动或直接转移到高速缓存中的任何结果行。比较它与 java.sql 软件包的灵活性,java.sql 软件包每次从一个数据库中检索一行(仅在向前方向中),而且新的检索行覆盖上一次的检索行,除非又写入了扩展功能代码。对于大量的结果集合,数据访问 JavaBean 提供了检索和管理包的方法,完整的结果设置的子集。

(2) 通过结果高速缓存更新:Servlet 可以使用标准的 Java 语句(而不是 SQL 语句)修改、添加或删除结果高速缓存中的行。更改至可以传播到下属关系表格的高速缓存。

(3) “查询”参数支持:用参数替代某些实际值,以将基本 SQL 查询定义为 Java 字符串。当查询运行时,数据访问 JavaBean 提供了用运行时生成的可用值来代替参数的方法。例如,参数值可能由用户用 HTML 表格提交。

(4) 元数据支持:StatementMetaData 对象包含基本 SQL 查询。可以将高级别的数据(元数据)加入对象,以帮助将参数传递到查询中并使用返回的结果。“查询”参数可以是便于 Java 程序使用的 Java 数据类型。当查询运行时,会使用元数据规格将参数自动转换成适合 SQL 数据类型的表格。为了阅读查询结果,元数据规格可以将 SQL 数据类型自动转换成最便于 Java 应用程序使用的 Java 数据类型。

5. DA示例

// *************************************************************************************
// * IBMDataAccessTest.java - 使用数据访问 JavaBean 的示例Servlet,简称DA示例的Servlet *
// *************************************************************************************
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;
import java.util.*;
import java.math.BigDecimal;
import com.ibm.db.*; // 使用了IBM的软件包com.ibm.db
import com.ibm.servlet.connmgr.*; // 继续使用IBM的连接管理器软件包com.ibm.servlet.connmgr

public class IBMDataAccessTest extends HttpServlet {
// Use to communicate with connection manager.
static IBMConnMgr connMgr = null;
// Use later in init() to create JDBC connection specification.
static IBMConnSpec spec = null; // the spec
static String DbName = null; // database name
static String Db = "db2"; // JDBC subprotocol for DB2
static String poolName = "JdbcDb2"; // from Webmaster
static String jdbcDriver = "COM.ibm.db2.jdbc.app.DB2Driver";
static String url = null; // constructed later
static String user = null; // user and password could
static String password = null; // come from HTML form
static String owner = null; // table owner
// Name of property file used to complete the user, password,
// DbName, and table owner information at runtime. ".properties"
static final String CONFIG_BUNDLE_NAME = "login";
// Single metaData object, used by all user requests, will be
// fully defined in the init() method when the servlet is loaded.
com.ibm.db.StatementMetaData metaData = null; // 与CM示例不同,增加了变量metaData
// ****************************************************************
// * Initialize Servlet when it is first loaded *
// ****************************************************************
public void init(ServletConfig config)throws ServletException {
super.init(config);
try {
PropertyResourceBundle configBundle = (PropertyResourceBundle) PropertyResourceBundle.getBundle(CONFIG_BUNDLE_NAME);
DbName = configBundle.getString("JDBCServlet.dbName");
url = "jdbc:" + Db + ":" + DbName;
user = configBundle.getString("JDBCServlet.dbUserid");
password = configBundle.getString("JDBCServlet.dbPassword");
owner = configBundle.getString("JDBCServlet.dbOwner");
} catch (Exception e) {
System.out.println("read properties file: " + e.getMessage());
}
try {
// 第一步:创建连接规范
spec = new IBMJdbcConnSpec(poolName, true, jdbcDriver, url, user, password);
// 第二步:获得连接管理器
connMgr = IBMConnMgrUtil.getIBMConnMgr();
}
catch (Exception e) {
System.out.println("set connection spec, get connection manager: " + e.getMessage());
}
// 增加数据访问JavaBeans代码
String sqlQuery = "SELECT ID, NAME, DEPT, COMM " + "FROM " + owner + ".STAFF " + "WHERE ID >= ? " + "AND DEPT = ? " + "ORDER BY ID ASC";
// Start defining the metaData object based on the query string.
metaData = new StatementMetaData();
metaData.setSQL(sqlQuery);
try {
// Add some more information to the metaData to make Java
// programming more convenient. The addParameter() method allows
// us to supply an input parameter for the query using a
// convenient Java datatype, doing a conversion to the datatype
// actually needed by SQL. The addColumn() method makes things
// convenient in the other direction, retrieving data in a
// datatype convenient for Java programming, doing a conversion
// from the underlying SQL datatype. The addTable() method
// identifies the relational table and makes it possible for
// result cache changes to be folded back onto the table.
metaData.addParameter("idParm", Integer.class, Types.SMALLINT);
metaData.addParameter("deptParm", String.class, Types.SMALLINT);
metaData.addColumn("ID", String.class, Types.SMALLINT);
metaData.addColumn("NAME", String.class, Types.VARCHAR);
metaData.addColumn("DEPT", Integer.class, Types.SMALLINT);
metaData.addColumn("COMM", BigDecimal.class, Types.DECIMAL);
metaData.addTable("STAFF");
} catch(DataException e) {
System.out.println("set metadata: " + e.getMessage());
}
}
// ****************************************************************
// * Respond to user GET request *
// ****************************************************************
public void doGet(HttpServletRequest req, HttpServletResponse res) {
IBMJdbcConn cmConn = null;
Connection dataConn = null;
SelectResult result = null;
Try {
// 第三步:获得与连接管理器的连接
cmConn = (IBMJdbcConn)connMgr.getIBMConnection(spec);
// 第四步:使用 CM 连接以访问预先建立的数据服务器连接
dataConn = cmConn.getJdbcConnection();
//第五步:和数据服务器的相互作用,但与CM示例不同
// Make use of the externally managed connection dataConn gotten
// through the connection manager. Our dataAccessConn object
// should be local (a new object for each request), since there
// may be multiple concurrent requests.
DatabaseConnection dataAccessConn = new DatabaseConnection(dataConn);
// Begin building our SQL select statement - it also needs to be
// local because of concurrent user requests.
SelectStatement selectStatement = new SelectStatement();
selectStatement.setConnection(dataAccessConn);
// Attach a metadata object (which includes the actual SQL
// select in the variable sqlQuery) to our select statement.
selectStatement.setMetaData(metaData);
// Make use of the facilities provided through the metadata
// object to set the values of our parameters, and then execute
// the query. Values for dept and id are usually not hardcoded,
// but are provided through the user request.
String wantThisDept = "42";
Integer wantThisId = new Integer(100);
selectStatement.setParameter("deptParm", wantThisDept);
selectStatement.setParameter("idParm", wantThisId);
selectStatement.execute();
// The result object is our cache of results.
result = selectStatement.getResult();
// Try an update on the first result row. Add 12.34 to the
// existing commission, checking first for a null commission.
BigDecimal comm = (BigDecimal)result.getColumnValue("COMM");
if(comm == null) {
comm = new BigDecimal("0.00");
}
comm = comm.add(new BigDecimal("12.34"));
result.setColumnValue("COMM", comm);
result.updateRow();
// Close the result object - no more links to the relational
// data, but we can still access the result cache for local
// operations, as shown in STEP 7 below.
result.close();
} catch (Exception e) {
System.out.println("get connection, process statement: " + e.getMessage());
}
// 第六步:释放连接
finally {
if(cmConn != null) {
try {
cmConn.releaseIBMConnection();
} catch(IBMConnMgrException e) {
System.out.println("release connection: " + e.getMessage());
}
}
}
// 第七步:预备和发送响应,与CM示例有区别。
res.setContentType("text/html");
// Next three lines prevent dynamic content from being cached
res.setHeader("Pragma", "no-cache");
res.setHeader("Cache-Control", "no-cache");
res.setDateHeader("Expires", 0);
try {
ServletOutputStream out = res.getOutputStream();
out.println("<HTML>");
out.println("<HEAD><TITLE>Hello DBWorld</TITLE></HEAD>");
out.println("<BODY>");
out.println("<TABLE BORDER>");
// Note the use of the result cache below. We can jump to
// different rows. We also take advantage of metadata
// information to retrieve data in the Java datatypes that
result.nextRow();
out.println("<TR>");
out.println("<TD>" + (String)result.getColumnValue("ID") + "</TD>");
out.println("<TD>" + (String)result.getColumnValue("NAME") + "</TD>");
out.println("<TD>" + (Integer)result.getColumnValue("DEPT") + "</TD>");
out.println("<TD>" + (BigDecimal)result.getColumnValue("COMM") + "</TD>");
out.println("</TR>");
result.previousRow();
out.println("<TR>");
out.println("<TD>" + (String)result.getColumnValue("ID") + "</TD>");
out.println("<TD>" + (String)result.getColumnValue("NAME") + "</TD>");
out.println("<TD>" + (Integer)result.getColumnValue("DEPT") + "</TD>");
out.println("<TD>" + (BigDecimal)result.getColumnValue("COMM") + "</TD>");
out.println("</TR>");
out.println("</TABLE>");
out.println("</BODY></HTML>");
out.close();
} catch (Exception e) {
System.out.println("HTML response: " + e.getMessage());
}
}
}

DA示例用了数据访问 JavaBean 来代替使用 java.sql 软件包中的类,以与数据库进行交互操作。 而CM示例使用 java.sql 软件包中的类来与数据库进行交互操作。DA 示例的优点来自于连接管理器的优化和资源管理成为可能。程序员编写 DA 示例的优点来自于数据访问 JavaBean 提供的特点和功能。DA 示例仅有一小部分区别于 CM 示例。这里只讨论区别的部分。

CM 示例 Servlet 的步骤 1,2,3,4 和 6 在 DA 示例 Servlet 中未作更改。这些步骤包括了连接管理器的设置、从缓冲池中获得连接和将连接释放回缓冲池。对CM 示例的主要更改是:

(1) metaData 变量

该变量是在代码开始的“变量”段中加以说明的,它在所有方法之外。它允许对到达的用户请求使用单个实例。变量的说明是在 init() 方法中完成的。

(2) init() 方法

已将新的代码加入 init() 方法中,以便在初次装入 Servlet 时对 metaData 对象进行一次初始化操作。新的代码从将基本查询对象 sqlQuery 创建为 String 对象开始。注意 :idParm 和 :deptParm 参数的占位符号。 sqlQuery 对象指定了 metaData 对象内的基本查询。最后,提供高级别的数据(元数据)和基本查询给 metaData 对象,这将对运行查询和使用结果有帮助。代码显示了:
addParameter() 方法注释,当运行查询时,为了便于 Servlet 进行操作,参数 idParm 将被支持为 Java Integer 数据类型, 但当运行查询时,idParm 应该转换(通过 metaData 对象)以执行重要关系数据的 SMALLINT 关系数据类型的查询。
deptParm 参数的使用相似于 addParameter() 方法,要注意相同的下属 SMALLINT 关系数据类型,第二个参数将会在 Servlet 中以不同的 Java 数据类型存在 - 如 String 类型而不是 Integer 类型。这样的话,参数可以是便于 Java 应用程序使用的 Java 数据类型,并可以自动地由 metaData 对象转换成和运行查询时所要求的关系数据类型一致的数据类型。
addColumn() 方法执行一个类似于 addParameter() 方法的功能。对于要从关系表中检索的数据的每个列, addColumn() 方法将关系数据类型映射到 Java 应用程序最便于使用的 Java 数据类型。从结果高速缓存中读取数据时和对高速缓存进行更改(然后对下属关系表进行更改)时会使用映射。
addTable() 方法明确地指定了下属关系表。如果将更改到结果高速缓存传播至下属关系表,那么就需要信息。

(3) 步骤 5

步骤 5 已经重新写入使用数据访问 JavaBean 以执行 SQL 查询来代替执行 Java.sql 软件包中的类。查询使用 selectStatement 对象运行,该对象是一个 selectStatement 数据访问 JavaBean。步骤 5 是对用户请求的响应处理的一部分。当步骤 1 至 4 已运行时,可以使用连接管理器的 dataConn 连接对象。代码显示了:
创建 dataAccessConn 对象(数据库连接 JavaBean)以建立数据访问 JavaBean 和 数据库连接(dataConn 对象)之间的链接。
创建 selectStatement 对象(选择语句 JavaBean),用于通过 dataAccessConn 对象指向数据库连接,并通过 metaData 对象指向查询。
查询是用 setParameter() 方法指定参数来“完成”的。
查询是用 execute() 方法来执行的。
结果对象(SelectResult JavaBean)是一个包含查询结果的高速缓存,它是用 getResult() 方法创建的。
数据访问 JavaBean 提供了一套丰富的用于使用结果高速缓存的特性 - 就这一点,代码显示了如何用标准 Java 代码更新结果高速缓存(和下属关系表 )中的第一行,而不需要使用 SQL 语法。
close() 方法切断了结果高速缓存和下属重要关系表间的链接,但是高速缓存中的数据仍可由 Servlet 进行本地访问。使用 close() 方法后,数据库连接就不是必需的了。步骤 6(未对 CM 示例 Servlet 作修改 )中将数据库连接释放回连接管理器缓冲池,以供另一个用户请求使用。

(4) 步骤 7

步骤 7 已完全重写(对照 CM 示例),以使用步骤 5 中检索出的查询结果高速缓存,来准备发送给用户的响应。结果高速缓存是一个选择结果数据访问 JavaBean。虽然结果高速缓存不再链接至下属关系表,但它仍可以由本地进程访问。在该步骤中,准备响应并将它发送给用户。代码显示了如下内容:

nextRow() 和 previousRow() 方法用于浏览结果高速缓存。可以使用其它浏览方法。
getColumnValue() 方法用于从结果高速缓存中检索数据。由于先前在创建 metaData 对象时的属性设置,因此可以很容易将数据造型成便于 Servlet 使用的格式。

7.2 会话编程

1.会话跟踪程序

会话是起源于同一浏览器上同一用户的一系列请求。使用该会话跟踪框架,服务器就可以保持会话的状态信息。处理会话跟踪的类是IBMSessionContextImpl(在IBM的软件包com.ibm.servlet. persona-lization.sessiontracking中)。缺省情况下,通常由WebSphere应用服务器激活它。IBM的软件包 com.ibm.servlet.personalization.sessiontracking 包括下列3个类和1个接口:

IBMSessionData (该类扩展了com.sun.server.http.session.SessionData)
IBMSessionContextImpl (该类扩展了com.sun.server.http.session.SessionContextImpl)
IBMHttpSessionBindingEvent(该类扩展了javax.servlet.http.HttpSessionBindingEvent,并实现了Serializable,用于会话群集)
IBMHttpSessionBindingListener(扩展了HttpSessionBindingListener和Serializable,用于会话群集)当用户首次发出请求时,便启用了会话跟踪程序,并创建了 HttpSession 对象,且将会话标识符作为一个 cookie 发送至浏览器。在后继请求中,浏览器将会话标识符作为一个 cookie 送回给用户,会话跟踪程序用它找到与该用户关联的 HttpSession。当 HttpSession 包含用于实现 IBMHttpSessionBindingListener 的对象时,当实现侦听程序接口的对象与会话连接或断开连接时,会话跟踪程序会通知该对象。由于 HttpSession 对象自己是作为 IBMHttpSessionBindingEvent 的一部分进行传递的,所以 IBMHttpSessionBindingListener 接口允许您在除去会话之前,保存会话的任何部分。这与自动结束会话还是由指定的请求结束会话无关。


下面说明在集成的 Web 服务器环境中会话跟踪是如何进行工作的:

(1) 每当用 HttpServletRequest 实现的 getSession 方法获得一个会话时,拥有会话的主机在会话上加一个锁并将会话传播到所需的地方。在任何会话修改和 HttpServletRequest 实现的服务方法结束后,会话将自动发送回服务器以更新会话的副本并释放会话中所加的锁。可以将使用 HTTP 请求获得的会话作为 Servlet 的当前会话或相关联的会话,或是当前 HTTP 请求拥有的会话。

(2) 还可以用 HttpSessionContext(IBMSessionContextImpl)实现的 getSession 方法获得会话。Servlet 可以先访问 HttpSessionContext 实现的 getIds 方法,再用上下文中的 getSession 方法以访问其它几个与 HTTP 请求关联的会话。当用这种方法获得请求时,程序员必须用 IBMSessionContextImpl 的 同步化(synchronized)方法,手工地对会话解锁。同步化方法也会自动更新会话的拥有者主机的版本。

(3) 当 HttpSessionBindingListener 和 HttpSessionBindingEvent 用于集成的 Web 服务器环境时,在WebSphere应用服务器中将在会话驻留的地方激发该事件。如果会话超时,那么这个位置将是拥有者主机。如果通过调用会话对象的无效方法使会话无效,那么该位置可能是会话群集客户机或拥有者主机。如果用 removeValue() 方法除去会话对象,则将在主机上使用调用的地方激发该事件。要提高获取会话无效事件通知单的能力,请使用 IBMHttpSessionBindingListener 和 IBMHttpSessionBindingEvent,它们提供了设置和检索会话群集客户机或会话群集服务器的主机名时所需的扩展名,以接收通知单。

(4) 在将WebSphere应用服务器的一个实例配置成一个会话群集客户机后,所有其它配置参数(除了启用会话支持参数和会话交换参数)都由指定的会话群集服务器进行访问。参数设置的本地副本保留在会话群集客户机的磁盘上。当会话群集客户机将会话跟踪程序更改为另一总模式时,会话跟踪程序将使用参数设置。这种设计保证了会话群集配置的一致性。

(5) 在当前的 Java Servlet API(如 Sun Microsystems 指定的)中,HttpSession 接口的 putValue() 方法的定义对集成环境的可能性不做解释。如果添加一个不能实现会话的可串行化接口的对象,则将无法用给定的对象来传播对象。当客户机中做了会话更新时,将不能从群集客户机发送对象至群集服务器。要使应用程序在集成环境中可移动,则必须将所有对象放置在可串行化的会话中。

(6) 在会话群集环境中,添加到会话中的 Java 对象必须在每个群集主机和客户机的WebSphere应用服务器类路径中。正如前面所讨论的,这种对象将被串行化(即存储到磁盘上)。

2. 使用 HttpServletRequest 创建会话

下面结合示例(SessionSample.java),介绍使用 HttpServletRequest 创建会话的编程技术。示例的程序清单如下:

import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class SessionSample extends HttpServlet {
public void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 第一步:获取 HttpSession 对象
boolean create = true;
HttpSession session = request.getSession(create);
// 第二步:在会话中存储并检索用户定义的数据。
Integer ival = (Integer) session.getValue ("sessiontest.counter");
if (ival == null) ival = new Integer (1);
else ival = new Integer (ival.intValue () + 1);
session.putValue ("sessiontest.counter", ival);
// 第三步:输出一个包含 HttpSesson 对象的数据的 HTML 响应。
response.setContentType("text/html");
out.println("");
if(firstNameList.isEmpty()) {
out.println("<head><title>Session Tracking Test</title></head>");
out.println("<body>");
out.println("<h1>Session Tracking Test</h1>");
out.println ("You have hit this page " + ival + " times" + "<br>");
out.println ("Your " + request.getHeader("Cookie"));
out.println("</body></html>");
}
}
}

编程步骤如下:

(1) 获取 HttpSession 对象。

使用 HttpServletRequest 对象的 getSession() 方法来获得会话。当首次获得 HttpSession 对象时,会话跟踪程序会创建一个唯一的会话标识符并典型地将它作为 cookie 发送回浏览器。该用户(在同一浏览器上)的每个后继请求会传递 cookie 。会话跟踪程序用会话标识符来查找用户的现有 HttpSession 对象。

在代码示例的第一步中,将 Boolean 设置为真,这样如果未找到HttpSession,便会创建 HttpSession。

(2) 在会话中存储并检索用户定义的数据。

会话建立后,就可以将一个检索用户定义的数据添加到会话中。HttpSesson 对象中添加、检索和除去Java 对象的方法类似于 java.util.Dictionary 中的方法。通常用 HttpSession.putValue() 来连接对象和会话,并用 HttpSession.removeValue() 来切断对象和会话之间的连接。会话的失效也暗示着将切断当前所有会话与对象的连接。如果启用了会话持续性(缺省设置)或在会话群集环境中,请确保将要添加到会话中的 Java 对象(.class, .jar 和 .ser 文件)放置在WebSphere应用服务器类路径。

在代码示例的第二步中,Servlet 从 HttpSession 对象中读取一个整数对象,对其增量,并将之写回。可以用任何名称(例如示例中的 sessiontest.counter)来标识 HttpSession 对象中的值。因为 HttpSession 对象是由用户可访问的 Servlet 共享的,所以建议采用站点端的命名约定规则,以避免 Servlet 之间的共享冲突。

(3) 输出一个包含 HttpSesson 对象的数据的 HTML 响应(可选的)。

在代码示例的第三步中,Servlet 生成了一个 Web 页面,每次用户在会话期间访问该页面时,它就会显示 sessiontest.counter 的值。

(4) 使用 IBMHttpSessionBindingListener 接口,以在会话结束时保存数据(可选的)。

会话结束前,将通知存储在实现 IBMHttpSessionBindingListener 接口会话中的对象会话即将终止。这就允许执行后续会话处理,例如将数据保存到一个数据库中。HttpSessionBindingListener 接口提供了下列方法,必须在实现接口时实现这些方法:
valueBound();将对象连接到会话时调用该方法
valueUnbound();切断对象与会话间的连接时调用该方法 IBMHttpSessionBindingListener 接口提供了下列方法,用自己的程序来覆盖这些方法:
setReceiverHostname();设置启动事件的主机名,并支持对会话群集环境中会话失效事件的响应。
getReceiverHostname();返回接收器主机名。

(5) 结束会话

可由会话跟踪程序或指定的 Servlet 处理自动终止一个会话。

7.3 PageListSevlet技术

PageListSevlet技术是Webphere应用服务器特有的一种Servlet技术。

1.使用XML文件来配置Sevlet

Webphere应用服务器支持使用XML文件来配置Sevlet,这些配制文件称为XML Servlet 配置文件。一个XML Servlet 配置文件的示例如下:

<?xml version="1.0"?>
<servlet>
<code>SimplePageListServlet</code>
<description>Shows how to use PageListServlet class</description>
<init-parameter name="name1" value="value2"/>
<page-list>
<default-page>
<uri>/index.jsp</uri>
</default-page>
<error-page>
<uri>/error.jsp</uri>
</error-page>
<page>
<uri>/TemplateA.jsp</uri>
<page-name>page1</page-name>
</page>
<page>
<uri>/TemplateB.jsp</uri>
<page-name>page2</page-name>
</page>
</page-list>
</servlet>

页面列表(<page-list>)描述了servlet调用的那些JSP文件的抽象名,从而避免了将被调用的 JSP文件的 URL编码到servlet中。页面列表还可以包含一个缺省页面、出错页面和其它根据 HTTP 请求而调用的 JavaServer 页面。

XML Servlet 配置文件(如名为SimplePageListServlet.servlet 的XML 文档)包含如下内容:
Servlet 类文件的文件名
Servlet 说明
Servlet 初始化参数
包含 Servlet 可以调用的 JavaServer 页面的 URL(统一资源定位器)的页面列表。该页面列表可以包括一个缺省页面、一个出错页面、一个或多个已装入的目标页面(如果它们的名称出现在 HTTP 请求中)。

该 .servlet 文件存储在WebSphere应用服务器的servlets\ 目录下,或Java 类路径目录下。当WebSphere应用服务器接收到一个对 Servlet 实例的请求时,它将在 servlet.properties 文件中查找该 Servlet 的配置信息。当使用WebSphere应用服务器的管理器配置 Servlet 初始化参数和装入选项时,管理器将把这些设置信息存储在 servlet.properties 文件中。如果WebSphere应用服务器在 servlet.properties 文件中没有找到所请求的 servlet 的配置信息,它将检查 servlets\ 目录和 Java 类路径下属于该 Servlet 实例的 .servlet 文件。当WebSphere应用服务器找到 Servlet 配置信息时,它将装入该 Servlet 实例。

在下列情况下,XML Servlet 配置文件是十分有用的:

Servlet 使用 callPage() 方法调用 JSP 时。为了调用 JSP,XML Servlet 配置文件的 page-list 元素和 PageListServlet 类(将在下一章节中讨论)消除对 URL 硬编码。如果引用的页面发生更改时,只需更新 .servlet 文件,而无需更新 Servlet 代码和重新编译该 Servlet。每当 .servlet 文件发生更改时,WebSphere应用服务器就会自动装入 Servlet 实例。
希望将一个 Servlet 的配置信息与其它的 Servlet 的配置信息分隔开时。每当使用WebSphere应用服务器的管理器来配置 Servlet 初始化参数和装入选项时,管理器将把这些设置信息存储在 servlet.properties 文件中。如果需分隔一个 Servlet(为了易于管理安全性、展开或除去应用程序)时,XML Servlet 配置支持是十分有帮助的。


WebSphere Application Studio 提供了用于生成 Servlet 的向导。这些向导实现了 XML Servlet 配置(即生成了一个 .servlet 文件)。在没有这个工具的情况下,可以创建一个扩展 PageListServlet 类的 Servlet,并使用文本编辑器创建一个 XML Servlet 配置文件,或使用 XMLServletConfig 类来为 Servlet 实例创建一个 XML Servlet 配置文件。必须注意的是,目前,使用XML Servlet 配置文件的Sevlet 必须是PageListServlet的子类或子孙类。

2.使用 PageListServlet 类

PageListServlet 包含一种 callPage() 方法,该方法调用了一个 JavaServer 页面,并将其作为对页面列表中某个页面的 HTTP 请求的响应。PageListServlet callPage() 方法接收 在XML 配置文件中的页面名、 HttpServletRequest 对象、和 HttpServletResponse 对象。与此相反,HttpServiceResponse 类的callPage() 方法通常接收一个 URL 和 HttpServletRequest 对象。

SimplePageListServlet 是一个扩展 PageListServlet 类的 Servlet 示例:

public class SimplePageListServlet extends com.ibm.servlet.PageListServlet {
public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
try{
setRequestAttribute("testVar", "test value", req);
setRequestAttribute("otherVar", "other value", req);
String pageName = getPageNameFromRequest(req);
callPage(pageName, req, resp);
} catch(Exception e) {
handleError(req, resp, e);
}
}
}

请注意:PageListServlet在软件包com.ibm.servlet中,该类扩展了 javax.servlet.http.HttpServlet。

3.创建XML Servlet 配置文件

可以使用文本编辑器创建一个 XML Servlet 配置文件,或使用 XMLServletConfig 类来为 Servlet 实例创建一个 XML Servlet 配置文件。可以编写一个使用 XMLServletConfig 类的 Java 程序,以生成 Servlet 配置文件。 XMLServletConfig 类提供了关于设置和获取 file 元素和其内容的方法。

4.部署 Servlet 和 .servlet 文件

为了在WebSphere应用服务器上使用经编译的 Servlet 和其 XML Servlet 配置文件:

(1) 将经编译的 Servlet 和其 .servlet 文件放置在下列任一路径中:
(2) applicationserver_root\servlets,其中 applicationserver_root 是 Application Server 安装的根目录。如果 Servlet 有软件包名称, 则请确保该 Servlet 被放置在正确的 servlets\ 子目录下。
(3) 一个在 Application Server 管理器 Java 设置屏幕上的“应用服务器Java 类路径”字段中指定的目录。
(4) 请确保在页面列表中引用的JSP 文件位于 Web 服务器的 HTML 文档目录中。
(5) 如果希望WebSphere应用服务器在启动时自动装入 Servlet 实例,请使用管理器添加 Servlet 实例名称,并指定在启动时装入。

WebSphere应用编程技术涉及Java Servlet API和WebSphere应用服务器 API,请参阅有关文档获得更详细的信息。另外,附录中的实验指导带您一起走过使用WebSphere技术开发电子商务应用的过程。

参考文献


1.G. Cornell, C. S. Horstmann. Core Java. SunSoft Press, 1996.
2.Marc Abrams, ed. World Wide Web - Beyond the Basics, Prentice Hall, 1998.
3.John Akerley etc. Developing an e-business Application for the IBM WebSphere Application Server. International Technical Support Organization,1999。(http://www.redbooks.ibm.com)
4.Jurgen Friedrichs etc. Java Thin-Client Programming. International Technical Support Organization,1999。(http://www.redbooks.ibm.com)
5.Goldfarb, Paul Prescod. The XML handbook. Prentice Hall, Upper Saddle River, NJ 07458, 1998.
6.Sean McGrath. XML by Example: Building E-Commerce Applications. Prentice Hall, Upper Saddle River, NJ 07458, 1998.
7.Web上的参考站点:
Internet FAQ Consortium:http://www.faqs.org/。
WWW联盟(World Wild Web Consortium):http://www.w3.org/
面向对象信息资源:http://iamwww.unibe.ch/~scg/OOinfo/
对象管理组织:http://www.omg.org/。
IBM 电子商务:http://www.ibm.com/e-business/。
Java 技术:http://java.sun.com/。
结构化信息标准发展组织(Organization for the Advancement of Structured Information Standards):http://www.oasis-open.org。
XML 组织:http://xml.org/。
IBM WebSphere:http://www-4.ibm.com/software/webservers/

...... [阅读全文]

IBM WebSphere应用服务器(简称WebSphere应用服务器)是一个Web应用服务器,它提供了增强的Servlet API和Servlets管理工具,并集成了JSP技术和数据库连接技术。

6.1 基本特性

WebSphere应用服务器使您能够为Servlet 的开发实现 “一次写成,各处使用”的目的。该产品包括一个基于 Java 的 Servlet 引擎,独立于 Web 服务器和它所基于的操作系统。WebSphere应用服务器提供了服务器插件的选项,与大多数流行的应用程序设计接口(API)兼容。所支持的 Web 服务器有:
IBM HTTP 服务器
Apache Server
Domino
Lotus Domino Go Webserver
Netscape Enterprise Server
Netscape FastTrack Server
Microsoft Internet Information Server

除了 Servlet 引擎及插件外,WebSphere应用服务器还提供:

1. JavaSoft Java Servlet API 实现,以及这些 API 的扩展和附加。

2. 示例和文档,示例 Servlet 和 Web 站点应用程序演示了简单和高级技术。联机和可打印文档供您快速入门,并帮助掌握服务器高级功能的使用演示基本类及其扩展的示例应用程序。

3. WebSphere应用服务器的管理器,使用图形界面,易于:
(1) 为装入本地和远程的 Servlet 设置选项
(2) 设置初始化参数
(3) 管理 Servlet
(4) 指定 Servlet 别名
(5) 创建 Servlet 链和过滤
(6) 启用轻量级目录访问协议(LDAP)目录支持
(7) 记录 Servlet 消息
(8) 启用 JVM 调试
(9) 监控 WebSphere应用服务器 使用的资源
(10) 监控已装入 Servlet、活动 Servlet 会话和 JDBC 连接
(11) 控错误、事件、异常情况和日志输出
(12) 创建转储和数据快照
(13) 动态地启用和禁用跟踪

4. 缓存和再使用与 JDBC-从属数据库连接的连接管理功能。当一个 Servlet 需要数据库连接时,它可从可用连接的缓冲池获得,从而消除了为每个请求打开一个新连接的所需花费的系统开销。

5. 附加的 Java 类,遵循 JavaBeans 规范,允许程序员访问 JDBC-从属数据库。当隐藏使用关系数据库的复杂度时,这些数据访问 Bean 可提供增强功能。它们可用于可视集成开发环境中。

6. JSP的动态页面内容支持。JSP 技术使您能够通过服务器端脚本生成动态 Web 页面。其结果是将呈示逻辑(例如,定义 Web 站点结构和外观的 HTML 代码)从业务逻辑(例如,访问数据库以获得要显示在 Web 站点上的信息的 Java 编码信息)中分隔出来。灵活性方面,JSP 文件可包括任何直接插入的 Java 的组合:<SERVLET> 标记、NCSA 标记和 JavaBean。

7. 启用 LDAP(轻量级目录访问协议)支持的目录服务。

8. 用于集成WebSphere应用服务器和Web服务器(如Apache Server) 到Tivoli 管理环境(Tivoli Management Environment)以获得分布式监控和操作的模块和命令行界面。Tivoli 模块并不与WebSphere应用服务器一起发行,请访问Web 站点(http://www.software.ibm.com/webservers/appserv/)以获得更多信息。

WebSphere应用服务器对JSP的支持是通过JSP处理器来实现的。在 Web 服务器上安装 WebSphere应用服务器时,Web 服务器的配置被设置成将对 JSP 文件(即文件扩展名为 .jsp)的 HTTP 请求传递至 WebSphere应用服务器。WebSphere应用服务器配置则被设置成将 JSP 文件传递至其 JSP 处理器(pageCompile)。

JSP 处理器对每一个 JSP 文件创建并编译 Servlet。该处理器还为每个 JSP 文件产生两个文件:

(1) java 文件:包含可用于 Servlet 的 Java 语言代码;

(2) class 文件:编译过的 Servlet。

JSP 处理器把 .java 和 .class 文件放在目录 servlets\pagecompile\JSP_file_path 下,其中 JSP_file_path 是 JSP 源文件所在的目录路径。例如,若JSP 文件在WebSphere\AppServer\samples\WebBank 目录下,则.java 和.class 文件就在WebSphere\AppServer\servlets\pagecompile\WebSphere\App Server\samples\WebBank 目录下。.java 和 .class 文件的文件名相同。处理器使用了命名约定,该命名约定包括将下划线字符和后缀添加到 JSP 文件名中。例如,如果 JSP 文件名是 login.jsp,则生成的文件为 _login_xjsp.java 和 _login_xjsp.class。

如同所有的 Servlet,由 JSP 文件生成的 Servlet 是 javax.servlet.http.HttpServlet的子类或子孙类。如果 Servlet 类是软件包的一部分,则 Servlet Java 代码包含了用于一些必需类和软件包语句的导入语句。如果 JSP 文件包含 JSP 语法(例如指令和 scriptlets),则 JSP 处理器会将 JSP 语法转换成等价的 Java 代码。如果 JSP 文件包含 HTML 标记,则处理器添加 Java 代码,以使 Servlet 能一个接一个字符地输出 HTML。

6.2 安装与配置

对于任何软件,都需要一些计划和具体步骤以确保成功安装。对于安装与配制 WebSphere应用服务器及其组件也是如此。下面介绍在Windows NT 上安装与配置WebSphere应用服务器

1.内存和软件要求

(1) 内存:至少 128 MB RAM,建议 256 MB。WebSphere应用服务器安装光盘包括 Java 开发工具(JDK)。
(2) 操作系统:Microsoft NT 版本 4.0 与服务包3 。
(3) Web 服务器:WebSphere应用服务器需要下列服务器之一。
IBM HTTP 服务器版本 1.3.3 Windows NT 版(WebSphere应用服务器安装光盘包括IBM HTTP 服务器)
Apache Server 版本 1.3.2 Windows NT 版
Domino 版本 5.0 Windows NT 版
Lotus Domino Go Webserver 版本 4.6.2.5 Windows NT 版
Microsoft Internet Information Server 版本 3.x 和 版本 4.0 Windows NT 版
Netscape Enterprise Server 版本 3.01 和 版本 3.51 Windows NT 版(建议使用版本 3.5.1)
Netscape FastTrack Server 版本 3.01 Windows NT 版

(4) Java 开发组件(JDK):建议使用与 WebSphere应用服务器一起提供的 JDK1.1.6。
(5) Java servlet API:WebSphere应用服务器包括 JSDK 版本 2.0 或更高版本。
(6) Web 浏览器:WebSphere应用服务器的管理器是用来管理 servlet 的用户界面。要运行管理器,需要 appletviewer 或支持 JDK1.1 的浏览器,例如:
Netscape Navigator 4.06 或 4.0.7,包括集成的 JDK 1.1 支持并由以下 Web 站点提供:http://developer.netscape.com/software/jdk/download.html。
或带有修正包的 Microsoft Internet Explorer 4.01 或更高版本。
Sun HotJava 1.1 或更高版本

一些旧的浏览器不能够正确地处理启用本机语言支持的文本。如果在用户界面上看到外来字符,例如“sEnable”,而不是“Enable”,可以通过升级浏览器校正。

2.安装Web服务器

如果计划安装 IBM HTTP 服务器,请在安装 WebSphere应用服务器之前安装它。可以从 WebSphere应用服务器安装光盘安装 IBM HTTP 服务器。安装WebSphere应用服务器会更改 Web 服务器 httpd.conf 文件。如果安装 Web 服务器是在安装 WebSphere应用服务器之后安装的,将不会进行更改,并且 WebSphere应用服务器将不能够正确运行。安装 IBM HTTP 服务器之后,需要一些配置以启用 SSL 支持。请参阅 IBM HTTP 服务器文档以获得指示信息。

对于计划安装其它的Web 服务器(如Apache Server),也请在安装 WebSphere应用服务器之前安装它。理由同上。

3.安装 WebSphere应用服务器之前

安装WebSphere应用服务器版本 2.0之前,请卸装所有以前的版本。卸装之前,备份 WebSphere应用服务器版本 1.x 文件。

(1) 文件备份

从Windows NT 卸装以前版本的 WebSphere应用服务器之前,确保要移植的文件已经或者将要保存。安装 WebSphere应用服务器版本 2.0 时显示出的图形用户界面备份 WebSphere应用服务器目录中的文件,包括类、领域、Servlet、属性文件,其中,属性文件包括servlet.properties、admin_port.properties、rules.properties、jvm.properties、aliases.properties、connmgr.properties、userprofile.properties。如果有文件驻留在这四个目录之外(例如,如果在 WebSphere应用服务器 安装中创建自己的目录),请在安装 WebSphere应用服务器 版本 2.0. 之前,在 WebSphere应用服务器 安装之外的位置备份文件。

此处包括移植进程的第一部分。第二部分必须在安装 WebSphere应用服务器版本 2.0 之后执行。请参阅有关文档以获得详细信息。

(2) 卸载前一版本

对于 Windows NT,使用开始 --> 控制面板中的添加/删除选项,或从开始 --> 程序 --> IBM WebSphere --> WebSphere应用服务器版本1.x 卸装。

注意:当已安装了某版本的 WebSphere应用服务器,它将复制Web 站点配置文件作为备份文件,然后修改原始配置文件。当使用 Web 服务器时这个已被修改过的文件就成为活动的配置文件。当卸装 WebSphere应用服务器时,不会恢复以前的配置文件,它仍然是备份文件。为了使这些设置再次活动,必须将它们从备份文件转换为活动的 Web 服务器配置文件。

另外,需要清除 CLASSPATH。如果在 CLASSPATH 中已经有来自以前版本的 WebSphere应用服务器的信息,安装版本2.0之前请删除这些信息。对于在 Windows NT 上使用Go Webserver 的Web服务器来说,当安装 WebSphere应用服务器时能自动卸装Go Webserver 上的 Java 支持。其它的请查阅有关文档。

4.安装WebSphere应用服务器

在即将安装 WebSphere应用服务器之前,请确保已经:

(1) 备份所有未通过安装程序自动备份的文件(从以前的 WebSphere应用服务器进行安装)。
(2) 安装您计划使用的 Web 服务器。Web 服务器必须在安装 WebSphere应用服务器之前安装。
(3) 如果 Web 服务器正在运行,请停止它。
注意:在WebSphere应用服务器的安装期间,如果指定使用 IBM HTTP 服务器或 Apache Server,将提示您确认 Web 服务器 httpd.conf 文件的位置。

安装在 Windows NT 上,插入 WebSphere应用服务器安装光盘,转至以 Windows NT 操作系统命名的子目录,运行可执行安装程序(setup.exe)。一系列面板将指导您完成安装。

5.配置 WebSphere应用服务器

下面介绍启用 WebSphere应用服务器和它的组件以使之协同工作的必要配置。完成这些任务之后,WebSphere应用服务器便能够主要通过使用缺省设置运行所有功能。

(1) 配置 Apache Server

如果使用Apache Server作为Web服务器,请确保httpd.conf 文件包含此行:AddModule mod_app_server.c。

(2) 使用数据库。

要确保 WebSphere应用服务器 维护和使用与关系数据库(如 Oracle 或 DB2)的连接,请添加数据库.zip 文件到位于文件 <as_root >/properties/bootstrap.properties 中的 java.classpath 属性,或使用 WebSphere应用服务器的管理器界面的 Java 引擎页面来指定文件。同样,确保 java.classpath 包含用于数据库连接的有效的驱动程序。请查看产品 Web 站点上的 WebSphere应用服务器 版本 2.0 自述文件可得到附加的技巧。

(3) 运行模式

ose.mode 属性控制 WebSphere应用服务器是作为 Web 服务器的一部分(进程内),还是在独立模式下运行(进程外)。该属性位于 <as_root> /properties/bootstrap.properties 文件中。对于所有的服务器,ose.mode 缺省值是 out。如果使用 Apache Server 或 IBM HTTP 服务器,必须设置 ose.mode 属性为 out,这意味着 WebSphere应用服务器在独立模式下运行。对于其它 Web 服务器,可以(但不建议)更改 ose.mode 为 in 并且作为 Web 服务器的一部分运行 WebSphere应用服务器。 无论何时如有必要请复位 ose.mode。例如,如果从作为 Webserver 一部分运行的 Netscape Enterprise Server (ose.mode=in)转换为 IBM HTTP 服务器(要求 ose.mode=out),不要忘记在运行 IBM HTTP 服务器之前,将 ose.mode 属性更改为 out。

与手工编辑包含 ose.mode 属性的 bootstrap.properties 文件相对比,管理器界面的 Java 引擎页面提供了一个简单的方法来锁住该属性值。 Java 引擎页面提供了一个可用来指示是以 Web 服务器的一部分(ose.mode=in)或以独立模式(ose.mode=out)运行 WebSphere应用服务器的单选按钮。请参阅有关文档学习如何访问管理器。

ose.mode 的值影响。作为 Web 服务器一部分运行 WebSphere应用服务器为Servlet 和其它应用程序提供较高的性能,但安全性较差。作为 Web 服务器的一部分运行 WebSphere应用服务器,允许当关闭 Web 服务器时 WebSphere应用服务器自动停止。在独立模式下运行 WebSphere应用服务器需要其它步骤。 请参有关文档获得更多的详细信息。

6.启动和停止 WebSphere应用服务器

当启动 Web 服务器时WebSphere应用服务器自动启动。WebSphere应用服务器的管理器,是通过 Web 浏览器访问的,为查看和更改 WebSphere应用服务器的设置和性能提供了界面。请参阅定制配置设置。

如果将 WebSphere应用服务器 作为 Web 服务器的一部分运行,当关闭 Web 服务器时 WebSphere应用服务器 将自动停止。如果以独立模式运行,WebSphere应用服务器不会自动停止。如果使用 Apache Server 或 IBM HTTP 作为Web服务器, WebSphere应用服务器必须在独立模式下运行。

当在 Windows NT 上进程外运行 WebSphere应用服务器 时,停止 Web 服务器之后,请停止 WebSphere Servlet 服务以停止 WebSphere应用服务器。从开始 --> 设置 --> 控制面板 --> 中选择 WebSphere Servlet 服务,并按“停止”按钮。

7.安装的检查和故障寻找

要验证 WebSphere应用服务器已安装好并正确配置,可调用 WebSphere应用服务器提供的 snoop servlet。使用 Web 浏览器打开 servlet URL: http://your.server.name/servlet/snoop。Snoop Servlet 应回送客户机发送的 HTTP 请求及 servlet 的初始化参数。SnoopServlet 和其它 servlet 的代码位于<as_root>/servlets 目录。如果Servlet失败,请尝试下列步骤:

(1) 如果已通过手工编辑 .properties 文件或使用 WebSphere应用服务器的管理器界面更改了任何 WebSphere应用服务器的配置设置,请检查这些文件以确保未引入任何非法的或不正确的值。特别要检查<as_root> /properties/bootstrap.properties 文件。文档中心包含关于手工配置这些属性的资料和关于每一配置的可接受性及缺省值的讨论资料。

(2) 为Web 服务器打开本地日志和跟踪。找到 WebSphere应用服务器 bootstrap.properties 文件(在 <as_root> /properties 目录中)。设置 ose.trace.enabled 属性为true,设置 ose.trace.to.webserver 属性为true。停止 Web 服务器并重启动。记住如果 WebSphere应用服务器运行在独立模式,当停止 Web 服务器时它不会相应停止。检查 Web 服务器出错日志及 WebSphere应用服务器 <as_root>/logs 目录下的日志以查看错误。

(3) 启用调试控制台并重新启动 Web 服务器。WebSphere应用服务器的调试控制台为收集和查看跟踪及监控数据提供了集中场所。例如,从调试控制台,可以作为一组启动和停止列在收集和监控服务器数据中的监控程序。调试控制台的服务器控制台标签允许查看 servlet 的 stdout 和 stderr 流。缺省情况下,调试控制台未启用。启用该控制台。在 WebSphere应用服务器 debug.properties 文件中设置 debug.server.console.enabled 属性为true并重新启动 Web 服务器使得改动生效。或者,运行 http://your.server.name/servlet/DebugConsoleServlet,启用调试控制台。在 Windows NT 上,要成功地查看调试控制台,必须配置 Windows NT 以允许一个或多个服务与 Windows 桌面交互。如果使用作为 Windows NT 服务运行的 Web 服务器:
选择开始 --> 设置 --> 控制面板 --> 服务。
选择 Web 服务器相应的服务。
单击启动按钮。
在结果对话框中,选择允许服务与桌面交互的复选框。
重新启动 Web 服务器以使更改生效。

对于 Microsoft Internet Information Server,对与 Web 服务器相关的每个服务(如 Web 发布和 FTP 服务),执行以上过程。这些服务必须允许与 Windows NT 桌面交互。如果 WebSphere应用服务器运行时未启动任何 Web 服务器相关的进程,则为 WebSphere Servlet 服务执行以上过程,允许服务与桌面交互。

8.从版本 1.x 移植到版本 2.0

在安装 WebSphere应用服务器之后,通过下列步骤完成移植:

(1) 请检查用户 Servlet、领域、类、JavaServer 页面(JSP)和其它在第一部分的移植过程中保存的与编程相关的文件已经被安放在它们所属的 WebSphere应用服务器 版本 2.0 目录中。安装程序应已为您完成了这些步骤。如果已备份了您创建在 WebSphere应用服务器 安装中用户文件或目录,请将它们安放在现在的新安装处。

(2) 传输 jvm.properties 文件设置到 WebSphere应用服务器版本 2.0 bootstrap.properties 文件。
对于 WebSphere应用服务器 类路径,仅移植用户指定的 类路径部分到 bootstrap.properties 中 – 不要传输 JVM 库或 WebSphere应用服务器 版本 1.x .jar 文件路径,因为这些是 WebSphere应用服务器 版本 1.x 缺省配置的一部分,而您未曾自行设置过它们。换言之,只传输您添加的部分类路径。不要除去 WebSphere应用服务器 版本 2.0 缺省类路径;简单地加入 版本 1.x 项目即可。
对于 Java 库路径和路径,也只移动用户指定的部分。不要除去 WebSphere应用服务器 版本 2.0 缺省的库路径和路径设置;简单地加入 版本 1.x 项目即可。
对于其它属性,仅当它们有定义在 bootstrap.properties 中的对应者时才移植。

要使用 WebSphere应用服务器的管理器来管理在安装 WebSphere应用服务器之前已存在于 Web 服务器中的 Servlet,必须首先移植这些 Servlet。为了移植现有的 Servlet,将 Servlet 从它们目前的位置移动到 <as_root> \servlets 目录。WebSphere应用服务器 监控该目录并且当 Servlet 更改时自动重新装入 Servlet。如果有 Servlet 在其它目录中并且不想将它们移动到 <as_root> \servlets 目录,可使用管理器界面中 Java 引擎页面的“可重装 Servlet 类路径”字段来指定其余要监控的目录。使用 WebSphere应用服务器中的配置页面来重新配置以前的Servlet 参数。请参阅定制配置设置。

6.3 定制配置

本节介绍如何启动和使用 WebSphere应用服务器的管理器(一个图形界面)为 Servlet 活动和 WebSphere应用服务器的组件定制基本设置参数。

1.启动 WebSphere应用服务器的管理器

要启动 WebSphere应用服务器的管理器,在 Web 浏览器中输入 URL:http://your.server.name:9527/。其中 your.server.name 是主机的全限定名。注意:如果在安装了 WebSphere应用服务器的同一机器的浏览器中启动 WebSphere应用服务器的管理器,使用 http://localhost:9527/ 以获得更高性能。

管理器启动并显示登录页面。若是首次登录至管理器,请使用 admin 作为登录用户标识符和口令。单击“确定”。为安全起见,应该更改登录口令。要运行管理器,需要支持 Java 开发组件(JDK)1.1.6 的 appletviewer 或浏览器。请参阅准备安装 WebSphere应用服务器中的软件要求,查看选项。

2.使用 WebSphere应用服务器的管理器

管理器左边的浏览区域允许: 为不同 WebSphere应用服务器 组件定制设置、配置 Servlet 和设置别名及过滤、建立和维护安全性、收集和监控 WebSphere应用服务器、连接和 Servlet 数据。

(1) 定制基本属性

在使用 WebSphere应用服务器管理 Servlet 之前,请为 Servlet 活动和 WebSphere应用服务器的组件属性配置基本设置参数。在管理器浏览区域,单击“设置”显示可定制不同设置的项目页面。
管理页面:更改登录至管理器的用户标识符和口令,并为管理器指定新的端口号。
连接管理页面:设置连接缓冲池,从而减少用于维护与数据服务器(如 IBM DB2 关系数据库)的连接所花费的资源。
目录管理页面:为目录服务器指定设置,允许从 Web 服务器、操作系统、WebSphere应用服务器 及其它软件产品的中央位置管理安全性数据。
Java 引擎页面:指定 Java 编译器设置并指出 WebSphere应用服务器 是作为 Web 服务器一部分运行以获得较高性能,还是作为独立模式运行以获得更好安全性。
会话跟踪页面:指定维护用户会话(来自于相同浏览器的相关用户请求系列)的状态信息的设置。
用户简要表文件页面:指定维护关于 Web 站点访问者永久信息的设置。
虚拟主机页面:指定 Servlet 的替代路径,允许 Web 服务器根据 Servlet 请求期间客户机指定的不同域提供不同文档。

(2) 配置 Servlet、别名和过滤

放置在<as_root>\servlets 目录下的 servlet 在请求时自动装入和重新装入(如果更新过)。也可以使用 WebSphere应用服务器 管理器,通过初始化参数和创建 Servlet 别名和过滤更为直接地管理 Servlet。要管理 Servlet,单击管理浏览区域中的 Servlet 并选择页面:
配置页面:为个别 Servlet 定义配置信息和初始化参数,如关联的类文件,是否在启动时装入 Servlet 以及 Web 服务器是否从远程装入 servlet。
别名页面:指定路径映射规则,允许用户输入快捷 URL 来调用特定 servlet。
过滤页面:联系 Servlet 和 MIME-类型,从而每当生成一个特定的 MIME-类型响应时,调用一个特殊的 Servlet。

(3) 维护安全性

通过定义用户、组、资源和存取控制表建立和维护安全性。通过为每个用户、组和资源指定特定访问设置,可精确地控制如何使用服务的资源,及由谁使用。单击管理器浏览区域中的安全性显示这些页面::
用户页面:指定允许谁访问由 WebSphere应用服务器 提供的 Web 页面及其它资源,如 servlet。
组页面:将用户与命名列表相关联,允许同时对整个组赋予访问权限。
存取控制表页面:为用户和组指定访问许可。
资源页面:为特定目录、文件和 WebSphere应用服务器 上的 servlet 指定安全性参数。

(4) 收集和监控服务器数据

通过查看日志文件监控 Servlet 活动、已装入的 Servlet 的状态和资源的实时使用。单击监视器浏览区域中的“服务器执行分析”显示页面列表:

JVM 调试页面:启用 JVM 调试和指定调试设置。
事件页面(在日志文件下):监控事件日志中收集的信息 。
出错页面(在日志文件下):监控出错日志中收集的信息。
活动会话页面(在监控下):监控关于 Web 服务器上当前活动的用户会话的信息,包括关于个别会话的信息和所有活动会话的摘要信息。
数据库缓冲池连接页面(在监控下):监控连接缓冲池信息,包括关于缓冲池和个别连接的统计数字。
转储面板页面(在监控下):指定何时及在何处创建 Servlet 转储和活动快照。
异常情况状态(在监控下):监控来自于 Java 引擎和 servlet 的异常数据 。
已装入 Servlet 页面(在监控下):监控个别 servlet 的状态和统计数字。
日志输出页面(在监控下):查看事件或出错日志输出的记录。
资源使用页面(在监控下):监控服务资源如何被使用,包括内存、请求句柄对象缓冲池、服务请求和服务响应时间。
跟踪页面:监控跟踪数据,通常由 IBM 服务人员提出请求。
注销:要快速注销,单击管理器浏览区域中的“注销”,返回管理器登录屏幕。

6.4 部署Servlet

在WebSphere应用服务器上部署 Servlet需要四个步骤:编译 Servlet 或 Web 应用程序、将类文件放到 WebSphere应用服务器上、将相关的 HTML、JSP 和 SHTML 文件放到WebSphere应用服务器上、用WebSphere应用服务器的管理器来配置初始化参数,并设置其它选项。

1.编译 Servlet 和 Web 应用程序

编译 Servlet,有下列注意事项:

(1) 确保系统 CLASSPATH 环境变量中包括 JDK classes.zip 文件和相应的 WebSphere应用服务器 JAR 文件。 lib 目录中有几个 WebSphere应用服务器 JAR 文件。根据所需导入的类的不同,可能还需要将那些未列在该示例中的 JAR 文件包括在内:

如果使用的是 Windows NT,请分别输入下列命令(在同一行中):
set CLASSPATH=.;JAVA_HOME\lib\classes.zip;applicationserver_root\lib\ibmwebas.jar;applicationserver_root\lib\jst.jar;applicationserver_root\lib\jsdk.jar;applicationserver_root\lib\xml4j.jar;applicationserver_root\lib\databeans.jar;%CLASSPATH%

(2) 用下列命令将 PATH 环境变量设置成包括 java/bin 目录的变量:

对于 Windows NT,该命令为:
set PATH=JAVA_HOME\bin;%PATH%

(3) 通过发出下列命令来测试相应的 Java Development Kit (JDK) 是否在路径中:
java -version

该命令应该返回 JDK 版本的状态消息。

(4) 通过发出下列命令来编译 Servlet
javac filename.java

2.将类文件放到 WebSphere应用服务器上

缺省情况下,WebSphere应用服务器在 Servlet 根目录 applicationserver_root\servlets 下查找 Servlet 类文件。请将编译过的 Servlet 类文件复制到该目录下。要从替代 Servlet 目录中装入 Servlet,请配置可重装 Servlet 目录。要从远程系统中装入 Servlet,请在用 WebSphere应用服务器的管理器配置 Servlet 时,指定该远程系统。

(1) 如果 Servlet 在软件包中,则将软件包结构镜像成 servlet\ 或可重装 Servlet 目录下的子目录。例如,如果 Servlet SignonServlet.class 和 AccountBean.class 在名为 WebBank 中的软件包中,请将 Servlet 放在目录 servlet\WebBank下。

(2) 如果 Servlet 导入您所开发的非 Servlet 类,建议将那些类复制到 applicationserver_root\servlets 下。

根据jvm.properties 文件中的设置,将决定所有的 Servlet 标准输出是到 applicationserver_root\logs\ncf.log 文件还是 Java 控制台窗口。请参阅 启用 Java 控制台中的有关的说明。

3.将HTML、JSP和SHMTL文件放到WebSphere应用服务器上

将与Servlet有关的HTML、JSP 和 SHMTL文件复制到 Web 服务器的 HTML 文档根目录 server_root\HTML_directory 下。该目录是由特定服务器配置(传递、别名和虚拟主机规则的设置)所决定的。

4.配置 Servlet

若要从远程系统上的 JAR 或 SER 文件装入 Servlet,或设置初始化参数,请使用 WebSphere应用服务器的管理器来配置 Servlet 或使用XML Servlet 配置。

6.5 连接管理器

连接管理器使您可以控制并减少由 Web 应用程序使用的资源。相对于非 Web 应用程序,基于 Web 的应用程序对数据服务器的访问会导致更高的和不可预料的系统开销,这是由于 Web 用户更为频繁的连接和断开。通常连接与断开连接所用的资源大于交互所用的资源。由于 Internet 的“冲浪”性质,用户的交互过程一般都较短。通常,公司外(Internet,而非 intranet)的用户会将使用卷变得很大,并难以预料。连接管理器通过建立用户 Servlet 可用的连接缓冲池将连接的系统开销分摊给多个用户请求。换言之,每个用户请求仅占用连接/断开连接所用系统开销成本的一小部分。在使用初始资源建立缓冲池中的连接后,其余连接/断开连接所用的系统开销就不大了,因为这只是重复使用已有的连接而已。

Servlet 以如下方式使用连接缓冲池:当一个用户通过 Web 向 Servlet 请求时, Servlet 从缓冲池使用一个已有的连接,这意味着用户请求不会引起数据服务器的连接系统开销。当满足请求时,Servlet 将连接返回至连接管理器缓冲池供其它 Servlet 使用。因而用户请求不会引起数据服务器的断开连接的系统开销。

连接管理器还使您能控制到数据服务器产品的并发连接数。当数据服务器的许可证协议限定用户数量时,这一特性是非常有用的。可以为数据服务器创建一个缓冲池,并将连接管理器缓冲池的“最多连接数”参数设成数据服务器产品许可证中限定的最大用户数。如果用其它程序而不用连接管理器连接到数据服务器,则不能保证该方法有效。

1. 连接管理器结构

连接管理器维护一个连接到特定数据服务器产品处于打开状态的数据服务器缓冲池。每个数据服务器可以有一个或多个等同的或非等同的缓冲池。连接管理器的一个运行实例可以支持多个数据服务器。图6-1说明了在连接管理器与一个正在连接管理器的连接缓冲池中寻找可使用的连接的 Servlet 之间的典型交互作用。

(1) 当第一个 Servlet 试图与连接管理器通信时,由WebSphere应用服务器装入运行在WebSphere应用服务器下的连接管理器。只要WebSphere应用服务器在运行,连接管理器就一直被装入。
(2) WebSphere应用服务器将用户请求传递给一个 Servlet。
(3) Servlet 用连接管理器使用的方法从缓冲池中请求一个连接。
(4) 缓冲池给 Servlet 分配一个连接。
(5) Servlet 使用连接与数据服务器直接对话,这一过程中使用的是特定数据服务器的标准 API。
(6) 数据服务器通过与 Servlet 的连接返回数据。
(7) 当 Servlet 结束与数据服务器通信时,Servlet 把连接归还给连接管理器缓冲池,以供其它 Servlet 使用。
(8) Servlet 通过WebSphere应用服务器向用户发回响应。

在 Servlet 请求一个连接时,缓冲池中不一定有可用的连接。在这种情况下,连接管理器直接与数据服务器通信。连接管理器将:
请求一个新的连接(参见图6-1中的9 )。
将连接添加到缓冲池中(参见图6-1中的10)。如果缓冲池中的连接数达到了规定的上限,连接服务器将不会把新的连接加入缓冲池中。
将新的连接交给 Servlet(参见图6-1中的4)。

2.性能特性

为缓冲池创建一个新的连接是一项系统开销很高的任务,新的连接将使用数据服务器上的资源。因此连接管理器尽量用缓冲池中的现有连接来满足 Servlet 的请求。 同时,连接管理器必须尽可能地最小化缓冲池中的空闲连接,因为这是对系统资源的极大浪费。连接管理器与 Servlet 一同执行这些最小化和最大化任务。对于可选的性能,请适当地设置连接管理器参数。
图6-1:连接管理器与Servlet 之间的交互

连接管理器维护每个连接的验证时间标记、最近使用时间标记和正在使用标志。当某个 Servlet 第一次获得连接时,连接的验证时间标记和最近使用时间标记被设置为当前时间,连接的正在使用标志则被设置为真。

可将连接服务器配置成从某个 Servlet 中移走一个长时间未使用的连接。这个时间长度是由连接管理器的 “最长周期”参数指定的。如果 Servlet 准备在较长一段时期内使用连接与数据服务器多次通信,可能希望将代码加入 Servlet 中,以便在每次使用连接之前,确认它仍占有这个连接。连接管理器从缓冲池中除去空闲的连接,因为它们会浪费资源。为了确定哪个连接是空闲的,连接管理器将检查连接标志和时间标记,这个操作是通过周期性地获取连接缓冲池信息来实现的:

(1) 连接管理器查看正在使用连接的最近使用时间标记。如果最近使用时间和当前时间之间的时间差大于“最长周期” 配置参数,则本连接将被认为是一个残留连接,这就表明占有它的 Servlet 已终止或者没有响应。残留连接将被归还给缓冲池以供其它 Servlet 使用,它的正在使用标志被设置为假,且验证和最近使用时间标记被设置为当前时间。

(2) 连接管理器检查未被任何 Servlet 使用的连接(这些连接的正在使用标志为假)。如果最近使用时间与当前时间的时间差超过了“最长空闲时间”配置参数,将认为本连接是空闲的。空闲连接将被从缓冲池中除去,降至“最少连接数”配置参数指定的较低限定值。

3.监控连接管理器

WebSphere应用服务器管理器为名为数据库缓冲池连接的连接管理器提供了一个监控程序。可以使用这些信息来查看如何执行连接缓冲池,并建议对连接缓冲池参数进行可能的更改。可以在更改参数之后对缓冲池执行监控,从而查看缓冲池特性的更改并帮助进一步对缓冲池参数进行调整。可以选择特定缓冲池,以从选择列表中对其进行监控。

6.6 用户简要表

Application Server 含有 com.ibm.servlet.personalization.userprofile 软件包中的类,这些类使维护关于 Web 站点访问者的持久信息和利用这些信息来定制 Web 页面变得更为容易。UserProfile 类包括了访问者的完整名称、邮政地址和电子邮件地址、电话号码等数据成员,并含有用于存储所选的语言、职业和用户定义的组信息的字段。另外,它还含有类属信息、购物手推车和剪贴板(一个 Java 散列表)。这就使您很容易地将其它您选择的对象合并到这些数据中,并将它们作为 UserProfile 类的一部分进行处理。因为这些对象在用户简要表文件的后继实例一直存在,所以它们必须是可串行化的。如果使用了一个 JDBC 数据库,则会将对象存储在数据库中。否则,会将对象作为文件存储。在 Application Server 版本 2.0 中,UserProfile 类使用了数据库连接管理器来维护 JDBC 连接。

可以使用“用户简要表文件”页面配置 UserProfile 类,该类用于定义和维护有关 Web 站点访问者的信息。UserProfile 类使用连接管理器来维护与 JDBC-从属数据库的连接。用户简要表文件的基本设置如下。

1.启用用户简要表文件

(1) 查看“设置” -> “用户简要表文件”页面。
(2) 单击“启用”标签。
(3) 在“是否使用用户简要表文件?”字段中单击“是”。
(4) 对于“类名”字段,可以使用缺省值“com.ibm.servlet.personalization.userprofile.UserProfile” 或为 UserProfile 类创建的扩展名。
(5) 单击“保存”按钮。

2.指定数据库信息

(1) 查看“设置” -> “用户简要表文件”页面。
(2) 单击“数据库”标签。
(3) 指定数据库产品的名称(如 IBM DB2 的 db2)。
(4) 指定数据库的 JDBC 驱动程序(如 COM.ibm.db2.jdbc.app.DB2Driver)。注意:这包括 Application Server 的 Java 类路径中的驱动程序 .zip 或 .jar 文件(如 DB2 的 db2java.zip)。
(5) 指定用户简要表文件的数据库名称以存储数据。如果不存在该数据库,将不会创建它。因此,可以指定现有数据库的名称,或在使用该用户简要表文件之前用该名称创建一个数据库。无需在数据库中创建任何表格。
(6) 指定数据库的所有者,即创建数据库的用户的标识符。
(7) 指定保存用户简要表文件数据的数据库表格的名称。无需创建该表格,因为 UserProfile 类会在初始化时创建它。
(8) 指定用于访问数据库和其表格的用户标识符。
(9) 指定与用户标识符相关的口令。
(10) 单击“保存”按钮。

3.配置连接管理属性

(1) 查看“设置” -> “用户简要表文件”页面。
(2) 单击“连接管理”标签。
(3) 指定要使用的连接缓冲池。
(4) 指定在“连接超时”指定的时间过后,连接仍不可用的情况下,指定是否等待并再试一次连接(与“连接管理”页面中相同)。
(5) 单击“保存”按钮。

UserProfile 类和 Application Server 的其余部分之间的唯一的耦合在于,UserProfile 类和 IBM 的会话实现( IBMSessionData)含有同一个用户名称段,该用户名称段可用于在两个类之间创建一些增效作用。用户简要表文件对象持有关于用户的信息,并通过唯一的用户名与用户的 HttpSession 对象相关联。用户名的值由 SessionData类getUserName() 和 setUserName() 方法设置并返回。

也可以扩展 UserProfile 类以创建一个更适合业务需求的子类,并用 Application Server 管理器指定专门 UserProfile 子类,该子类可用于所有的 Web 应用程序。

6.7会话跟踪

Web应用服务器具有会话跟踪(即跟踪用户请求)的功能。使用管理器的“会话跟踪”页面配置会话跟踪。会话跟踪程序可将同一用户的几个相关请求合并为单个会话(即一个 HttpSession对象)。会话跟踪程序也能使Web应用服务器的多个实例能共享会话的一个公共缓冲池(即一个会话群集器)。

1.启用会话跟踪及其部件

查看 “会话跟踪”页面。单击“启用”标签。在“启用”标签中可以设置如下字段。

(1) 启用会话:是否启用会话跟踪, 即请求和响应对象的相关会话方式是否有效。缺省值为是。
(2) 启用 URL 重写:指会话跟踪是否启用重写 URL 来获取会话标识符。若被启用,则会话跟踪程序将识别到达 URL 的会话标识符,若有必要的话,还将重写 URL 和发送该会话标识符。缺省值为。
(3) 启用 Cookie:指会话跟踪是否使用 cookie 来携带会话标识符。若为“是”,则会话跟踪程序将识别作为 cookie 到达的会话标识符,并用 cookie 作为发送会话标识符的方式。缺省值为是。
(4) 启用协议转换重写:当 URL 要求从 HTTP 转换成 HTTPS,或从 HTTPS 转换成 HTTP 时,是否将会话标识符添加到 URL 中。缺省值为否。

2.创建携带会话标识符的 Cookie

指定 Cookie 的设置,会话跟踪程序使用该 Cookie 将相关的个别请求置入逻辑用户会话中。当 Servlet 请求一个 HttpSession 对象表示一个用户会话时,会话跟踪程序可以使用一个 Cookie 将唯一的会话标识符传回给发出请求的浏览器。当 Servlet 发出后继请求时,Cookie 则获准在 Servlet 和会话跟踪程序间的往返传送。会话跟踪程序使用它来查找用户 Servlet 的现有 HttpSession 对象。换而言之,会话跟踪程序使用 Cookie 中的标识符确定该请求与该用户的其它请求相关。

查看 “会话跟踪”页面。单击“Cookie”标签。指定 Cookie 的名称,缺省值为sesessionid。可选地指定下列字段:

(1) “域”字段的值以限制 Cookie 的发送位置。
(2) 会话 Cookie 在客户机浏览器上的活动时间(即“最长周期”字段,以毫秒计)。如果该字段为空,则当关闭浏览器时将删除该 Cookie。
(3) “路径”字段的值以指定 Cookie 发送所至的服务器路径。
(4) 在“安全”字段中单击“是”以限制仅允许 HTTPS 会话的 Cookie 进行交换。

3.设置会话跟踪活动的时限和参数

查看“会话跟踪”页面。单击“间隔”标签。

(1) 指定会话跟踪程序检查会话是否空闲及估计会话是否无效的时间间隔(以毫秒计)。
(2) 指定会话跟踪程序估计是否因为内存中会话过多,而将会话交换到磁盘的频率(以毫秒计)。
(3) 指定一次允许保留在内存中的会话数(最多驻留数)。
(4) 指定一个会话将允许在会话跟踪程序停止验证之前保持空闲的时间(以毫秒计)。

4.保留持续数据

使用“持续性”标签指定在会话跟踪程序关闭重新并启动后,以验证会话数据是否交换到磁盘。如果“持续性”字段设置为否,则会话跟踪程序将在每次启动时删除旧的会话交换文件。查看“会话跟踪”页面。单击“持续性”标签。在“持续性”字段中单击“是”。指定会话跟踪程序用于存储要保持持续性的会话数据。注意:交换目录必须是一个空目录。

5.指定会话群集和协议转换设置

可以将WebSphere应用服务器配置成以如下方式运行:独立主机、会话群集服务器、会话群集客户机、协议转换主机、独立主机。查看“会话跟踪”页面,单击“主机”标签。

(1) 若WebSphere应用服务器实例为一个独立主机,则它不参与会话群集。在独立模式下, WebSphere应用服务器将维护它自己的会话信息,而对客户的会话信息请求将不予响应,并且不从服务器请求会话信息。缺省值:是。
(2) 在用如 IBM eNetwork Dispatcher 之类的产品群集 Web 服务器的环境中,指定WebSphere应用服务器实例的主机名和 IP 地址,其中该实例为会话群集服务器。
(3) 若将WebSphere应用服务器实例配置成 URL 重写和协议转换(在“启用会话跟踪”标签中),则指明群集主机的主机名或 IP 地址。例如,可能为 IBM eNetwork Dispatcher 主机。

要使更改生效,请在更改“独立主机”或“会话群集服务器”字段后,重新启动Web应用服务器。更改这些字段后对所有配置所做的更改都保存在配置文件中,直至重新启动后方才生效。

6.8 安全性

WebSphere应用服务器具有很好的安全性支持。安全性简单地说就是确定谁可访问重要的系统资源,这些系统资源包括文件、目录、程序、连接和数据库。以独立模式运行WebSphere应用服务器比作为 Web 服务器的一部分运行具有更高的安全性。如果安全性要求超出了 Web 服务器提供的安全性,那么请以独立模式运行WebSphere应用服务器。下面介绍使用存取控制表保护资源、选择认证方案和协议、在WebSphere应用服务器中使用目录服务。

1.使用存取控制表保护资源

建立了一个设置安全性的基本过程。

与安全性相关的概念包括用户、组、资源、许可权、领域、和存取控制表(ACL),这些安全性概念是紧密相关的,现说明如下:

(1) 用户:一个可被 Web 服务器认证的身份。用户可以是人也可以是计算机。
(2) 组:用户的集合。组提供了一个管理大量的用户的有效方法,这是因为管理员可以一次指定一个组的许可权。通常,组成员之间有一些共同特征。例如,一个公司中可能包括一个由管理级雇员组成的组,和另一个由非管理级雇员组成的组。其中,可能对非管理级用户赋予查看销售数据文件的访问权,而对管理级用户赋予查看和编辑销售数据文件的访问权。可以将一个人定义成单个用户,同时也将其定义成组的成员。例如,个人 Amy 可能代表单个用户 amy,也可能代表组 managers 的成员。
(3) 资源:通过 Web 服务器进行存取的有价资源包括HTML 文件和目录(Web 页面)、其它文件和目录(如FTP文件)、Web 应用程序(Java Servlet 或 CGI 程序),而通过WebSphere应用服务器进行存取的资源包括Java Servlet、启用访问企业资源和应用程序(如数据库)的定制 Servlet、连接、套接字、文件和其它可由 Servlet 使用的资源。
(4) 许可权:许可权表示请求访问资源的特权。管理员可通过建立存取控制表向用户和组授予许可权,以保护资源。许可权是与特定的资源相关的。想象一下,如果一个用户具有查看文件 A 和修改文件 B 的许可权。那么该用户不能用修改文件 B 的许可权来修改文件 A。每个许可权仅适用于特定的资源,且不能传递。单个用户的许可权优先于组的许可权。例如,如果用户 amy 对文件具有读、写权,但同时 amy 所属的组对该文件仅有读取权,那么 amy 仍对该文件具有读、写权,这是因为单个用户的许可权将覆盖具有更多限定的组许可权。(即使组的许可权限制性低于单个用户的许可权,但用户的许可权仍将覆盖组的许可权)。
(5) 领域:领域是用户、组和存取控制表的数据库。为了使用户能访问领域中的资源,必须在该领域中定义需访问资源的用户。一个用户可以属于几个领域,但在同一领域中用户标识符不能重复。例如,用户 amy 可属于 fileRealm 和 anyRealm 领域。但每个领域中仅可包含一个名为 amy 的用户。可在每个领域中赋予用户 amy 访问不同资源的不同许可权。
(6) 存取控制表:与资源关联的存取控制表指定了领域中的哪些用户和组可以访问资源。

存取控制表(ACL)、领域和资源的关系如下:
一个领域可以包含许多 ACL。
一个领域可以包含许多资源。
一个 ACL 可以仅属于一个领域。
一个资源可以仅属于一个领域。
一个资源仅与一个 ACL 相关。
一个 ACL 可与许多资源相关。

WebSphere应用服务器附带了一些前期建立的领域:
defaultRealm 定义了用户如何访问本地定义的资源。也可建立存取控制表,以确定哪些用户和组对哪些资源具有访问权。
NT 领域(NTRealm)和UNIX领域(UnixRealm)定义了在操作系统中拥有帐户的用户如何使用WebSphere应用服务器资源。 操作系统中定义的用户可由WebSphere应用服务器共享。只要他们存在于下层系统中,这种共享就一直存在。WebSphere应用服务器管理器界面使您能查看该领域;但若要更改它,必须使用操作系统所提供的设施。目前,WebSphere应用服务器可以共享操作系统定义的用户,但不能共享组。
servletMgrRealm 定义了 Servlet 如何访问远程定义的资源,如远程装入的 Servlet。 servletACL 是该领域中的唯一一张存取控制表。当远程装入且带有数字签名的 Servlet 试图访问一个受保护的资源时,将对 Servlet 中的数字证书与 servletMgrRealm 中与用户关联的数字证书进行比较。 servletACL 定义了是否授予或拒绝许可权。例如,假设用户 X 的数字证书封装在 anyServlet.JAR 文件中。如果用户 X 被添加在 servletMgrRealm 中,则所有包含与该用户相同数字证书的 Servlet (anyServlet.JAR 文件中)可以执行和访问赋予该用户的资源。
最后,如果在WebSphere应用服务器管理器的“目录管理”页面中启用目录服务,将显示LDAPRealm。WebSphere应用服务器可以共享定义在目录服务中的用户和组,且这种共享将一直持续下去,直至除去他们或禁用目录管理支持。WebSphere应用服务器管理器界面使您能查看该领域;但若要对它进行更改,必须使用 LDAP 服务器所提供的设施。如需更多有关 LDAP、目录服务和 LDAPRealm 的信息,请参阅有关使用目录服务的文档。

WebSphere应用服务器使您能设置各种许可权。例如,其中包括发送和接收文件、删除文件、读取和写入文件、装入 Servlet、链接至库文件、打开和侦听套接字等许可权。某些情况下,服务不需要其客户存在于存取控制表中。例如,许多 Web 页面(HTTP)服务向所有用户公开其文档,而不要求他们在存取控制表中进行注册。

可通过为每个资源在单个领域中建立单个存取控制表(ACL)来保护该资源(下面将进行讨论)。 ACL 将指定可以访问或修改资源的用户或组。对于要保护的每个资源,需要指定存取控制表、安全性领域、认证方案(用来验证访问资源的用户的方法)。下面介绍实现安全性的一个示例。

使用各种管理器页面,以用存取控制表来建立安全性的基本步骤显示如下。

(1) 定义用户。

使用“安全性”-> 使用“用户”页面来定义用户,即定义被允许访问资源的个人和计算机。例如,定义名为 bopeep 的用户:

选择 defaultRealm。
单击页面左上部的“添加”按钮。
输入用户名 bopeep。
输入口令 sheep。再一次输入该口令以进行验证。
单击“确定”按钮。
验证 bopeep 显示在“定义的用户”列表中。

(2) 可选地定义组

使用“安全性”-> 使用“组”页面来定义用户所属的组,以使管理更加容易。首先,选择一个领域。下一步,选择将组添加到该领域中。可以用您喜欢的名称来命名组,然后将用户从非成员状态转换为成员状态。例如,将用户 bopeep 添加到组 mypeeps 中:
选择 defaultRealm。
单击页面左上部的“添加”按钮。
输入组名 mypeeps。
在“非成员”列表中选择用户 bopeep。
单击“非成员”列表旁的“添加”按钮。
验证 bopeep 已转换到成员框中。

(3) 创建 ACL

使用“安全性”-> 使用“存取控制表”页面来创建 ACL。例如,创建名为 sheepcontrol 的 ACL:
单击定义“定义的存取控制表”列表旁的“添加”按钮。
输入 ACL 名称 sheepcontrol。
单击“确定”按钮。

(4) 定义资源

使用“安全性”-> 使用“资源”页面以将要保护的资源添加到领域中。(注意:必须在执行“创建 ACL”步骤后才能执行该步骤,这是因为必须指定新资源所属的 ACL)。例如,将 CheckMessage Servlet 添加到领域 defaultRealm 中的 sheepcontrol ACL 中:
选择 defaultRealm。
单击“添加”按钮。
选择基本方案作为认证方案。(“方案”选项将在下文中讨论)。
选择 sheepcontrol ACL。
选择 Servlet,并指定 CheckMessage Servlet。
单击“确定”按钮。
验证 CheckMessage 现已作为 ACL sheepcontrol 的资源列示出来。

(5) 赋予许可权

返回 ACL 并赋予用户、组和计算机访问 ACL 资源的许可权。例如,赋予 bopeep具有 GET 和 PUT 许可权,以使它可以访问领域 defaultRealm 中sheepcontrol ACL的文件和文件夹:
确保已在“定义的存取控制表”列表框中选定 sheepcontrol。
单击页面底部“主许可权”字段旁的“添加”按钮。
当显示“在 defaultRealm 中的 ACL sheepcontrol 添加许可权”框时,单击“文件与文件夹”。
下一步,选择许可权选项为 bopeep。由于 bopeep 是一个用户,所以单击“用户”。在列表中选择bopeep。(注意,如果选择的是“组”,则将看到“主名”列表中的组 mypeeps)。
使用复选框赋予 bopeep具有 GET 和 PUT 许可权。
单击“确定”按钮。
通过查看“主许可权”框来验证 bopeep 具有正确的许可权。如果没有显示许可权,请单击 bopeep 左边的加号。这时将显示一个列表,该列表显示了 bopeep 的许可权。

2.选择认证方案和协议

首先讨论的是认证协议,即 HTTP 和 HTTPS。接下来将会讨论的是认证方案,即基本、摘要、定制和证书认证。最后讨论的是有关组合方案和协议的策略。

(1) 关于认证协议

HTTPS 则是 HTTP 和 SSL 协议的组合。SSL(安全套接字层)是一个网络安全协议,它用来提供服务器和客户机之间必要的安全性。如果选择 HTTP,认证数据的接收无任何保护。如果选择 HTTPS,认证数据在每个 SSL 协议中加密。如果要使用证书认证,那么必须使用 HTTPS。

(2) 关于认证方案

WebSphere应用服务器支持的认证方案包括基本认证、摘要认证、定制认证、证书认证。
基本认证:使用 HTTP 或 HTTPS 请求来自客户机的用户名和口令。 用普通文本将用于验证的信息发送给服务器验证。所有浏览器都支持基本认证。如果一个用户标识符和口令提供了足够的认证,那么请考虑使用基本认证。
摘要认证:使用 HTTP 或 HTTPS 请求来自客户机的用户名和口令。将用于验证的用户名和口令的加密形式(使用摘要)发送给服务器。并非所有浏览器都支持摘要认证。(当前仅 Sun HotJava 浏览器支持该认证方案)。如果浏览器不支持摘要认证,那么其用户将无法访问由该协议进行保护的资源。
定制认证:使用 HTTP 或 HTTPS 来请求使用 HTML 格式定制的客户机信息。由 CGI 和 Servlet 将这些用于验证的信息用普通文本发送到服务器上。当需要除了标识符和口令之外的用户认证时,可使用定制认证。例如,可以请求一个社会安全号的用户认证。使用该协议,可建立 HTML 格式以询问用户数据。认证是由服务器端代码(CGI 和 Servlet)执行的,而不是由 IBM WebSphere应用服务器运行时应用程序执行的。如果使用定制认证,请使用 HTTPS 保护数据。
证书认证:使用 HTTPS 以请求一个客户机证书。必须启用 SSL 客户机认证选项。将用于验证的信息发送给服务器。认证使用的数字证书具有很高的安全性,且证书认证通常对用户是透明的。系统或站点管理员会对客户机证书进行管理。通常这些任务是由证书权威服务器软件授权的,例如 IBM Vault Registry 产品。

(3) 组合认证方案和协议

正如前述,除非是在一个与安全无关的环境中,否则 HTTPS 通常更为可取。对于不同的安全性要求可以对方案和协议进行组合,策略如下:
对于基本安全性要求,使用基本、摘要或 HTTP 上的定制认证。
对于较高安全性要求,使用基本、摘要或 HTTPS 上的定制认证。
对于最高安全性要求,使用 HTTPS 上的证书认证。

3.使用目录服务

一个目录服务是信息仓库、存取法和相关服务的组合。信息仓库通常是用于存储位置信息和其它有关资源(例如用户、打印机、文件服务器和WebSphere应用服务器)的详细信息的数据库。存取法是指轻量级目录访问协议(LDAP)或其它可用来与目录服务组件进行通信的存取法。相关服务是指目录服务提供的用于查询、操纵和认证数据库中信息的设施。

对集中式安全性数据通常需要使用目录服务。目录服务可以为整个网络提供单个管理点。使用目录服务,可以一次定义用于所有应用程序(包括WebSphere应用服务器)的用户和组,而无需为每个应用程序分别定义用户和组。目录服务对于实现安全性很有帮助,即通过认证用户和控制对资源的访问。没有目录服务,可能必须为不同的软件产品(例如WebSphere应用服务器、Web 服务器和操作系统)重复定义相同的用户和组,这是因为这些软件产品不共享安全性数据。

WebSphere应用服务器版本 2.0 支持使用轻量级目录访问协议(LDAP)V2 的目录服务。这些目录服务包括 Domino Directory 版本 4.6.x 和 Netscape Directory Server 版本 3.x。WebSphere应用服务器版本 2.02 (本地语言版本)也支持 IBM Suites(不包括 IBM Suites 版本 1.0)的 eNetwork Directory 组件。使用目录服务的基本步骤如下:

(1) 设置目录服务,或使用一个现有的目录服务。
(2) 使用WebSphere应用服务器的管理器界面的“目录管理” 页面,以标识至WebSphere应用服务器的目录服务,并指定基本设置。
(3) 查看管理器中的目录服务用户和组信息。
(4) 在WebSphere应用服务器中定义存取控制表(或已有的 ACL),以利用目录服务用户和组信息。
(5) 用 ACL 保护WebSphere应用服务器资源。

使用“目录管理” 页面指定目录服务的步骤如下:
查看“设置” -> “目录管理”页面。
在“配置”标签中,请在“是否启用目录?”字段中单击“是”
使用下拉列表选择目录类型。选择:
· ¾“netscape”使用 Netscape Directory Server;
· ¾ “domino4.6”使用 Domino Server;
· ¾ “enetworkibmsuite”使用 IBM Suite 的 eNetwork Directory Server 组件。
输入驻留目录服务的计算机主机名。
输入服务的端口号。
输入将作为目录服务的 LDAP 搜索起始点的基本分辨名(Base DN)。例如,o=raleigh.ibm.com.
可选功能。输入联编分辨名和联编口令。这些字段空白表示WebSphere应用服务器匿名联编目录服务。如果指定了联编分辨名和口令,则请确认将目录服务配置成使用同一分辨名和口令来认证WebSphere应用服务器,否则认证将告失败。

当使用“目录管理”指定目录服务时,管理器将提供的功能有:
动态地建立、初始化和维护与 LDAP 目录服务相关联的 ldapRealm。
使用管理器的“安全性”页面关联WebSphere应用服务器资源和 ldapRealm。
将WebSphere应用服务器存取控制表(ACL)与 ldapRealm 的资源关联起来。

IdapRealm 是一个包含已定义在目录服务中的用户和组的WebSphere应用服务器安全性领域。可以使用WebSphere应用服务器的管理器界面的“安全性”页面,以建立存取控制表和 IdapRealm 之间的关联。 ldapRealm 对资源进行保护,并且存取控制表允许属于该领域的用户和组(在这种情况下,用户和组在目录服务中)访问资源。

ldapRealm 使用非 SSL LDAP V2 协议来与目录服务进行通信,并根据在“目录管理”页面中指定的设置进行联编。当受 IdapRealm 保护的WebSphere应用服务器资源需要认证时,将根据IdapRealm 来验证客户机的用户标识符和口令。该过程如下:
客户机向WebSphere应用服务器发出 Servlet 请求。
WebSphere应用服务器确定请求的资源是否受 ACL 保护。
因此WebSphere应用服务器将一个认证要求发送给客户机。
客户机输入用户标识符和口令。
目录服务验证用户标识符和口令与保护资源的 IdapRealm 是否相符合:目录服务发出 LDAP 查找,以查找与指定用户标识符相符的人。为该用户创建一个分辨名(DN)。
目录服务使用该用户分辨名和口令执行一个 LDAP 连接。
当目录服务认证用户后,WebSphere应用服务器Java 引擎将调用 Servlet 以处理与客户机获得的许可权一致的客户机请求。

可以通过访问ldap://act:389/o=raleigh.ibm.com来测试目录服务是否正在运行,其中:act 是运行目录服务的机器的主机名,389 是服务的端口号,o=raleigh.ibm.com 是基本分辨名,它还代表了目录服务中的搜索起始点。

...... [阅读全文]

4.1 Servlet简介

1.Servlet 是什么?

Servlet是使用Java Servlet 应用程序设计接口(API)及相关类和方法的 Java 程序。除了 Java Servlet API,Servlet 还可以使用用以扩展和添加到 API 的 Java 类软件包。Servlet 在启用 Java 的 Web 服务器上或应用服务器上运行并扩展了该服务器的能力。Java servlet对于Web服务器就好象Java applet对于Web浏览器。Servlet装入Web服务器并在Web服务器内执行,而applet装入Web浏览器并在Web浏览器内执行。Java Servlet API 定义了一个servlet 和Java使能的服务器之间的一个标准接口,这使得Servlets具有跨服务器平台的特性。

Servlet 通过创建一个框架来扩展服务器的能力,以提供在 Web 上进行请求和响应服务。当客户机发送请求至服务器时,服务器可以将请求信息发送给 Servlet,并让 Servlet 建立起服务器返回给客户机的响应。 当启动 Web 服务器或客户机第一次请求服务时,可以自动装入 Servlet。装入后, Servlet 继续运行直到其它客户机发出请求。Servlet 的功能涉及范围很广。例如,Servlet 可完成如下功能:

(1) 创建并返回一个包含基于客户请求性质的动态内容的完整的 HTML页面。
(2) 创建可嵌入到现有 HTML 页面中的一部分 HTML 页面(HTML 片段)。
(3) 与其它服务器资源(包括数据库和基于 Java 的应用程序)进行通信。
(4) 用多个客户机处理连接,接收多个客户机的输入,并将结果广播到多个客户机上。例如,Servlet 可以是多参与者的游戏服务器。
(5) 当允许在单连接方式下传送数据的情况下,在浏览器上打开服务器至applet的新连接,并将该连接保持在打开状态。当允许客户机和服务器简单、高效地执行会话的情况下,applet也可以启动客户浏览器和服务器之间的连接。可以通过定制协议或标准(如 IIOP)进行通信。
(6) 对特殊的处理采用 MIME 类型过滤数据,例如图像转换和服务器端包括(SSI)。
(7) 将定制的处理提供给所有服务器的标准例行程序。例如,Servlet 可以修改如何认证用户。

2.Servlet 的生命周期

Servlet 的生命周期始于将它装入 Web 服务器的内存时,并在终止或重新装入 Servlet 时结束。

(1) 初始化

在下列时刻装入 Servlet:
=如果已配置自动装入选项,则在启动服务器时自动装入
=在服务器启动后,客户机首次向 Servlet 发出请求时
=重新装入 Servlet 时

装入 Servlet 后,服务器创建一个 Servlet 实例并且调用 Servlet 的 init() 方法。在初始化阶段,Servlet 初始化参数被传递给 Servlet 配置对象。

(2) 请求处理

对于到达服务器的客户机请求,服务器创建特定于请求的一个“请求”对象和一个“响应”对象。服务器调用 Servlet 的 service() 方法,该方法用于传递“请求”和“响应”对象。service() 方法从“请求”对象获得请求信息、处理该请求并用“响应”对象的方法以将响应传回客户机。service() 方法可以调用其它方法来处理请求,例如 doGet()、doPost() 或其它的方法。

(3) 终止

当服务器不再需要 Servlet, 或重新装入 Servlet 的新实例时,服务器会调用 Servlet 的 destroy() 方法。

3.Java Servlet API

Java Servlet 开发工具(JSDK)提供了多个软件包,在编写 Servlet 时需要用到这些软件包。其中包括两个用于所有 Servlet 的基本软件包:javax.servlet 和 javax.servlet.http。可从sun公司的Web站点下载 Java Servlet 开发工具。 下面主要介绍javax.servlet.http提供的HTTP Servlet应用编程接口。

HTTP Servlet 使用一个 HTML 表格来发送和接收数据。要创建一个 HTTP Servlet,请扩展 HttpServlet 类, 该类是用专门的方法来处理 HTML 表格的 GenericServlet 的一个子类。 HTML 表单是由 <FORM> 和 </FORM> 标记定义的。表单中典型地包含输入字段(如文本输入字段、复选框、单选按钮和选择列表)和用于提交数据的按钮。当提交信息时,它们还指定服务器应执行哪一个Servlet(或其它的程序)。 HttpServlet 类包含 init()、destroy()、service() 等方法。其中 init() 和 destroy() 方法是继承的。

(1) init() 方法

在 Servlet 的生命期中,仅执行一次 init() 方法。它是在服务器装入 Servlet 时执行的。 可以配置服务器,以在启动服务器或客户机首次访问 Servlet 时装入 Servlet。 无论有多少客户机访问 Servlet,都不会重复执行 init() 。

缺省的 init() 方法通常是符合要求的,但也可以用定制 init() 方法来覆盖它,典型的是管理服务器端资源。 例如,可能编写一个定制 init() 来只用于一次装入 GIF 图像,改进 Servlet 返回 GIF 图像和含有多个客户机请求的性能。另一个示例是初始化数据库连接。缺省的 init() 方法设置了 Servlet 的初始化参数,并用它的 ServletConfig 对象参数来启动配置, 因此所有覆盖 init() 方法的 Servlet 应调用 super.init() 以确保仍然执行这些任务。在调用 service() 方法之前,应确保已完成了 init() 方法。

(2) service() 方法

service() 方法是 Servlet 的核心。每当一个客户请求一个HttpServlet 对象,该对象的service() 方法就要被调用,而且传递给这个方法一个“请求”(ServletRequest)对象和一个“响应”(ServletResponse)对象作为参数。 在 HttpServlet 中已存在 service() 方法。缺省的服务功能是调用与 HTTP 请求的方法相应的 do 功能。例如, 如果 HTTP 请求方法为 GET,则缺省情况下就调用 doGet() 。Servlet 应该为 Servlet 支持的 HTTP 方法覆盖 do 功能。因为 HttpServlet.service() 方法会检查请求方法是否调用了适当的处理方法,不必要覆盖 service() 方法。只需覆盖相应的 do 方法就可以了。

= 当一个客户通过HTML 表单发出一个HTTP POST请求时,doPost()方法被调用。与POST请求相关的参数作为一个单独的HTTP 请求从浏览器发送到服务器。当需要修改服务器端的数据时,应该使用doPost()方法。

= 当一个客户通过HTML 表单发出一个HTTP GET请求或直接请求一个URL时,doGet()方法被调用。与GET请求相关的参数添加到URL的后面,并与这个请求一起发送。当不会修改服务器端的数据时,应该使用doGet()方法。

Servlet的响应可以是下列几种类型:

一个输出流,浏览器根据它的内容类型(如text/HTML)进行解释。

一个HTTP错误响应, 重定向到另一个URL、servlet、JSP。

(3) destroy() 方法

destroy() 方法仅执行一次,即在服务器停止且卸装Servlet 时执行该方法。典型的,将 Servlet 作为服务器进程的一部分来关闭。缺省的 destroy() 方法通常是符合要求的,但也可以覆盖它,典型的是管理服务器端资源。例如,如果 Servlet 在运行时会累计统计数据,则可以编写一个 destroy() 方法,该方法用于在未装入 Servlet 时将统计数字保存在文件中。另一个示例是关闭数据库连接。

当服务器卸装 Servlet 时,将在所有 service() 方法调用完成后,或在指定的时间间隔过后调用 destroy() 方法。一个Servlet 在运行service() 方法时可能会产生其它的线程,因此请确认在调用 destroy() 方法时,这些线程已终止或完成。

(4) GetServletConfig()方法

GetServletConfig()方法返回一个 ServletConfig 对象,该对象用来返回初始化参数和ServletContext。ServletContext 接口提供有关servlet 的环境信息。

(5) GetServletInfo()方法

GetServletInfo()方法是一个可选的方法,它提供有关servlet 的信息,如作者、版本、版权。

当服务器调用sevlet 的Service()、doGet()和doPost()这三个方法时,均需要 “请求”和“响应”对象作为参数。“请求”对象提供有关请求的信息,而“响应”对象提供了一个将响应信息返回给浏览器的一个通信途径。javax.servlet 软件包中的相关类为ServletResponse和ServletRequest,而javax.servlet.http 软件包中的相关类为HttpServletRequest 和 HttpServletResponse。Servlet 通过这些对象与服务器通信并最终与客户机通信。Servlet 能通过调用“请求”对象的方法获知客户机环境,服务器环境的信息和所有由客户机提供的信息。Servlet 可以调用“响应”对象的方法发送响应,该响应是准备发回客户机的。

4.2 创建HTTP Servlet

创建一个 HTTP Servlet,通常涉及下列四个步骤:

1. 扩展 HttpServlet 抽象类。

2. 重载适当的方法。]如覆盖(或称为重写)doGet() 或doPost()方法。

3. 如果有 HTTP 请求信息的话,获取该信息。用 HttpServletRequest 对象来检索 HTML 表格所提交的数据或 URL 上的查询字符串。“请求”对象含有特定的方法以检索客户机提供的信息,有3个可用的方法:
= getParameterNames(),
= getParameter(),
= getParameterValues()。

4. 生成 HTTP 响应。HttpServletResponse 对象生成响应,并将它返回到发出请求的客户机上。它的方法允许设置“请求” 标题和“响应”主体。“响应”对象还含有 getWriter() 方法以返回一个 PrintWriter 对象。使用 PrintWriter 的 print() 和 println() 方法以编写 Servlet 响应来返回给客户机。或者,直接使用out对象输出有关HTML文档内容。

一个servlet样例(ServletSample.java)如下:

import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class ServletSample extends HttpServlet { // 第一步: 扩展 HttpServlet 抽象类。
public void doGet (HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { // 第二步:重写doGet()方法
String myName = ""; // 第三步:获取HTTP 请求信息
java.util.Enumeration keys = request.getParameterNames();
while (keys.hasMoreElements());
{
key = (String) keys.nextElement();
if (key.equalsIgnoreCase("myName"))
myName = request.getParameter(key);
}
if (myName == "")
myName = "Hello";
// 第四步:生成 HTTP 响应。
response.setContentType("text/html");
response.setHeader("Pragma", "No-cache");
response.setDateHeader("Expires", 0);
response.setHeader("Cache-Control", "no-cache");
out.println("<head><title>Just a basic servlet</title></head>");
out.println("<body>");
out.println("<h1>Just a basic servlet</h1>");
out.println ("<p>" + myName + ", this is a very basic servlet that writes an HTML page.");
out.println ("<p>For instructions on running those samples on your WebSphere应用服务器, "+"open the page:");
out.println("<pre>http://<em>your.server.name</em>/IBMWebAs/samples/index.html</pre>");
out.println("where <em>your.server.name</em> is the hostname of your WebSphere应用服务器.");
out.println("</body></html>");
out.flush();
}
}

上述ServletSample类扩展 HttpServlet 抽象类、重写doGet()方法。在重写的doGet()方法中,获取HTTP 请求中的一个任选的参数(myName),该参数可作为调用的 URL 上的查询参数传递到 Servlet。使用示例如下:http://your.server.name/servlet/ServletSample?myname=Michael。

4.3 调用 Servlet

要调用 Servlet 或 Web 应用程序,请使用下列任一种方法:由 URL 调用、在 <FORM> 标记中调用、在 <SERVLET>标记中调用、在 JSP 文件中调用、在 ASP 文件中调用。

1. 由 URL 调用 Servlet

这里有两种用 Servlet 的 URL 从浏览器中调用该 Servlet 的方法:

(1) 指定 Servlet 名称:当用 WebSphere应用服务器 管理器来将一个 Servlet 实例添加(注册)到服务器配置中时,必须指定“Servlet 名称”参数的值。例如,可以指定将 hi 作为 HelloWorldServlet 的 Servlet 名称。要调用该 Servlet,需打开 http://your.server.name/servlet/hi。也可以指定 Servlet 和类使用同一名称(HelloWorldServlet)。在这种情况下,将由 http://your.server.name/servlet/HelloWorldServlet 来调用 Servlet 的实例。

(2) 指定 Servlet 别名:用 WebSphere应用服务器 管理器来配置 Servlet 别名,该别名是用于调用 Servlet 的快捷 URL。快捷 URL 中不包括 Servlet 名称。

2. 在 <FORM> 标记中指定 Servlet

可以在 <FORM> 标记中调用 Servlet。HTML 格式使用户能在 Web 页面(即从浏览器)上输入数据,并向 Servlet 提交数据。例如:

<FORM METHOD="GET" ACTION="/servlet/myservlet">
<OL>
<INPUT TYPE="radio" NAME="broadcast" VALUE="am">AM<BR>
<INPUT TYPE="radio" NAME="broadcast" VALUE="fm">FM<BR>
</OL>
<!--用于放置文本输入区域的标记、按钮和其它的提示符。-->
</FORM>

ACTION 特性表明了用于调用 Servlet 的 URL。关于METHOD 的特性,如果用户输入的信息是通过 GET 方法向 Servlet 提交的,则 Servlet 必须优先使用 doGet() 方法。反之,如果用户输入的信息是通过 POST 方法向 Servlet 提交的,则 Servlet 必须优先使用 doPost() 方法。使用 GET 方法时,用户提供的信息是查询字符串表示的 URL 编码。无需对 URL 进行编码,因为这是由表单完成的。然后 URL 编码的查询字符串被附加到 Servlet URL 中,则整个 URL 提交完成。URL 编码的查询字符串将根据用户同可视部件之间的交互操作,将用户所选的值同可视部件的名称进行配对。例如,考虑前面的 HTML 代码段将用于显示按钮(标记为 AM 和 FM),如果用户选择 FM 按钮,则查询字符串将包含 name=value 的配对操作为broadcast=fm。因为在这种情况下,Servlet 将响应 HTTP 请求,因此 Servlet 应基于 HttpServlet 类。Servlet 应根据提交给它的查询字符串中的用户信息使用的 GET 或 POST 方法,而相应地使用 doGet() 或 doPost() 方法。

3.在 <SERVLET> 标记中指定 Servlet

当使用 <SERVLET> 标记来调用 Servlet 时,如同使用 <FORM> 标记一样,无需创建一个完整的 HTML 页面。作为替代,Servlet 的输出仅是 HTML 页面的一部分,且被动态嵌入到原始 HTML 页面中的其它静态文本中。所有这些都发生在服务器上,且发送给用户的仅是结果 HTML 页面。建议在 Java 服务器页面(JSP)文件中使用 <SERVLET> 标记。请参阅有关 JSP 技术

原始 HTML 页面中包含 <SERVLET> 和 </SERVLET> 标记。 Servlet 将在这两个标记中被调用,且 Servlet 的响应将覆盖这两个标记间的所有东西和标记本身。如果用户的浏览器可以看到 HTML 源文件,则用户将看不到 <SERVLET> 和 </SERVLET> 标记。要在 Domino Go Webserver 上使用该方法,请启用服务器上的服务器端包括功能。部分启用过程将会涉及到添加特殊文件类型 SHTML。当 Web 服务器接收到一个扩展名为 SHTML 的 Web 页面请求时,它将搜索 <SERVLET> 和 </SERVLET> 标记。对于所有支持的 Web 服务器,WebSphere应用服务器 将处理 SERVLET 标记间的所有信息。下列 HTML 代码段显示了如何使用该技术。

<SERVLET NAME="myservlet" CODE="myservlet.class" CODEBASE="url" initparm1="value">
<PARAM NAME="parm1" VALUE="value">
</SERVLET>

使用 NAME 和 CODE 属性带来了使用上的灵活性。可以只使用其中一个属性,也可以同时使用两个属性。 NAME 属性指定了 Servlet 的名称(使用 WebSphere应用服务器 管理器配置的),或不带 .class 扩展名的 Servlet 类名。CODE 属性指定了 Servlet 类名。使用 WebSphere应用服务器 时,建议指定 NAME 和 CODE,或当 NAME 指定了 Servlet 名称时,仅指定 NAME。如果仅指定了 CODE,则会创建一个 NAME=CODE 的 Servlet 实例。装入的 Servlet 将假设 Servlet 名称与 NAME 属性中指定的名称匹配。然后,其它 SHTML 文件可以成功地使用 NAME 属性来指定 Servlet 的名称,并调用已装入的 Servlet。NAME 的值可以直接在要调用 Servlet 的 URL 中使用。如果 NAME 和 CODE 都存在,且 NAME 指定了一个现有 Servlet,则通常使用 NAME 中指定的 Servlet。由于 Servlet 创建了部分 HTML 文件,所以当创建 Servlet 时,将可能会使用 HttpServlet 的一个子类,并优先使用 doGet() 方法(因为 GET 方法是提供信息给 Servlet 的缺省方法)。另一个选项是优先使用 service() 方法。另外,CODEBASE 是可选的,它指定了装入 Servlet 的远程系统的 URL。请使用 WebSphere应用服务器 管理器来从 JAR 文件配置远程 Servlet 装入系统。

在上述的标记示例中,initparm1 是初始化参数名,value 是该参数的值。可以指定多个“名称-值”对的集合。利用 ServletConfig 对象(被传递到 Servlet 的 init() 方法中)的 getInitParameterNames() 和 getInitParameter() 方法来查找参数名和参数值的字符串数组。在示例中,parm1 是参数名,并在初始化 Servlet 后被才被设置某个值。因为只能通过使用“请求”对象的方法来使用以 <PARAM> 标记设置的参数,所以服务器必须调用 Servlet service() 方法,以从用户处传递请求。要获得有关用户的请求信息,请使用 getParameterNames()、getParameter() 和 getParameterValues() 方法。

初始化参数是持续的。假设一台客户机通过调用一个包含某些初始化参数的 SHTML 文件来调用 Servlet。并假设第二台客户机通过调用第二个 SHTML 文件来调用同一个 Servlet,且该 SHTML 中未指定任何初始化参数。那么第一次调用 Servlet 时所设置的初始化参数将一直可用,并且通过所有其它 SHTML 文件而调用的所有后继 Servlet 都不会更改该参数。直到 Servlet 调用了 destroy() 方法后,才能重新设置初始化参数。例如,如果另一个 SHTML 文件指定了另一个不同的初始化参数值,虽然已此时已装入了 Servlet,但该值仍将被忽略。

4.在 JSP 文件中调用 Servlet

可以从 JavaServer 页面(JSP)文件中调用 Servlet。请参阅JSP技术部分。

5.在 ASP 文件中调用 Servlet

如果在 Microsoft Internet Information Server(IIS)上有遗留的 ASP 文件,并且无法将 ASP 文件移植成 JSP 文件时,可用 ASP 文件来调用 Servlet。在 WebSphere应用服务器 中的 ASP 支持包括一个用于嵌入 Servlet 的 ActiveX 控制,下面介绍ActiveX 控制AspToServlet 的方法和属性。

该方法说明如下:

(1) String ExecServletToString(String servletName);执行 ServletName,并将其输出返回到一个字符串中。
(2) ExecServlet(String servletName);执行 ServletName,并将其输出直接发送至 HTML 页面。
(3) String VarValue(String varName);获得一预置变量值(其它格式)。
(4) VarValue(String varName, String newVal);设置变量值。变量占据的总大小应小于 0.5 个千字节(Kbyte)。且仅对配置文件使用这些变量。

其属性如下:
= Boolean WriteHeaders;若该属性为真,则 Servlet 提供的标题被写入用户处。缺省值为假。
= Boolean OnTest;若该属性为真,服务器会将消息记录到生成的 HTML 页面中。缺省值为假。

下列ASP 脚本示例是以 Microsoft Visual Basic Scripting(VBScript)书写的。

<%
' Small sample asp file to show the capabilities of the servlets and the ASP GateWay ...
%>
<H1> Starting the ASP->Java Servlet demo</H1>
<%
' Create a Servlet gateway object and initialize it ...
Set javaasp = Server.CreateObject("AspToServlet.AspToServlet")
' Setting these properties is only for the sake of demo.
' These are the default values ...
javaasp.OnTest = False
javaasp.WriteHeaders = False
' Add several variables ...
javaasp.VarValue("gal") = "lag"
javaasp.VarValue("pico")= "ocip"
javaasp.VarValue("tal") = "lat"
javaasp.VarValue("paz") = "zap"
javaasp.VarValue("variable name with spaces") = "variable value with spaces"
%>
<BR>
Lets check the variables
<%
Response.Write("variable gal = ")
Response.Write(javaasp.VarValue("gal"))
%>
<BR>
<%
Response.Write("variable pico = " & javaasp.VarValue("pico"))
%>
<BR>
<HR>
<%
galout = javaasp.ExecServletToString("SnoopServlet")
If javaasp.WriteHeaders = True Then
%>
Headers were written <%
Else
%>
Headers were not written <%
End If
Response.Write(galout)
%>
<H1> The End ...</H1>

...... [阅读全文]

第三章 WebSphere Studio应用开发

本章结合IBM WebSphere Studio产品的使用,介绍电子商务应用开发技术。

3.1 Lotus Domino Go Webserver

Lotus Domino Go Webserver是一个Web服务器软件。它具有下列特性:
 支持CGI、Servlet和一些其它的应用编程接口。这些应用编程接口用来创建动态页面。
 具备代理服务器(Proxy Server)的功能。一个代理服务器是一个请求代理(Broker)。浏览器把请求发到代理服务器,代理服务器从网上或从缓存里取这个页。
 支持SSL 3.0。SSL用来确保在web服务器和web浏览器之间安全通信。
 支持PICS(Platform for Internet Content Selection)。PICS使得用户可以过滤他们遇到的材料,按照材料的分级(由Web管理员设置)接受或者拒绝材料。
 集成了搜索引擎。集成的搜索引擎是NetQuestion.
 易维护性。如很容易地维护用户和访问控制列表

下面就Domino Go Webserver的特性及有关使用技术加以详述,包括Web服务器的配置、启动Web服务器、URL与目录映射规则、服务器日志、访问控制、代理服务器。
1.Web服务器的配置
配置Lotus Domino Go Webserver有两种方式,一种是使用Web浏览器来配置和管理,另一种是直接编辑配置文件。第一种方法更简单。安装Lotus Domino Go Webserver 之后,启动Web服务器,使用web浏览器打开http://127.0.0.1/frntpage.html,输入用户名和口令后,浏览器就显示配置和管理Web服务器的表单。.这些表单是CGI程序和HTML表格的结合,为配置Web服务器或查看Web服务器的当前配置提供一个简单的方法。浏览器可以和服务器在同一台机器上或在访问Web服务器的远程的客户机上。在远程的客户机上进行配置和管理时需要访问http://your.server.name/,当然要求输入正确的用户名和口令。另一种方法是直接编辑配置文件。缺省地,配置文件名为httpd.cnf,在系统目录下,通常是C:\WINNT。配置文件是由指示语句(directive)构成的。通过更新这些directives来设置Web服务器的配置项,如主机名(Hostname)和URL传递规则(Passing Rules)。
2.启动Widows NT上的Web服务器
有两种方式来启动Widows NT上的Web服务器。第一种是从服务面板启动(NT Service Panel->StartUp Panel),有3个可选的启动类型(Auto、Manual、Disable),并提供了从系统帐号启动的方式,当选择从系统帐号启动Web服务器时,还可以选择在桌面上启动图形用户界面来显示日志或跟踪信息。另一种是用命令行启动,命令的语法为:whttpg [-p port] [-r config_file]。其中,端口号(port)指定Web服务器侦听的端口,而配置文件名(config_file)指定Web服务器的配置文件,通常不是缺省的配置文件(在WINNT目录下的httpd.cnf文件)。
需要指出的是在一个Widows NT上可以运行多个Web服务器,但是有两个注意事项。第一,同时运行的Web服务器必须使用不同的端口。第二,最多有一个Web服务器可以从服务面板启动,也就是说,附加的Web服务器需要用命令行启动,并使用不同的端口,但可以使用同一个配置文件(建议使用不同的配置文件为妥)。另外,一个Web服务器可以有多个IP地址,每个IP地址有不同的主机名,这称为多IP服务器。一个Web服务器也可以只有一个IP地址,但是有多个主机名,这称为虚拟主机。多IP和虚拟主机可以为不同的虚拟主机提供不同的信息,尽管不同的虚拟主机是由同一个Web服务器服务的。
3.URL与目录映射规则
URL(Uniform Resource Locator、统一资源定位器)是指定Web上资源项的地址的约定规则。它包括协议、后面跟着完整的主机名、和请求。一个URL的语法时:
协议://主机名[:端口][/[目录名[/...][/文件名[?变量名= 值[&...]]]]]。
协议指的是提供http、https、ftp等服务的有关协议,Go WebServer服务器提供自己的http和https服务,并代理ftp、gopher、wais等服务。通常,Web服务器把URL的主机名和端口后面的部分映射到一个路径和文件名,即所谓的目录映射。Go WebServer的Web文档根目录缺省为c:\WWW\HTML,在安装该Web服务器软件时可以指定Web文档根目录。当服务器收到的URL请求没有规定文件名字时,Web服务器会在相应的目录里搜索某个文件名列表,该文件名列表称为欢迎页面(Welcome Pages)列表。欢迎页面列表通常包括Welcome.html和index.htm等。关于目录映射,Go WebServer使用URL传递规则来实现所需的目录映射。传递模板及示例如下:
bgColor=#ffffff border=1>
传递模板
动作
请求模板
替代的文件路径
示例
Pass
/test/*
c:\myhome\test\*

其中,请求模板代表被请求的URL,可以包含(*)通配符。当一个URL匹配请求模板时,Web服务器按照替代的文件路径访问系统资源。这些规则可以用来维护物理文件系统的独立性。而动作类型及其含义如下:
(1) Map:Web服务器按照替代的文件路径改变URL,继续比较。
(2) Pass:Web服务器接受请求。
(3) Fail:Web服务器拒绝请求。
(4) Exec:Web服务器接受请求,并按照替代的文件路径运行一个CGI程序。
(5) Redirect:Web服务器使用一个由替代的文件路径确定的URL来响应。
(6) NameTrans:Web服务器接受请求,在处理请求的名字转换步骤中,运行一个由替代的文件路径
确定的API应用。
(7) Service:Web服务器接受请求,在处理请求的服务步骤中,运行一个由替代的文件路径确定的API
应用。
如果设置了下列传递规则:
Map
/beta/*
/text/*
Exec
/cgi-bin/*
c:\www\cgi-bin\*
Pass
/*
c:\www\html\*
Pass
/abc.html
c:\abc.html

URL请求与实际的系统资源之间的对应举例如下:
表3-1:URL到系统资源之间的对应举例
URL请求
对应的系统资源
应用的规则
/cgi-bin/search.exe
c:\www\cgi-bin\serch.exe
规则1)、2)
/index.html
c:\www\html\index.html
规则3)
/beta/download.html
c:\www\html\test\download.html
规则1)、3)
/abc.html
c:\www\html\abc.html
规则3)

在匹配了Map规则以后,服务器会继续比较余下的规则。服务器会在Exec和Pass规则后停止比较。第4个规则永远不会被使用,因为任何可以匹配第4个规则的都会匹配第3个规则。因此,Pass /* 规则通常应该放在最后。
4.服务器日志
缺省地web服务器会在c:\www\logs目录下记录所有东西,Web服务器每天在午夜启动一个新的日志文件(如果那时它在运行的话)。否则,Web服务器会在某天首次启动时开始一个新的日志文件。日志文件通常包括下列类型:
(1) httpd-log:记录Web被访问的统计情况。
(2) agent-log:记录客户使用的Web浏览器的情况。
(3) referer-log:记录引用到请求页面的页面的情况。
(4) httpd-error:记录Web服务器内部错误的情况
(5) cgi-error:记录CGI错误的情况。
日志的删除可以选择在若个天后删除,或在若个MB存储空间被用完后删除,或运行“User Exit” 删除。也可以通过配置:对某些请求不作记录。
5.访问控制
Web服务器中的资源通常需要各种不同程度的保护。可以在Web服务器的配置文件里进行保护设置,也可以在每一个目录里设置ACL(Access Control List),ACL是一个包含保护规则列表的文件,用来保护同一个目录的文件。保护的类型有用户名保护和地址保护等方式,用户名保护决定谁可以访问这个资源(可以要求口令验证),地址保护使用地址模板来决定哪些客户机(IP地址)可以访问这个资源。
6.代理服务器
代理服务器是一个可以为它的客户从别的服务器那里取得文件的服务器。一个代理可以降低网络流量,对Internet隐藏内部网信息。可以代理http、ftp、gopher、wais和SSL隧道(如https和snews),通常通过设置URL传递规则来实现。为启用SSL代理,还必须启用connect方法。要使用Web服务器提供的代理功能,浏览器必须设置该Web服务器为代理服务器并指定这个Web服务器的端口。
启用的代理缓存功能可以提高运行效率。代理缓存是在代理服务器端保存http、https或ftp等缓存文件以减少不必要的重复的请求处理。有几个设置参数需要注意:缓存文件的一个给定的存储空间称为缓存容量,存放缓存文件的目录称为缓存文件的根目录,对某些URL进行缓存(其它的不需要)称为缓存过滤。另外,未被使用的缓存文件的时间限制用来规定服务器保存未被使用的缓存文件的最长时间,而存储空间回收用来移走过期的缓存文件。

3.2 IBM WebSphere Studio

Web站点的内容是由静态和动态内容组成的。静态内容以HTML、图片等形式出现。除了在客户端的动态效果以外,在一个Web服务器上动态内容通常以服务器端程序的形式存在,它们在被请求时产生动态内容。许多站点已经使用applet来达到在web上的动态效果。虽然这个方法能做到这一点,但是java和网络性能的问题阻碍了这种方法的大规模应用。服务器端生成动态内容在大多数情况下是更好的方法。因为:
 更容易支持瘦客户。
 提供更大的灵活性和安全性。
 在大多数情况下动态内容来自数据库。
 服务器端程序可以执行数据库操作,然后向浏览器报告结果。

服务器端生成动态内容符合瘦客户或超瘦客户设计模式,它使得软件开发者在一个web应用的客户端放尽量少的商务或数据访问逻辑。而胖客户是指在一个应用的客户端放置了太多商务逻辑和访问。这会影响网页的下载时间,可能引起其它问题。服务器端数据库访问是一个好的解决方案,可以更好地利用服务器,从客户减轻客户端的负担。通过Java访问数据库是利用JDBC(Java Database Connectivity)应用编程接口进行的。总之,在为一个网站提供动态内容时,会涉及到服务器端应用程序。CGI和/或Servlets将是典型的部署载体。Servlet是生成动态内容的焦点。然而,大多数动态内容会涉及到数据库。
WebSphere Studio提供了项目工作台和有关向导。项目工作台用来把各种生成的组件集成进一个项目,而各种向导可用来存取数据库、创建JavaBean和servlet等等。
1.项目工作台
项目工作台是一个在资源控制管理下的Web站点对象管理工具,其站点管理能力与NetObject Fusion大致雷同。项目工作台具有下列特性:
(1) 同任何网站开发工具互操作。通过将站点对象的文件类型注册到相关的应用,项目工作台可用来启动应用(工具)来操作(打开,显示)站点对象。从而能有效的管理那些与站点有关的对象资源,与资源控制环境的交互使得Web站点的小组开发得以有效地进行。因此它是能集成很多网站开发工具的理想的工具集成环境。
(2) 提供灵活的站点发布能力。项目工作台为两类对象资源提供各自独立的发布路径,一类是Servlets和JavaBeans,另一类是所有其它的东西。项目工作台提供了网站的本地发布或远程发布两种方式。
WebSphere Studio 有一个双框图形用户界面,还有许多与桌面应用程序相似的功能特性。以下分别介绍框架、分解视图、具栏和按钮、过滤器。
(1) 框架
左边的框架显示所选项目及其文件夹的图形分层。右边的框架显示在左边框架中选择的一些项目的细节。
 一个项目可包含文件和文件夹。
 文件夹可包含文件或其它文件夹。
 文件包含数据。

您可以按喜欢的方法来组织文件,并使它容易地将一个项目中的有关文件作为一个单元进行管理,比如,公布一个项目中的若干个文件或所有文件至目标服务器上(如 WebSphere 应用服务器)。
(2) 分解视图
当您从视图菜单中选择分解视图表,文件夹及子文件夹中的所有文件将显示在详细视图表中。表格包括附加的路径信息以帮助您区分它们。文件夹本身不显示。 快捷方式按钮位于工作台的右下方,您可对分解视图的开或关进行切换。
(3) 工具栏和按钮
此界面包括菜单栏、工具栏、状态栏和过滤器按钮的垂直行。
 菜单栏允许您访问所有的可用功能。
 工具栏允许您快速访问大多数的普通功能和向导。
 过滤器通过文件扩展名或文件类型来控制显示文件。
 状态栏列出一般信息,例如您的视图的大小和对象的数目,也包括被过滤器隐藏的文件数。

(4) 过滤器
过滤器按钮位于主窗口的右边。它通过文件类型和文件扩展名来控制哪些文件显示在详细框架中。单击它可进行开和关的切换。打开过滤器,请单击过滤器按钮,在详细视图中将显示此种文件类型的文件。过滤器类别是:HTML 文件、图像文件、SQL 文件、Java 文件、Java 类文件、文本文件。同时要打开多个过滤器,请在单击每个过滤器按钮时按下 Ctrl 键。要暂时关闭所有过滤器,请先从视图菜单中选择“过滤器”,然后选择“显示全部”。
在分解视图上使用过滤器能够管理在分组中选择文件类型的所有文件,而不考虑它们的相对位置。 例如,若要打开一个包含文件夹及子文件夹的项目,但其中只有 HTML 文件, 您就可打开分解视图和 HTML 文件过滤器来显示整个项目中的所有 HTML 文件。

2.向导
有关向导及其基本功能如下:
(1) SQL 向导:创建一个可被数据库访问 Servlet 使用的 SQL 语句。语句可查询关系数据库,并从表中选择数据显示在 Web 页面上。SQL向导要求连接数据库,以验证连接参数,提取元数据来支持SQL语句的开发。
(2) 数据库访问向导:创建 Servlet 来访问关系数据库。使用一个生成的SQL文件,数据库访问sevlet向导生成5个文件:servlet、servletBean、输入HTML表格、输出页面(JSP)、和可选的错误页面(JSP)。其中,可选的输入表格(HTML)用来为SQL命令传参数,ServletBean提供一个可执行方法来调用SQL命令,Servlet创建那个ServletBean的一个实例,执行它的方法,然后决定调用有关结果页面。
(3) 基本 Servlet向导:创建使用指定的 JavaBean(包括 Navigator 和为 VisualAge for Java Enterprise Access Builder 建立 VisualAge 时的命令)的 Servlet。它同时产生一个调用 Servlet 及捕捉用户输入的输入页面和显示结果的输出页面。
(4) 到期 HTML Servlet向导:创建随日期而更改内容的Servlet。则它生成 Servlet 以及包括 HTML 的变量部分的页面。
(5) 注册Servlet向导:创建一个可在 WebSphere应用服务器 的 UserProfile 特性中设置或获得数据的Servlet。这使可维护 Web 访问器的详细信息,并且此访问器对于用户注册和其它的 Web 应用程序都是一样的。 向导同时产生一个调用 Servlet 及捕捉用户输入的输入页面和显示结果的输出页面。
(6) JavaBean向导:创建能够进行编辑和扩展的JavaBean的基本实现。 指定在 Bean 中所需的属性,向导将创建方法来设置和获得其值。 一旦完成 Bean,就可在基本向导中使用它。
上述向导对快速地制作用于创建和显示动态内容的中间层(和客户层)元素的原型有用,对提供模板代码来定制有用。而且与WebSphere应用服务器的“编程模型”紧密集成。下面以使用数据库访问向导为例来创建访问数据库的Servlet。数据库访问向导帮助创建Java Servlet,它用来从关系数据库中检索指定数据并在 HTML 页面中显示信息。
向导需要 SQL 语句文件,Studio SQL 向导将帮助创建它。该 SQL 语句告诉数据库访问 Servlet 连接哪个数据库、搜索哪个表格、选择哪个数据以及如何排序。实际上,无需知道 Java 或 SQL 语法,就可创建数据库访问 Servlet。浏览至想放置 .jsp 文件的文件夹。
从“工具”菜单,选择“Studio 向导”。
(1) 选择“数据库访问 Servlet”。
(2) 单击“下一步”启动向导,继续标记的页面。
(3) 当完成所有要求后单击“完成”。
(4) 当完成后,可“照原样”使用文件或根据需要进行定制。
向导将创建:
(1) 调用 Servlet 的输入页面(.html)
(2) 提供实现指定 SQL 语句数据库访问逻辑的 JavaBean 文件(.class 和 .java)
(3) 配置 Servlet 的 Servlet 配置文件(.servlet)
(4) 包含选中数据库列 JSP 和 HTML 的输出标记的 JSP 文件(.jsp)
(5) 按照下列步骤完成数据库访问 Servlet 向导:
注意:可使用这样的方式建立和测试数据库Servlet,使用某一现有数据库,通过修改 .servlet 配置文件中的一个或多个以下值,将其创建为另一个 Servlet:
 URL
 driver
 userID
 password
此方法可能需要数据库服务器的模式别名。请参阅 Servlet 配置文件,了解更多关于 .servlet 文件的详细信息。
3.脚本编辑
IBM WebSphere Studio能与NetObjects ScriptBuilder很好的集成起来。从WebSphere Studio的项目工作台项可以启动ScriptBuilder来对有关文件进行编辑,可编辑的文件类型包括HTML、JavaScript、Java、JSP和XML等。
NetObjects ScriptBuilder是适合于Web的脚本开发工具,为Web站点的客户端和服务器端脚本提供了一个快速的开发方法。它将强大的脚本编辑器与丰富的可视化开发工具有机结合,以加速脚本的开发。它也是架构Netscape,、Microsoft、 IBM、Sun Microsystems等各大公司的不同Web脚本环境的桥梁。它支持CFML (Cold Fusion Markup Language)、Dynamic HTML、 ECMAScript、 HTML、JSP、Java、LotusScript、ASP、CDF (Channel Definition Format)、DOM (Document Object Model)、Jscript、VBScript、JavaScript、LiveWire、Perl、和WML (Wireless Markup Language)。使用NetObjects ScriptBuilder, 开发者能够:
(1) 检查脚本的语法错误
(2) 创建面向对象的脚本组件。
(3) 访问语言的参考书目
(4) 使用XML定制语言参考书
(5) 检查文档与浏览器的兼容性
(6) 把所需的语言元素拖放到文档中。
(7) 使用标准的Web语言或其它语言
(8) 快速导航到嵌入的函数和组件
(9) 自动化重复性的任务
(10) 预览文档

3.3 NetObjects Fusion

NetObject Fusion是一个可视化的Web站点的构建和管理工具。NetObjects Fusion是Web站点构建过程的中心。NetObjects Fusion是一个面向站点的工具,而不是仅仅处理单个页面。在Web站点开发的过程中,会创建许多页面,页面之间有很多链接。手工地更改这个结构是相当困难的。用NetObjects Fusion可以设计Web站点的通用元素,创建并维护Web站点的结构,构建各个页面,并能容易地维护这些页面。
总之,使用NetObject Fusion,可以设计Web站点、构建各个页面、容易地维护Web站点。下面介绍NetObject Fusion 中的站点视图(Site view)、页面视图(Page view)、样式视图(Style view)、对象集视图(Assets View、或称资源视图)、和发布视图(Publishing view)。
1.站点视图
站点的结构视图(参见图3-1)是站点视图的一种,单击“轮廓视图”标签就显示站点的轮廓视图。在结构视图中,页面的颜色是可以由开发者选择,通常用来为页面分组,但是页面颜色对实际页面没有影响。用户站点的文件格式为“*.nod”,模板文件格式为“*.nft”, 样式文件格式为“*.ssf”。使用站点视图,可以创建(或修改)一个站点的层次结构、操纵页面、引入/导出(Import/Export)站点、引入模板以改变站点的风格、打印站点的结构图等等。例如,可以引入一个已有的站点将它转成NetObjects Fusion的格式或保留为外部HTML页面。如果这些被引入的页面不会被改变,通常可以将引入的页面保留为外部HTML页面。
图3-1:站点视图

2.页面视图
站点的页面视图(见图3-2)包括页面布局(Page Layout)和主控边框(MasterBorder),并提供面板和工具栏。面板包括属性面板和对象树,工具栏包括标准工具栏、表单工具栏、组件工具栏、和高级工具栏。对象树是关于当前页面中所有对象的树状结构,开发者可以通过对象树来定位目标对象,也可以直接选择目标对象。一旦选定目标对象,属性面板就显示该对象的属性,对象属性依赖于对象的类型,不同类型的对象(如文本和applet)有不同的属性,可以使用属性面板来设置对象属性,当然有的属性可以可视地编辑。
在页面视图中,可以可视地或通过属性面板来定义主控边框和页面布局。主控边框勾画出一个页面的五个区域:中间的布局区域和四个(左、右、上、下)边缘区域。这些边缘区域包含多个页面共有的元素,如水平标注和导航条,可以通过属性面板设置主控边框的自动边框(AutoFrame)属性,把某些边缘设置成框架(frame)。关于布局,而布局区域用来放置该页面的内容。需要注意的是页面布局包括页面的实际内容,不仅仅是页面的布局,也许一个页面有好几个布局或版本,例如有框架(frame)的和没有框架的版本。NetObjects Fusion使用表格(table)来组织它生成的HTML页的内容,也可以通过设置布局属性来选择布局是表单。也可以通过弹出菜单或单击属性面板中的“HTML”按扭在来显示生成的HTML文档。
图3-2 页面视图

工具栏通常在窗口的边上,也可以拖进窗口里面(如图3-2)。工具栏包括标准工具栏、表单工具栏、组件工具栏、和高级工具栏。这些工具栏为页面的制作提供了许多实用工具。
(1) 标准工具条
 选择(Select):选择一个特定的组件并移到另一个地点或重新设置大小。
 缩放(Zoom In/Out):使页面的视图围绕鼠标击中的区域放大或缩小。
 文本(Text):向页面增加一个包含一些文本的组件。
 图片(Picture):向页面增加一个图片。可以是一个.gif或.jpg文件。Fusion接受BMP,PCX,PICT,GIF,JPEG的图。
 热点(Hotspots):把一个图片中的某个区域标记为可单击(链接到某个URL),从而使该区域成为热点。这个区域可以是圆形、矩形、和多边形
 布局区域(Layout Region):在布局区域或主控边框里创建一个布局区域,它可以拥有与包含元素不同的布局属性(例如,一个不同的背景色)。
 表格(Table):创建一个HTML表格,可以规定表格的行数和列数。
 表单区域(Form Area):创建一个或多个表单。可以选择创建基于布局区域的表单、基于表格的表单、或基于文本的表单。也可以把一个表单加到边缘区域,从而能在多个页面里显示。
 导航条(Navigation Bar):用来创建导航条。可以使用按钮或文字形式,从当前页面链向站点里的别的页面,比如在Web站点结构里的父层、当前层或子层。
 水平标注(Banner)。用来在页面的任何地方创建一个水平标注,反映这个页面的名字。通常在页面的顶部,来标志这个页面。
 绘制(Draw):绘制工具,这些工具用来在一个页面里画圆形、矩形、圆角矩形和多边形。
 直线(Line):画直线的工具,这些工具用来在一个页面里画水平线、任意角度的在线、站点样式的水平线。

需要注意的是Hotspots、Draw、Line这三个工具还包括可选的子工具,按下按扭不放就会显示可选的子工具,保持按下按扭并移动就可选择所要的工具。
(2) 表单工具栏
这些工具用来创建表单。表单可以用来收集信息,然后送回服务器端CGI程序或Java Servlet。
 表单按扭(Button):一个表单按钮通常被用来启动一个后端服务程序或来重置表单。
 表单复选框(Check Box):一个复选框代表一个布尔值,选中表示真值,否则表示假。
 表单单选按扭(Radio Button):一个单选按钮是一组单选按扭的一部分,这组单选按扭是互斥的,即只能有一个为真,而别的都为假互斥的。
 表单编辑字段(Edit Field):表单上的一个区域,用户可以输入一行信息如名或姓。
 表单多行文本(Multi-Line):表单上的一个区域,用户可以输入多行信息,如对一个产品的说明或目录里的一项。
 表单组合框(Combo box):一个下拉列表,用户可以选择。一个例子是:头发颜色的列表。用户可以选一个。

(3) 组件工具栏
 动态按扭(DynaButtons):对按钮使用站点风格
 磁带(Ticker Tape):一个水平滚动文字区域,不断重复。
 站点映射器(Site Mapper):一个用来显示站点结构的按扭。
 消息板(Message Board):一个BBS 设施
 表单句柄(Form Handler):实现一个简单的CGI程序。用来检查表单中的字段
 图片反转(Picture Rollover):一个反转按扭。当鼠标滚过图片,图片改变成指定的图片反转。当鼠标在图片上单击,图片会改变,一个URL链接会显示。
 基于时间的图片(Time Based Picture):在这个地点的不同时间显示不同的图。
 图片加载器(Picture Loader):使用其它资源中的图片
 旋转图片(Rotating Picture):简单动画。通常用来显示广告。

(4)高级工具栏
 Media:一个子工具条,包括了一些项目象Shockwave、Quicktime、Video、Sound和别的插件
 Java:允许往页面上加一个Java applet。
 ActiveX Control:允许往页面上加一个ActiveX控件。
 Data:一个子工具条,允许你访问内部和外部数据对象。
 External HTML:包括一些需要特殊的、手工写的HTML页面。可以在外部引用HTML文件并把
它们放在站点的任何地方,而不是引入并转换这个HTML。NetObjects Fusion在发布Web站点时不分析这个HTML。

上述工具栏提供的有关工具可用来增加页面的互动性。如可以在页面上增加脚本、放置ActiveX控件、增加Java applets等等。脚本可以加到一个Fusion生成的HTML元素的前面、后面或里面。增加Java applets时使用Java对象属性设置有关参数,Fusion将增加的class文件作为对象集(assets)中的元素。
3.样式视图
样式视图(参见图3-3)可用来选择站点样式、编辑样式、或创建新的样式。Fusion提供的样式适合于简单的站点或者可用来取得用户的反馈信息,重要的站点通常需要创建新的样式。Fusion用样式中指定的字体生成水平标注和按钮上的文字。因此,应该为水平标注和按钮选择任何你的系统里的字体,Fusion将使用指定的字体生成有关图象,浏览器只看到一个图象。对于在HTML里创建的文字组件,浏览器可以控制自己使用的字体。
图3-3:样式视图


4.对象集视图
对象集视图(参见图3-4)是一个管理所有对象的地方,包括文件、链接、数据对象、变量,对象通过别名来访问。Fusion提供预定义的变量,如日期、时间和站点名等等。开发者可以创建自己的变量,并在对象集视图中管理。每当开发者需要选择图象或别的文件时,打开文件对话框(Open File dialog)上会有一个对象集标签(Assets tab),单击该标签就显示对象集中的有关文件,开发者就可以选择所需要的文件。这种就对象进行统一管理的方式支持“一次更新,每个地方都更新”。例如标识公司的图案(logo),如果一个公司改变了它的标识图案,只要在对象集视图中改变有关标识图案的文件,Fusion可以改变这个站点里的每一页。
图3-4:对象集视图


5.发布视图
发布视图(参见图3-5)用来配置发布选项,并进行发布。发布选项包括本地发布位置和远程发布位置等。本地发布是指发布到本机的文件系统里,远程发布需要使用FTP把文件传输到服务器。如果你选择发布到一个远程站点,这个站点必须支持FTP,发布者必须知道所需的用户名和口令。通常在正式发布之前需要发布到一个临时服务器上进行测试,并需要使用不同平台上的不同浏览器进行测试。发布时,Fusion将生成HTML页面以及目录结构,拷贝所有的对象到指定的目录,这些目录里包含HTML文件、图象、Java 类等等。目录结构可以是单一的(flat)、基于对象类型的(asset)、或基于站点区域的(section)。所有生成的HTML使用相对路径。在发布之前还可以使用预览功能。预览创建HTML文件,生成任何需要的图象,但它不拷贝任何别的对象,从而不显示嵌入的组件。在按下CTRL 键时单击预览按扭就可以只预览当前页。
图3-5:发布视图

总之,Fusion是一个Web站点的组装工具,对管理站点范围的格式模板有强力支持,支持丰富的“对象”,链接和对象集管理使得部署到多个站点变得很容易。可以使用Fusion设计站点结构、构建和管理站点页面、设计和写页面内容、设计站点的图形化风格、管理和测试站点的对象集、把站点发布到本地或远程服务器、更新和维护站点。

3.4 NetObjects BeanBuilder

NetObjects BeanBuilder是创建多媒体Java applet的可视化写作工具。它的前身是Lotus BeanMachine。NetObjects BeanBuilder使得开发者能用多媒体、特效、灵巧的表单和动态数据来丰富网站,而不要写一行Java代码,或者只需写一些简单的Java代码。BeanBuilder是通过把JavaBean结合进applet的可视化编辑工具来实现这一强大的功能。开发者只要从BeanBuilder的样式库(Palette)里选择丰富的可重用的JavaBean,设置几个属性,就完成了多媒体Java applet的开发。如果在样式库里没有需要的那个JavaBean,可以用BeanBuilder的部件引入向导(Import Part Wizzard)引入JavaBean或Java 类。甚至也可以引入已有的applet。
1.Applet 概述
Applet是Panel的一个子类,可以包含GUI组件。与一般的应用程序不同的是,applet只能在浏览器里运行。Applet使用称之为沙箱(“sandbox”)的安全模型。在这个模型中,网上下载的applet缺省地是不可信代码(不可信Applet),不可信Applet有下列约束:
(1) 不能读或写本地文件系统;
(2) 不能进行网络操作,除非是对于applet的源主机;
(3) 不能装载某些类,如SecurityManage子类和URLContentFactory等;
(4) 不能访问它所运行的线程组以外的线程或线程组;
(5) 不能使用广播字节套(multicast sockets);
(6) 不能访问java.security包

这个安全模型使得用户放心地使用applet。然而,这些安全限制使编程的任务变得更困难。在JDK1.1里,Applets可以被签署(sign)。如果运行时环境的安全政策认为“签署者”是可信任的话,这些被签署的applets可以被认为是“可信任的”代码。在JDK1.2里,所有的Java代码都是能被限制的或签署的。
Applets通常被嵌入HTML文档中,applet标记是在一个Web页面里使用applet的标准机制。举例如下:

<Applet CODE= Register.class WIDTH=500 HEIGHT=500 CODEBASE= classes ARCHIVE= Register.jar>
<PARAM NAME= fullName VALUE= "Henry Burns">
<PARAM NAME= age VALUE= "12">
</Applet>

CODE,WIDTH,HEIGHT属性是必需的选项,其它的属性和包含的标记是可选的,如ARCHIVE属性和CODEBASE属性和PARM标记。有关属性和标记,及其它们的含义如下:
(1) CODEBASE= Java代码所在的URL(不是document base)。CODEBASE允许规定.class文件所在的路径,使用页面服务器上的路径或URL。
(2) CODE= Applet类文件的名字。CODE属性可以指定为在页面服务器上的路径或URL,值对大小写敏感,而且必需包括.class扩展名。
(3) WIDTH= applet显示区域的宽度。
(4) HEIGHT= applet显示区域的高度。WIDTH和HEIGHT用像素点规定浏览器定位的空间。
(5) ALT=如果浏览器不能理解标记的话,要使用的文字
(6) ARCHIVE=允许使用JAR文件,作为发现applet文件的地方
(7) NAME= applet的名字。多个applets之间的通信要用到这个。
(8) ALIGN= 告诉浏览器怎样在显示区域里排列applet
(9) VSPACE= applet和别的组件在垂直方向上的间隔
(10) HSPACE= applet和别的组件在水平方向上的间隔
(11) PARM标记,要求一个NAME和一个VALUE成对出现。使用PARAM标记来指定一个applet
的参数。PARM标记必须在<APPLET>和</APPLET>之间出现。NAME部分是大小写不敏感的,而VALUE部分是大小写敏感的。所有传给applet的参数都被当作字符串。

在上述嵌入HTML文档的applet例子中,Applet类由Register.class定义,该文件存放在Web服务器中HTML文档目录的classes子目录中,而且Register.class 文件很可能被包含在Register.jar 文件中。Jar文件是包括一个附加的”manifest”文件的压缩ZIP文件,通常用来把一个applet需要的二进制文件、源文件和资源文件等有关文件结合进一个文件。浏览器取得jar文件之后,需要解压缩得到所需的.class文件及可能的相关资源文件。Jar文件也可以用于Java应用程序或Servlet,但一般用于Applet。如果一个Jar文件用于一个应用程序或Servlet,在运行它们以前会有一个额外的解压缩的过程。对applets而言,这个额外的解压缩处理是值得的,因为节约了网络传输时间。最后,jar文件也可以被用作一个分发Java软件包的机制。
在applet代码中,程序员可以使用getDocumentBase()方法来获得包含applet标记的HTML页面的URL。使用getCodeBase()来找出CODEBASE属性选项的设置。如果CODEBASE属性选项是空白的,getCodeBase()方法返回与getDocumentBase()一样的值。使用getParameter(String)方法取得参数的值,通常需要对传进Applet的VALU还要进行差错处理。
2.标准样式库
样式库中包含了许多用于组成applet的 bean。BeanBuilder 提供了缺省的样式库,为了把样式库中的某个 bean 放置在applet中,可以在样式库中单击这个 bean 的图标。此操作可将 bean 装载到光标上,并将光标变成十字指针形状,然后在设计器上再次单击鼠标放置 bean。样式库上的beans包括附件Beans、控件Beans、多媒体Beans、和网络Beans四种类型。
A.附件分类
(1) 布尔求值:用于对布尔值进行 AND 和 OR 运算;
(2) 数学公式:用于执行基本的数学运算;
(3) 数字求值:用于比较两个数字的大小;
(4) 文本源:用于访问文本文件的内容,对于一个远程文件可以使用一个URL表示,或对于一个在
可信任的applet里的本地文件使用一个文件名表示。

B.控件分类
(1) 按钮:按钮 bean。
(2) 复选框:复选框 bean。
(3) 选择框:下拉列表bean。
(4) 标签:显示单行文本的bean。
(5) 列表框:列表框 bean。
(6) 面板:可以包容其他 bean 并且具有布局样式的 bean。
(7) 文本区:可以输入多行文本的bean。
(8) 文本域:只能输入单行文本的bean。

这些是标准的AWT控件,但是,这些控件提供的有关事件更丰富。
C.多媒体分类
(1) 动画:用于显示一组连续的图片。
(2) 声音:用于播放声音剪辑。
(3) 时钟:用于显示日期和时间。
(4) 图像:用于显示图片文件。
(5) 动作:用于沿着路径移动其它bean。
(6) 跳跃文本:用于显示在屏幕上跳动的文本。
(7) 感应按钮:当鼠标经过时可以改变图像。
(8) 阴影文本:显示带有阴影的文本。
(9) 打字机:用于显示文本字符并伴随播放声音。
(10) 文本:用于显示文本。
(11) 行走文本:用于在屏幕上显示移动的文本。
(12) 计时器:用于计算时间。

D.网络分类
(1) 数据库:用于显示数据库中的数据。
(2) 电子邮件:用于组织和发送电子邮件而不用浏览器邮件对话框。
(3) 新闻摘要:用于显示包含 URL 链接的滚动文本列表。
(4) HTML参数:用于读取 HTML 参数。
(5) 邮件链接:用于显示浏览器的邮件对话框。
(6) URL 链接:用于连接到其他 Web 页面。生成的URL以./开头的,即使用相对于HTML页面的
相对路径,正斜杠和反斜杠都是一样的。
(7) 大字标题;用于显示带URL链接的滚动文字列表

BeanBuilder提供的控件同VisualAge for Java提供的不一样。例如,BeanBuilder有出色的多媒体和动画控件。
3.添加与定制样式库
在样式库中添加 JavaBean。只要单击添加按钮,就将出现对话框(参见图3-6)以进行选择。典型情况下可以从 .jar 文件添加现有的 bean。为此目的,单击“从 jar 文件中添加 bean”单选按钮,在文本框中输入 jar 文件的路径或单击查找...按钮以查找所需的 .jar 文件。使用分类域中的下拉列表以指定添加 bean 的样式库分类。单击确定增加 bean。如果指定的 jar 文件有多个 bean,所有的将添加到指定的分类中。如果想要在添加 bean 时添加新的分类,只要在分类域中输入新名称。然后单击确定添加 bean 和新的分类。注意:也可通过将 .jar 文件放置到 BeanBuilder 的“Beans”文件夹将 bean 添加到样式库中。“Beans”文件夹包含所有 bean 的 BeanBuilder 样式库。下一次 BeanBuilder 启动时,它将会探测到新添了 bean,并自动将它添加到样式库中。BeanBuilder 选择 jar 文件的名称作为 bean 分类的名称。通常也可以用VA Java来创建beans,然后添加到BeanBuilder 样式库。
除了向 BeanBuilder 样式库添加以外,还可以定制样式库。要定制样式库,单击样式库上的定制按钮。这将显示对话框以提供选项。可以重新排列 bean、隐藏 bean 或删除它们。
(1) 要重新排列样式库中的 bean,可在列表中选择想要移动的 bean,并使用箭头按钮在列表中移动它到想要的位置。甚至可以移动它到另一个分类。
图3-6:添加到样式库

(2) 也可以隐藏特定的 bean 或整个分类的 bean。要隐藏 bean 或分类,可单击它旁边的复选框。如果框包含复选标记,此特定 bean 或分类将显示在样式库中。如果框不包含复选标记,bean 或分类将在视图中隐藏。
(3) 要完全删除 bean,突出显示该 bean 并单击删除按钮。如果可能以后需要该 bean,可使用隐藏替代删除,这样能够快速恢复此 bean 而不用重新增加它到样式库中。
注意:虽然可以删除创建的分类,但不能删除 BeanBuilder 所带的分类。要注意到删除按钮在这些分类突出显示时,是不能使用的。如果删除分类,所有的 bean 将会消失。
4.构建applet
单击 Windows 的“开始”按钮,从“程序”菜单中启动 BeanBuilder 进入“新建applet向导”。可以通过这个向导快速创建第一个applet。阅读并熟悉向导,在准备就绪之后单击“下一步”,在“动画”附签中选择“是”。单击“查找”定位动画的第一帧,将BeanBuilder安装目录的doc 文件夹中的 dot001.jpg 作为动画的第一帧。BeanBuilder 使用相同的基础文件名(dot002.jpg、dot003.jpg 等)在第一帧图像所在的文件夹中搜索其他序号的文件,从而自动定义动画的其余帧。在本样例中,BeanBuilder 查找到 7 个文件来完成动画。BeanBuilder 自动识别动画中剩余帧。选择“中速”定义动画的播放速度。可以单击“预览”按钮预览动画的播放效果。这样就简单的完成了动画的创建。单击“完成”继续下面的操作。此时的设计器窗口如图3-7所示:
图3-7:设计器窗口

下面让我们通过创建“连接”来使它动起来。连接可以看作是两个部件之间的命令或交互作用。连接的作用方式为“当事件发生时,执行操作”。操作可以是诸如播放声音剪辑或者设置属性(背景颜色)之类的任意动作。在本样例中,操作就是播放动画。记住,所有的操作都要由事件触发。通过直接定义触发操作的事件来创建连接。在本样例中,我们需要在单击按钮之后开始播放动画。因此在创建连接之前,首先添加一个按钮。
BeanBuilder 中提供了多种按钮,可以使用标准按钮或是更为生动的感应按钮。感应按钮中附加了一些内置特性,当将鼠标移动到感应按钮上,或者在其上按下鼠标时,可以自动显示不同的图像。首先确保样式库中显示多媒体分类;如果没有,从下拉框中选择它。当多媒体分类出现后,单击感应按钮 bean。此时的光标将转换成十字指针,并且装载感应按钮 。下一步,将光标移动到applet画布上,单击鼠标并放置 bean。需要设置某些属性,以便定制感应按钮。可以在详细信息窗口的属性附签中将感应按钮链接到创建的图片文件上。根据按钮状态的不同,显示的图片也有所不同:
(1) 正常图片:鼠标指针没有移动到按钮上时的图片。
(2) 移入时图片:鼠标指针移动到按钮上时的图片。
(3) 按下时的图片:鼠标单击按钮时的图片。
(4) 禁止时图片:用户不能操作按钮时的图片。

在详细信息窗口的属性附签中为不同的感应按钮状态指定不同的图片。选择图片属性,然后单击右边的按钮。屏幕上将显示“打开”对话框,可以指定 3LSbutton3.jpg 作为图片属性,3LSbutton3P.jpg和 3LSbutton3R.jpg分别作为按下时图片和移入时图片属性。将按钮的名称属性修改为3LostSoulsButton。如果没有定义感应按钮的移入时图片、单击时图片或者禁止时图片,那么 BeanBuilder 将使用已经指定的艺术图片。
在创建连接之前,选择动画 bean 并且将它的自动启动属性设置为否。如果将这个属性设置为是,自动启动属性将告诉applet在启动时自动播放动画。但是,在本样例中,我们希望单击感应按钮之后再播放动画。现在,我们开始创建连接。首先,必须确定选中按钮。通过下面的三种方法可以知道当前选中的 bean:选中 bean 的四周会显示选取控制端点,它的名称会显示在详细信息窗口的标题条中,它的名称会显示在主工具条的选定 Bean 的下拉列表中。如果选中了感应按钮,那么详细信息窗口(参见图3-8)的标题条将显示详细信息—3LostSoulsButton。单击连接附签,由于还没有定义任何连接,此时连接列表的内容为空。在事件下面选择第一个元素,屏幕上将显示一个下拉列表,可以在这里查看感应按钮的事件。因为我们希望单击按钮后播放动画,因此从列表中选择“单击”。接着选择 Bean 下面的元素,在这里查看当前applet中可以与感应按钮进行连接的 bean。在列表中选择动画1,最后的单元是操作列表,可以在这里查看单击感应按钮时动画 bean 执行的操作。为使动画在单击按钮时开始,选择启动操作。
图3-8:详细信息窗口

现在,请保存这个applet。保存之后,可以单击主工具条上的运行按钮进行测试。短暂的停顿之后,屏幕上将出现applet查看器(Applet Viewer)窗口并显示刚创建的运行applet。单击按钮测试动画的播放效果。测试完成之后,关闭applet查看器窗口。
通过类似的方法,可以添加声音并创建一些有趣的连接。单击主工具条上的试演按钮可以进行试演。单击主工具条上的发布按钮可以将刚才创建的 3 Lost Souls applet中包含的图像文件、动画文件以及 BeanBuilder 创建的 Java (.class) 文件放到服务器上。单击主工具条上的发布按钮启动发布向导,在向导的指导下将applet放置在本地文件系统或远程的任何地方。在这里,我们将applet发布到本地文件系统。定位域中已经添入文件夹名 Publish。这是运行applet所需的所有文件的位置。当然,可以修改此文件夹为所需文件夹。在发布向导上单击完成按钮之后,BeanBuilder 整理applet中包含的所有文件并把它们复制到指定的文件夹中。如果已经设置好 Web 服务器,那么只需把这些文件从发布文件夹复制到服务器的文件夹中即可。记住,必须把applet中的所有文件和 Java (.class) 文件放置在服务器的同一个文件夹中,以便applet能够正确运行。这样就完成Java动画的开发和发布。
总之, BeanBuilder 是一个applet开发环境。它提供了非常灵活的手段,帮助用户发挥 Java 的强大功能,并自带丰富的JavaBeans。它使得放置可视化控件、创建动画applet、写简单的Java代码变得容易。对需要客户端动态的页面,applet是理想的,而BeanBuilder是开发applet的及其优越的可视化制作工具。

3.5 VisualAge for Java

如果您熟悉 Java 程序设计,可以使用VisualAge for Java(VAJ)来创建和定制 JavaBean。在您使用Studio的向导构建Servlet时很可能需要复杂的JavaBean,这些JavaBean一般可使用VAJ来开发。也可使用VAJ来修改与完善由 Studio 向导生成的 Java Servlet 和 Bean。
VAJ是一个全功能的Java开发环境,包含一个智能化集成开发环境,内含丰富的Java类库、高性能Java编译器和虚拟机,集成了包括向导和调试器在内的多种工具,支持JavaBeans的开发,通过先进的版本控制技术和贮存(Repository)机制支持团队开发(team development)。
VAJ的工作台为你提供各种视图,每个视图作为笔记薄(Notebook)中的一页
 项目-在工作区中所有项目及所含包、类的树状视图
 包-所有包、类、方法的树状视图
 类-工作区中的所有类的列表
 接口-工作区的所有接口及其方法的列表
 所有问题-所有出错元素及相应错误信息的列表

项目页允许你为一个元素作标签,这样只需简单的一次单击就可定位到它。另外,当你保存文件时,将进行编译和错误标志,更正错误无需长时间编译,从而体现了应用的快速开发。使用VAJ的工作台进行Java 编程的步骤如下:
 创建项目(和包)
 创建类(可使用向导)
 添加方法(可使用向导)
 在源代码页中编辑方法,在菜单上单击保存-将进行快速编译
 单击“运行”按钮测试代码

使用VAJ的导入/导出功能可以将有关文件(JAR、class、java)导入或导出VAJ的开发环境。值得关注的是,WebSphere可在整个VAJ中运行,允许你在VAJ环境中编写和调试servlet和JSP。对于VAJ2.0来说,需要下列步骤:
 安装VisualAge for Java update
 载入JSP 执行监视器,改正语法错误
 在com.ibm.servlet包中启动SERunner web服务

而VAJ3.0已经和WebSphere Application Server、WebSphere Studio、DB2 Universal Database紧密集成,从而成为IBM电子商务应用框架的关键点。VAJ3.0的新的特性主要包括:
 WebSphere 测试环境
 JSP/Servlet 开发环境
 存贮过程构建器
 SQLJ工具
 EJB 开发环境(VAJ3.0企业版)
 Domino企业存取构建器(VAJ3.0企业版)
 XML元数据交换(XML Metadata Interchange、XMI)工具包(VAJ3.0企业版-技术预演)

...... [阅读全文]

博客订阅

feedsky Technorati Join My Community at MyBloglog!
抓虾 pageflakes
Rojo google reader
netvibes my yahoo
newsgator bloglines
鲜果 哪吒
有道 分享到饭否

标签云集

Heartnn@饭否

日志归档

最新日志

最新评论

我的收藏夹

门户
技术
游戏

关注者