技术开发 频道

在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:
 
  BonusServlet的代码和上一个例子很相似,只是在init方法和doGet方法里面有点改动。这个例子的init里面既查询了CalcBean这个会话Bean,也查询了BonusBean这个实体Bean。
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
相关文章