|
|
第2课 本课将扩展第一课中的范例来讲述如何使用bean。 随J2EE SDK提供有Cloudscape数据库,不需要对你的环境进行设置便可以使 entity bean对它进行访问。在这个范例中,你无须编写任何SQL或JDBC代码来 创建数据库表格或进行数据库访问操作。在安装和部署的过程中会生成数据库表, 部署工具也生成SQL代码。在第7课“JDBC技术 和“Bean-managed persistence” 中将介绍如何为entity bean编写SQL代 码。 创建entity bean
一个entity bean代表存储在一个数据库表一行中的持久性的数据。当一个 entity bean被创建时,该数据被写入到相应的数据库表行中,如果entity bean 中的数据被更新,则相应的数据库表格行中的数据也被更新。在进行这些数据库 表格创建和行的更新时不需要你编写SQL或JDBC代码。 entity bean数据是永久性的,因为它可以不受服务器崩溃的影响。
BonusHome
第一课中的 而 package Beans;
import java.rmi.RemoteException;
import javax.ejb.CreateException;
import javax.ejb.FinderException;
import javax.ejb.EJBHome;
public interface BonusHome extends EJBHome {
public Bonus create(double bonus, String socsec)
throws CreateException, RemoteException;
public Bonus findByPrimaryKey(String socsec)
throws FinderException, RemoteException;
}
Bonus
在创建了home 接口之后,容器会创建远程接口和entity bean。 package Beans;
import javax.ejb.EJBObject;
import java.rmi.RemoteException;
public interface Bonus extends EJBObject {
public double getBonus() throws RemoteException;
public String getSocSec() throws RemoteException;
}
BonusBean
如果由于某种原因,你想让entity bean来管理它自己的数据维护或事务,就 需要按照以下
当 接下来,容器调用 其它空方法作为回调方法被调用,以通知bean将发生某种事件。如果你使用的 是bean-managed persistence,还得提供某些方法中的行为,如果需要进行始化 操作或bean-specific的清除,则得为余下的方法提供行为。这些清除和初始化操 作在bean运行周期的某些特定时间发生,容器在适当的时候会通知bean并调用可 用的方法。以下是对空方法的简单描述:
客户可通过调用 package Beans;
import java.rmi.RemoteException;
import javax.ejb.CreateException;
import javax.ejb.EntityBean;
import javax.ejb.EntityContext;
public class BonusBean implements EntityBean {
public double bonus;
public String socsec;
private EntityContext ctx;
public double getBonus() {
return this.bonus;
}
public String getSocSec() {
return this.socsec;
}
public String ejbCreate(double bonus,
String socsec)
throws CreateException{
//Called by container after setEntityContext
this.socsec=socsec;
this.bonus=bonus;
return null;
}
public void ejbPostCreate(double bonus,
String socsec) {
//Called by container after ejbCreate
}
//These next methods are callback methods that
//are called by the container to notify the
//Bean some event is about to occur
public void ejbActivate() {
//Called by container before Bean
//swapped into memory
}
public void ejbPassivate() {
//Called by container before
//Bean swapped into storage
}
public void ejbRemove() throws RemoteException {
//Called by container before
//data removed from database
}
public void ejbLoad() {
//Called by container to
//refresh entity Bean's state
}
public void ejbStore() {
//Called by container to save
//Bean's state to database
}
public void setEntityContext(EntityContext ctx){
//Called by container to set Bean context
}
public void unsetEntityContext(){
//Called by container to unset Bean context
}
}
修改Servlet
关于 public class BonusServlet extends HttpServlet {
CalcHome homecalc;
BonusHome homebonus;
Bonus theBonus, record;
public void init(ServletConfig config)
throws ServletException{
try {
InitialContext ctx = new InitialContext();
Object objref = ctx.lookup("bonus");
Object objref2 = ctx.lookup("calcs");
homebonus=(
BonusHome)PortableRemoteObject.narrow(
objref, BonusHome.class);
homecalc=(CalcHome)
PortableRemoteObject.narrow(
objref2, CalcHome.class);
} catch (Exception NamingException) {
NamingException.printStackTrace();
}
}
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();
calc = theCalculation.calcBonus(
multiplier, bonus);
//Create row in table
theBonus = homebonus.create(calc, socsec);
record = homebonus.findByPrimaryKey(socsec);
//Display data
out.println("<H1>Bonus Calculation</H1>");
out.println("<P>Soc Sec passed in: " +
theBonus.getSocSec() + "<P>");
out.println("<P>Multiplier passed in: " +
multiplier + "<P>");
out.println("<P>Bonus Amount calculated: " +
theBonus.getBonus() + "<P>");
out.println("<P>Soc Sec retrieved: " +
record.getSocSec() + "<P>");
out.println("<P>Bonus Amount retrieved: " +
record.getBonus() + "<P>");
out.println("</BODY></HTML>");
//Catch duplicate key error
} catch (javax.ejb.DuplicateKeyException e) {
String message = e.getMessage();
//Display data
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>Bonus Amount calculated: " +
calc + "<P>");
out.println("<P>" + message + "<P>");
out.println("</BODY></HTML>");
} catch (Exception CreateException) {
CreateException.printStackTrace();
}
}
编译
首先, 编译entity bean和Servlet。 参考第一课进行路径和类路径的设置, 以及源文件的位置信息。 编译entity 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/BonusBean.java
Beans/BonusHome.java Beans/Bonus.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/BonusBean.java
Bean s/BonusHome.java Beans/Bonus.java
编译Servlet
Unix:
cd /home/monicap/J2EE/ClientCode
J2EE_HOME=/home/monicap/J2EE/j2sdkee1.2.1
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.1
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
装配和部署
步骤为:
更新应用文件
WAR文件包含
注:
上一课的
创建Entity Bean
为entity bean创建EJB JAR的步骤与第一课涉及的session bean的步骤很相 似。仅有几处不同, 下面将对这些不同之处加以解释。 注: 在这一课中,entity bean 与session bean分别在两个不同的JAR文件中,本课中延续了第一课中的范例,只 作了很小的改动。因为这些bean有相关的功能,你可以将它们捆绑并部署到同一 个JAR文件中。第3课将介绍如何把这些相关的bean捆绑到同一个JAR文件中。 文件菜单:
介绍 :
EJB JAR :
将内容添加到JAR:
图11 : 将类添加到BonusJar
EJB JAR :
通常: :
Entity 设置:
环境项目:
Enterprise Bean 引用s:
资源引用:
安全:
事务管理 :
图12 事务管理
本地应用 :
在部署J2EE应用之前,需要为entity bean指定部署设置,生成SQL。 具体如 下: 本地应用窗口:
检查窗口:
部署设置:
注: 如果出现连接被拒绝的错 误,则应按照“启动平台和工具”中描述的 方法启动数据库。
图13 : 生成SQL和数据库表
验证和部署J2EE应用
验证:
注:
在Version 1.2软件中,可 能会出现一个
部署:
注: 不要选择“Return Client Jar”选项。只有在为客户程序部署独立的应用时才选择这个选项。本范例使用了 一个Servlet和HTML页面,因此,不应该选择这个选项。若选择这个选项,会生成 一个带有独立式应用所需部署信息的JAR文件。
运行J2EE应用
web 服务器的运行端口默认为8000。 若要打开 填入社会安全号码和乘数,点击“提交”按钮。 Bonus Calculation
Soc Sec passed in: 777777777
Multiplier passed in: 25
Bonus Amount calculated: 2500.0
Soc Sec retrieved: 7777777777
Bonus Amount retrieved: 2500.0
如果返回到 Bonus Calculation
Soc Sec passed in: 777777777
Multiplier passed in: 2
Bonus Amount calculated: 200.0
Duplicate primary key.
[TOP] |
|
||||||||||||||||||||||||||||||||||||