Chinaunix首页 | 论坛 | 博客
  • 博客访问: 446502
  • 博文数量: 750
  • 博客积分: 40000
  • 博客等级: 大将
  • 技术积分: 4970
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-09 12:36
文章分类

全部博文(750)

文章存档

2011年(1)

2008年(749)

我的朋友
最近访客

分类:

2008-09-09 15:19:23

     本教程将向您介绍创建具有容器管理持久性(CMP 实体 Bean)的实体 Enterprise BeansTM 组件的基本步骤。我们使用 NetBeansTM IDE 4.1 在现有的 PointBaseTM 数据库基础上生成 CMP 实体 Bean。然后创建一个简单的会话 Bean 来访问数据库信息和 Web 模块客户机。

      本教程是一个有关 NetBeans IDE 4.1 中的 J2EE 开发功能的快速指南,而不是如何编写企业应用程序的说明性指南。

      入门指南

      在开始之前,必须确保安装了所需的所有软件。还必须配置 PointBase 数据库,并填充用来生成 CMP 实体 Bean 的数据库表。

      设置环境

      在开始之前,需要在计算机上安装 Sun 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("");
   out.println("");
   out.println("Servlet customerDetail");
   out.println("");
   out.println("");
   out.println("

Servlet customerDetail at " + request.getContextPath () + "

");

   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("

");
   out.println("Customer number: ");
   out.println("");
   out.println("");

   out.println(" ");
   out.println("");
   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 节点执行相同的步骤。

  注意:要查看服务器日志,请转到“运行环境”窗口,右键单击应用服务器节点,然后选择“查看服务器日志”。

【责编:Amy】

--------------------next---------------------

阅读(179) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~