本教程是一个有关 NetBeans IDE 4.1 中的 J2EE 开发功能的快速指南,而不是如何编写企业应用程序的说明性指南。
入门指南
在开始之前,必须确保安装了所需的所有软件。还必须配置 PointBase 数据库,并填充用来生成 CMP 实体 Bean 的数据库表。
设置环境
在开始之前,需要在计算机上安装 Sun Java System (SJS) Application Server Platform Edition 8.1(下载):
注意:如果在 JDK 5.0 中运行 IDE,则应用服务器还需要使用 JDK 5.0 中的虚拟机。要设置 IDE 使用的 JDK,请打开 IDE_INSTALL_DIR/etc/netbeans.conf,并在 netbeans_jdkhome 属性中输入 JDK 的路径。要设置应用服务器使用的 JDK,请编辑 AS_INSTALL_DIR/config/asenv(.bat) 文件并更改 AS_JAVA 环境变量。
安装了整个应用服务器后,需要在 NetBeans IDE 中注册该服务器。请注意,如果下载和安装的 NetBeans IDE 版本与应用服务器捆绑在一起,则不必执行此步骤。IDE 知道捆绑的应用服务器的位置。
转到 NETBEANS_INSTALL_DIR/bin 目录并运行 netbeans 命令以打开 NetBeans IDE 4.1。如果 java 不在 PATH 变量中,则在命令行中使用 --jdkhome /path/to/jdk 开关来启动 IDE,或将 netbeans_jdkhome="/path/to/jdk" 一行添加到 NETBEANS_INSTALL_DIR/etc/netbeans.conf 文件中。
在 IDE 中,从主窗口选择“工具”>“服务器管理器”。
单击“添加服务器”。选择 Sun Java Systems Application Server 8.1,并为此实例指定一个名称。然后单击“下一步”。
指定应用服务器的安装目录(例如 C:\Sun\Appserver),然后单击“下一步”。
从“位置”组合框中,选择应用服务器本地实例的位置。(可选)输入管理员用户名和口令。如果不希望在 IDE 用户目录中存储用户名和口令,可以将这些字段保留为空。IDE 在每次需要此信息时会提示您输入。
注意:缺省的管理员口令是 adminadmin。
最后,启动应用服务器:
在“运行环境”窗口中,右键单击应用服务器节点,然后选择“启动/停止服务器”以启动服务器。
展开应用服务器节点。该节点包含在应用服务器的管理控制台中看到的所有类别的子节点。通过右键单击任意一个节点并选择“属性”,可对应用服务器进行配置。
配置 PointBase 数据库
在本教程中,您将通过 PointBase 数据库服务器包含的其中一个表来生成 CMP Bean。PointBase 数据库服务器包含在 Sun Java System Application Server 下载文件中。
在“运行环境”窗口中,展开“数据库”节点。您会看到 jdbc:pointbase://localhost:9092/sample 数据库和 jdbc:pointbase://localhost:9092/sun-appserv-sample 数据库的节点。
注意:如果未看到这些节点,请展开“驱动程序”节点,右键单击 "Pointbase",然后选择“连接方法”。输入 jdbc:pointbase://localhost:9092/sample 作为数据库 URL,输入 pbpublic 作为用户名和口令,然后单击“确定”。
右键单击 jdbc:pointbase://localhost:9092/sample 数据库,然后选择“连接”。键入 pbpublic 作为用户名和口令,单击“确定”。
展开 sample 数据库节点和“表”节点。确保其中包含 CUSTOMER_TBL 节点,如下所示。
注意:如果修改了 sample 数据库,可使用此 Ant 生成脚本对其进行重写。将 Ant 脚本保存到计算机中,并在编辑器中打开它,然后编辑第 5 行上的 appsrv.root 属性,使其指向 SJS Application Server 的本地安装。接下来,在终端窗口中转到包含 Ant 脚本的文件夹,通过在命令行中键入 ant run 来运行其缺省目标。
对 EJB 模块进行编码
对 Enterprise Bean 进行编码非常容易。IDE 会兼顾所有实现细节,因此您可以集中精力对 EJB 模块的业务逻辑进行编码。
创建企业应用程序项目
在本示例中,我们将创建一个企业应用程序项目作为 Web 模块和 EJB 模块的容器。通过使用企业应用程序模板,您可以自动为 Web 模块和 EJB 模块创建项目。
选择“文件”>“新建项目”(Ctrl-Shift-N),然后从“企业”类别中选择企业应用程序模板。单击“下一步”。
将应用程序命名为 CustomerBook,然后指定项目位置。将其余设置保留为缺省值,然后单击“完成”。
生成 CMP 实体 Bean
现在,我们将生成访问 sample 数据库的实体 Bean。对于程序要访问的每个表,都需要一个对应的实体 Bean。
在“项目”窗口中,右键单击 EJB 模块的节点 (CustomerBook-EJBModule),然后选择“新建”>“通过数据库生成 CMP 实体 Bean”。
选择“JDBC 连接”作为数据库源,然后从组合框中选择 jdbc:pointbase://localhost:9092/sample 连接。
键入 ejb 作为包名,然后单击“下一步”。向导将显示选定数据库中的所有表。
选择 CUSTOMER_TBL 表,单击“添加”,然后单击“完成”。
IDE 将为 CUSTOMER_TBL 表以及从 CUSTOMER_TBL 引用的所有表(DISCOUNTCODE_TBL 和 MICROMARKETS_TBL)创建 CMP Bean。IDE 还会创建一个新的 JDBC 连接池和数据源,该连接池和数据源将在您部署项目时注册到应用服务器中。
对会话 Bean 进行编码
现在,我们将创建一个会话 Bean,用来处理 Web 应用程序客户机对实体 Bean 中的信息的访问。我们将创建一个空会话 Bean,生成对实体 Bean 的调用,然后添加一些业务方法。
在“项目”窗口中,右键单击 CustomerBook-EJBModule 项目节点,然后选择“新建”>“会话 Bean”。将该会话 Bean 命名为 CustomerFacade,并将其放在 ejb 包中。将 Bean 设置为无态 Bean,并且只有远程接口。然后单击“完成”。IDE 将创建此 Bean,并在源编辑器中打开其 Bean 类。
右键单击 Bean 类主体中的任意位置,选择“企业资源”>“调用 Enterprise Bean”。选择 CustomerTblEB Bean,然后单击“确定”。IDE 将在源文件的底部生成 lookupCustomerTbl 方法。
将以下内容添加到 Bean 类起始位置的变量声明中:
private ejb.CustomerTblLocalHome custHome;
现在,我们将在会话 Bean 的 create 方法中获取对实体 Bean 的 Home 接口的引用。删除 ejbCreate() 中的注释并添加以下语句:
custHome = lookupCustomerTblBean();
右键单击 Bean 类主体中的任意位置,选择“EJB 方法”>“添加业务方法”。指定以下信息:
元素 | 值 |
方法名 | getCustomerInfo |
返回类型 | String |
参数 | int custId |
异常 | javax.ejb.FinderException |
在源编辑器中,按如下内容编辑 getCustomerInfo 业务方法:
public String getCustomerInfo(int custId) throws javax.ejb.FinderException {
ejb.CustomerTblLocal customer = custHome.findByPrimaryKey(new Integer(custId));
return "Name: " + customer.getName() + ", E-mail: " +customer.getEmail();
}
最终的 CustomerFacadeBean.java 文件应如此处所示。
对 Web 模块进行编码
现在,我们需要对 Web 模块进行编码,该模块将为实体 Bean 提供用户接口。Web 模块包含一个 Servlet,允许用户按客户编号对客户进行搜索。
创建定制服务定位器
在上一部分中,我们在调用 Enterprise Bean 时通过 IDE 生成了内联查找代码。在本部分中,我们将创建一个定制服务定位器,IDE 将在生成对 Enterprise Bean 的调用时用到它。我们的服务定位器没有任何特殊功能,但您可以定制企业应用程序查找 Enterprise Bean 的方式。
在“项目”窗口中,右键单击 CustomerBook-WebModule 节点,然后选择“新建”>“文件/文件夹”。在向导中,从“企业”类别中选择服务定位器模板。单击“下一步”。
键入 ServiceLocator 作为类名,键入 Web 作为包,然后单击“完成”。
对 Servlet 进行编码
在最后的步骤中,我们将向 Web 模块添加一个 Servlet,通过它可以查找并显示 CUSTOMER_TBL 表中的每个客户的信息。
在“项目”窗口中,右键单击 CustomerBook-WebModule 节点,然后选择“新建”> "Servlet"。将 Servlet 命名为 CustomerDetail,然后将其放在 web 包中。
在源编辑器中,右键单击 Servlet 类主体中的任意位置,选择“企业资源”>“调用 Enterprise Bean”。选择 CustomerFacade 会话 Bean,将 web.ServiceLocator 类设置为服务定位器策略,然后单击“确定”。IDE 将插入该查找方法。
按如下所示编辑 processRequest 方法:
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet customerDetail</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Servlet customerDetail at " + request.getContextPath () + "</h1>");
String customerNr = request.getParameter("customer_nr");
if((customerNr != null) && !(customerNr.equals("")))
{
try{
ejb.CustomerFacadeRemote custFacade = lookupCustomerFacadeBean();
out.println("Customer's info for nr. " + customerNr + ": " + custFacade.getCustomerInfo(
Integer.parseInt(customerNr)));
}catch(javax.ejb.FinderException ex){
out.println("Customer with nr. " + customerNr +" not found");
}
}
out.println("<form>");
out.println("Customer number: <input type='text' name='customer_nr' />");
out.println("<input type=submit value=Select />");
out.println("</form>");
out.println("</body>");
out.println("</html>");
out.close();
}
最终的 CustomerDetail.java Servlet 应如此处所示。
生成和部署应用程序
现在,就可以将企业应用程序部署到应用服务器中了。不需要再对部署描述符进行其他配置。IDE 已经配置了部署描述符,并为企业应用程序准备了新的连接池和数据源。
设置程序的缺省 Web 页
缺省情况下,Web 应用程序在运行时会显示其 index.jsp 页。由于我们的 index.jsp 是空的,因此希望 CustomerBook 项目显示 CustomerDetail Servlet。
在“项目”窗口中,右键单击 CustomerBook 项目,然后选择“属性”。接下来在左面板中单击“运行”。
在“相对 URL”字段中键入 /CustomerDetail。
运行应用程序
右键单击 CustomerBook 项目并选择“运行项目”。IDE 会执行以下所有任务:
生成企业应用程序项目及其所有子项目(Web 模块项目和 EJB 模块项目)。
如果服务器尚未运行,请启动它。
如果企业应用程序已部署到应用服务器上,请卸下它。
将企业应用程序部署到应用服务器上。
打开在指定的相对 URL 中的 Web 模块。
您应在外部浏览器中看到以下页面。在键入某一客户编号并按 Enter 键时,页面中应显示该客户的信息。
疑难解答
一些常见问题包括:
打开 CustomerDetail 时出现 HTTP Status 404 错误。这意味着,应用服务器找不到 CustomerDetail Servlet.确保上下文根目录 (/CustomerBook-WebModule) 与为 Web 模块所设置的根目录匹配(右键单击 Web 模块的项目节点 >“属性”>“运行”>“上下文路径”)。
在 CustomerDetail 表单中提交客户编号时出现 javax.transaction.TransactionRolledbackException:CORBA TRANSACTION_ROLLEDBACK 错误。这通常意味着,服务器无法访问数据库。如果出现这种情况,请执行以下操作:
确保 PointBase 数据库服务器正在运行。要启动 PointBase,请选择“工具”> "PointBase" >“启动本地 PointBase 数据库”。
确保在应用服务器中正确注册了资源池和数据源。要对其进行检查,可转到“运行环境”窗口并展开应用服务器的 JDBC 节点。“JDBC 资源”节点应包含 jdbc/pointbase_sample 节点,“连接池”节点应包含 jdbc_pointbase_sampleConnectionPool 节点。注册连接池和数据源(如果尚未注册):
展开 CustomerBook-EJBModule 项目的“服务器资源”节点。
右键单击 connection-pool-jdbc_pointbase_sample.sun-resource 节点并选择“注册”。
对 datasource-jdbc_pointbase_sample.sun-resource 节点执行相同的步骤。
注意:要查看服务器日志,请转到“运行环境”窗口,右键单击应用服务器节点,然后选择“查看服务器日志”。