|
|
第3课 在第2课“简单entity bean”中, 由Servlet负责查找和创建Session Bean, 并进行bonus计算,然后查找和创建 entity bean并储存bonus 值和相关的社会安全号码。这一课对该范例进行了修 改,使session bean负责查找和创建entity bean。 由于session bean 和 entity bean是合作的关系,因此,它们被捆绑到一个JAR文件中进行部署。 注:有些人在学习这一课时,对如何在一个JAR 文件中处理2个Bean的问题感到困惑。如果你也出现这样问题,那么可以删除带有 两个bean的JAR文件,并将每个bean添加到它们各自的JAR文件中。在生成SQL和部 署之前,可能需要停止并且重新启动服务器。 修改Session Bean
在这一课中,如图14所显示的,
entity bean是session hean的一个客户。这就是说,entity bean从session bean那里获 得数据,而不是像第2课中所介绍的那
样从
图14 : 两个Bean的互操作CalcHome
不修改 package Beans;
import java.rmi.RemoteException;
import javax.ejb.CreateException;
import javax.ejb.EJBHome;
public interface CalcHome extends EJBHome {
public Calc create()
throws CreateException, RemoteException;
}
Calc
修改Calc接口中的 另一方面, package Beans;
import javax.ejb.EJBObject;
import java.rmi.RemoteException;
import javax.ejb.DuplicateKeyException;
import javax.ejb.CreateException;
public interface Calc extends EJBObject {
public Bonus calcBonus(int multiplier,
double bonus,
String socsec)
throws RemoteException,
DuplicateKeyException,
CreateException;
public Bonus getRecord(String socsec)
throws RemoteException;
}
CalcBean
创建entity bean的代码从 package Beans;
import java.rmi.RemoteException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;
import javax.ejb.DuplicateKeyException;
import javax.ejb.CreateException;
public class CalcBean implements SessionBean {
BonusHome homebonus;
//Throw DuplicateKeyException and CreateException
//so BonusServlet can catch and handle these
//exception conditions.
public Bonus calcBonus(int multiplier,
double bonus, String socsec)
throws DuplicateKeyException,
CreateException {
Bonus theBonus = null;
double calc = (multiplier*bonus);
try {
InitialContext ctx = new InitialContext();
Object objref = ctx.lookup("bonus");
homebonus = (BonusHome)
PortableRemoteObject.narrow(
objref, BonusHome.class);
} catch (Exception NamingException) {
NamingException.printStackTrace();
}
//Store data in entity bean
try {
theBonus = homebonus.create(calc, socsec);
} catch (java.rmi.RemoteException e) {
String message = e.getMessage();
e.printStackTrace();
}
return theBonus;
}
public Bonus getRecord(String socsec) {
Bonus record = null;
//Use primary key to retrieve data from entity bean
try {
record = homebonus.findByPrimaryKey(socsec);
} catch (java.rmi.RemoteException e) {
String message = e.getMessage();
} catch (javax.ejb.FinderException e) {
e.printStackTrace();
}
return record;
}
public void ejbCreate() { }
public void setSessionContext(
SessionContext context){
}
public void ejbRemove() { }
public void ejbActivate() { }
public void ejbPassivate() { }
public void ejbLoad() { }
public void ejbStore() { }
}
修改Servlet
BonusServlet程序与第二课“简单
entity bean” 对 public class BonusServlet extends HttpServlet {
CalcHome homecalc;
//Need Bonus variables because CalcBean methods
//called in the doGet method return instances
//of type Bonus
Bonus theBonus, record;
public void init(ServletConfig config)
throws ServletException{
try {
InitialContext ctx = new InitialContext();
Object objref = ctx.lookup("calcs");
homecalc = (CalcHome)
PortableRemoteObject.narrow(
objref, CalcHome.class);
} catch (Exception NamingException) {
NamingException.printStackTrace();
}
}
同前面的第二课“简单的entity
bean” 中一样, try {
Calc theCalculation;
//Retrieve Bonus and Social Security Information
String strMult = request.getParameter(
"MULTIPLIER");//Calculate bonus
Integer integerMult = new Integer(strMult);
multiplier = integerMult.intValue();
socsec = request.getParameter("SOCSEC");
//Calculate bonus
double bonus = 100.00;
theCalculation = homecalc.create();
//Call session bean
//Pass 3 parameters:multiplier, bonus, and socsec
theBonus = theCalculation.calcBonus(
multiplier, bonus, socsec);
record = theCalculation.getRecord(socsec);
//Display data returned by session bean
out.println("<H1>Bonus Calculation</H1>");
out.println("<P>Soc Sec retrieved: " +
record.getSocSec() + "<P>");
out.println("<P>Bonus Amount retrieved: " +
record.getBonus() + "<P>");
out.println("</BODY></HTML>");
} catch (javax.ejb.DuplicateKeyException e) {
String message = e.getMessage();
out.println("<H1>Bonus Calculation</H1>");
out.println("<P>Soc Sec passed in: " + socsec +
"<P>");
out.println("<P>Multiplier passed in: " +
multiplier + "<P>");
out.println("<P>Duplicate primary key<P>");
out.println("</BODY></HTML>");
} catch (Exception CreateException) {
CreateException.printStackTrace();
}
编译
首先,编译session bean和Servlet。参考第一课进行路径和类路径设置以及 放置源文件的位置信息。 编译Session Bean
Unix
#!/bin/sh
cd /home/monicap/J2EE
J2EE_HOME=/home/monicap/J2EE/j2sdkee1.2.1
CPATH=.:$J2EE_HOME/lib/j2ee.jar
javac -d . -classpath "$CPATH" Beans/CalcBean.java
Beans/CalcHome.java Beans/Calc.java
Windows
cd \home\monicap\J2EE
set J2EE_HOME=\home\monicap\J2EE\j2sdkee1.2.1
set CPATH=.;%J2EE_HOME%\lib\j2ee.jar
javac -d . -classpath %CPATH% Beans/CalcBean.java
Beans/CalcHome.java Beans/Calc.java
编译Servlet
Unix:
cd /home/monicap/J2EE/ClientCode
J2EE_HOME=/home/monicap/J2EE/j2sdkee1.2
CPATH=.:$J2EE_HOME/lib/j2ee.jar:
/home/monicap/J2EE
javac -d . -classpath "$CPATH" BonusServlet.java
Windows:
cd \home\monicap\J2EE\ClientCode
set J2EE_HOME=\home\monicap\J2EE\j2sdkee1.2
set CPATH=.;%J2EE_HOME%\lib\j2ee.jar:\home\monicap\J2EE
javac -d . -classpath %CPATH% BonusServlet.java
启动平台和工具
为了运行这个范例,需要启动J2EE服务器、部署工具和Cloudscape数据库。在 不同的窗口中,键入以下命令: j2ee -verbose
deploytool
cloudscape -start
如果不成功,则可从 Unix
j2sdkee1.2.1/bin/j2ee -verbose
j2sdkee1.2.1/bin/deploytool
j2sdkee1.2.1/bin/cloudscape -start
Windows
j2sdkee1.2.1\bin\j2ee -verbose
j2sdkee1.2.1\bin\deploytool
j2sdkee1.2.1\bin\cloudscape -start
装配应用
步骤为:
创建新J2EE应用
同第1课和第2课中更新J2EE应用不同,这些步骤创建一个新的J2EE应用。 删除
创建
新应用文件选择器:
创建新Web组件
现在仔细回顾一下创建WAR文件的步骤。这些步骤在第一课中已经介绍过,下 面再对其进行总结。选择2BeansApp后, 文件菜单:
介绍 :
WAR文件一般属性 :
WAR文件一般属性 :
选择组件类型
组件一般属性:
组件初始化参数:
组件别名 :
检查 窗口:
将Session Bean 和entity bean捆绑到一个JAR文件中
在本课中,我们会将session bean和entity bean捆绑到同一个JAR文件中。为 此,首先要创建一个只带有session bean的JAR文件,然后将entity bean添加到 这个JAR文件中。 创建带有session bean的JAR文件
选定 文件菜单:
介绍 :
EJB JAR :
Enterprise Bean JAR类:
EJB JAR :
一般项目 :
环境项目:
Enterprise Bean 引用
资源引用:
安全:
事务管理 :
检查设置:
本地应用:
添加entity bean
选定 文件菜单:
介绍 :
EJB JAR :
Enterprise Bean JAR类:
EJB JAR :
一般项目 :
Entity 设置:
环境项目:
Enterprise Bean 引用:
资源引用:
安全:
事务管理 :
检查设置:
本地应用:
在对J2EE应用部署之前,需要为entity bean指定部署方法,生成SQL。 具体 如下: 本地应用窗口:
检查窗口:
部署设置窗口:
注: 如果出现连接被拒绝的错 误,则应按照“启动平台和工具”中描述的 方法启动数据库。 当生成SQL后,
验证和部署J2EE应用
在部署应用之前最好能够运行验证器。验证器将挑出应用组件中的错误,如编 译器未曾捕捉到的丢失的enterprise bean方法。 注 : 如果在验证或部署时出 现保存错误,则需要关闭一切程序,重新启动服务器和工具。 验证:
注: 在Version 1.2.1软件中, 你可能会得到一个 部署:
注: 不要选择“Return Client Jar”选项。只有在为客户程序部署独立的应用时才选择这个选项。本实例使用了 一个servlet和HTML页面,因此,不应该选择这个选项。若选择这个选项,会生成 一个带有独立式应用所需部署信息的JAR文件。
图15 : 部署应用
运行J2EE应用
web 服务器的运行端口默认为8000。若要打开
Bonus Calculation
Soc Sec retrieved: 777777777
Bonus Amount Retrieved: 200.0
如果两次提交的社会安全号码相同,会出现类似于以下的信息: Bonus Calculation
Soc Sec passed in: 777777777
Multiplier passed in: 2
Duplicate primary key
[TOP]
|
|
||||||||||||||||||||||||||||||||||||