对会话 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 应如此处所示。
