在J2EE平台上开发企业应用
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 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(); } }
doGet方法中的try中的代码段里面创建了CalcBean和BonusBean的Home接口。在调用了calcBonus中的方法计算奖金之后,再调用BonusHome的create方法来产生一个实体Bean的实例,并且在数据库中相应的表中生成一行数据。在创建了数据表之后,BonusHome的findByPrimaryKey可以从数据表中取出与主键相同的一条记录。然后,将结果通过HTML页面的形式返回给浏览器。
在catch代码段里面处理了主键的重复的情况。数据表里面不能存在两行具有相同关键字的记录。所以,如果将重复的主键传递给容器,Servlet就会在创建实体Bean之前捕获到这个异常。这时,Servlet把重复的主键值,和传递进来的原始参数用HTML页面的形式返回给浏览器。
编译实体Bean:
先设定环境变量:
Classpath = J2EE安装目录\lib\j2ee.jar
J2EE_HOME = J2EE的安装目录
把例子放到J2EE的安装目录下面的Beans子目录下:然后在J2EE的安装目录下执行:
javac Beans/BonusBean.java Beans/BonusHome.java Beans/Bonus.java
编译Servlet:
把Servlet放到J2EE的安装目录下的ClientCode子目录下,然后在J2EE安装目录下执行:
javac BonusServlet.java
编译好之后,就该启动服务平台和配置工具了:
这个例子需要用到的有:J2EE服务、配置工具、Cloudscape数据库。除了前面两个环境变量以外,还需要将环境变量JAVA_HOME 设为 JDK的安装目录
然后在J2EE的安装目录下的\bin\目录下执行:
j2ee -verbose
deploytool
cloudscape -start
把三个服务启动。
配置步骤:
首先是更新Application:
Web包里面包括了BonusServlet和bonus.html文件。因为我们改变了BonusServlet,所以必须用新的BonusServlet代码来更新应用程序。先在Local Application Window中选择BonusApp,然后在Tools菜单中选择Update Application Files就可以了。
创建一个实体Bean
创建实体Bean和上个例子中的创建会话Bean非常相似。也是先在Files菜单中选New Enterprise Bean,然后在Add类文件的时候把Bonus.class,BonusHome.class,BonusBean.class三个类文件加入。但要注意Bean的类型这次应该选为Entity实体。
在Entity Setting对话框中,应该选择:Container-Managered persistence。在下面的窗口中,把bonus和socsec两个复选框都选上。下面的Primkey key class中填上java.lang.String。注意,Primary Key的类型必须是类的类型,而不能是原始类型。然后Next,一直到事务管理Transaction Management对话框。
选择容器管理事务:Container-managed transaction。
在下面的各个方法中,将create,findByPrimaryKey,getBonus,getSocSec这些方法设成required。这以为着在调用这些方法之前,容器要启动一个新的事务。正好在这些方法结束的前面要调用事务的commits方法。然后将BonusApp的JNDI设为BonusBean。
在配置应用程序以前。先要设定实体Bean的SQL代码:
在左边先选择实体Bean:BonusBean,在右边选择标签Entity。然后单击Deploymetn Setting按纽。将Database JNDI name 设为jdbc/Cloudscape。还要确定Create table on Deploy和Delete table on Undeploy两个复选框被选上。然后就可以单击Generate SQL,产生SQL代码了。(如果产生了数据库连接错误,那就是因为你没有启动数据库服务器。在J2EE的安装目录下的\bin\下,启动:Cloudscape -start)
SQL代码产生好之后,OK就可以了。
最后就是运行这个应用程序了。注意J2EE的默认端口号是8000
在浏览器的地址栏中输入:http://localhost:8000/BonusRoot/bonus.html
结果和上个例子应该是一样的。这里,如果你两次输入了重复的关键字,将得到如下类似的页面:
Bonus Calculation
Soc Sec passed in: 777777777
Multiplier passed in: 2
Bonus Amount calculated: 200.0
Duplicate primary key.
0
相关文章
