原标题:实战J2EE开发购物网站之EJB篇
版权申明:本文所有内容均来自其作者马宣(经典论坛IDmaxuan9),仅授权蓝色理想,经典论坛。
作者:maxuan9
版权:maxuan9
EJB是什么想必不用我再多费唇舌,在这里我会教大家写一个很简单的EJB(仅仅在jsp中显示在数据库中类似菜单的记录,当然更多的复杂操作,我们将会在以后继续完善,请关注此贴),这样更能让大家看清楚,分析透彻,让初学者更快的跨过这道坎,我们将写一个CMP的实体BEAN,与数据库打交道,而且写一个model进行调用,还会写一个sessionBEAN将操作封装,为了取得和这个EJB的联系进行操作,我们还必须写一个javabean,为了显示其操作结果,我们还得有一个JSP的页面,虽然JSP也可以直接操作EJB,但这并不是推荐的办法,除了安全、性能之外,在J2EE的体系中,JSP处于视图层,它只需要请求或显示最终结果,而将具体的动作和逻辑业务关系放到了EJB和javabean中。
在理清思想之后,我们需要组建这次的应用平台,和起码的应用工具。
(PS:这次不仅仅开发一个EJB,还要把它放到网络应用中,可以算是最小型的J2EE体系,JSP将采用struts MVC的设计方式,请大家注意看)
数据库平台:MySQL (这次实列只建一张表,无需劳烦Oracle大架)
J2EE应用平台:weblogic6.1SP2(本人最钟爱的版本)
注:本文所采用的javabean和EJB的联系交互仅限weblogic平台。
struts 1.1:JSP的Framework MVC设计模式(请到GOOGL搜索下载,选择合适的下载点很重要)
Jbuilder:EJB的设计编写工具
struts-console-2.2:编写struts-config.xml的好工具,到处搜搜吧,我忘了哪里下的!不过真是好用,极力推荐。
MYSQL.jar:MYSQL数据库的JDBC驱动。
在将以上工具准备齐全之后,我们就可以天始动手了,MYSQL的配置,J2EE、weblogic环境的架设,请看置顶精华贴。
首先,我们先建一个mytest的数据库,然后建一张myejb的表,在这张表里只有两个字段:DlDm(大类代码)、DlMc(大类名称),将DlDm设为主键,类型为varchar,长度为4,DlMc类型为varchar,长度为50。以下是我用Navicat的截图。
然后我们往里先插入一些数据,如下图所示。
在建完数据库之后,我们就要开始进行EJB的开发了,先建个lib的目录,将一些要用的库文件放到其中,首先就把mysql的JDBC驱动放进去吧。然后解压下载的struts包,将lib目录下的所有jar文件也放到这个目录中,我所用的Struts是1.1b1。
接下来,我们将请出Jbuilder啦,用Jbuilder开发EJB,就像用DW写网页一样方便快捷。首先我们还是将Jbuilde的库配置一下,先建一个struts 1.1 lib的库,把刚才我们放到lib目录中的除mysql外的jar都添加进去,这就是将来开发编写javabean要用到的啦!
然后我们建一个mysql的库,把mysql.jar添加进去。
接着,我们需要在EnterPRise setup中设置Database Drivers,点ADD按钮,将刚才的mysql库加进去。
在点OK以后,你需要重启一下你的JBuilder。
好了,现在我们开始新建一个应用,这里我取名为myEJB,然后一路next,直到完成,在这里我们不忙先把Struts库加进去。
然后我们可以开始开发EJB啦,首先新建一个EJB Module,如下图
接着,我们为它取名为EJB,版本为2.0,在下面的输出路径中,我选择了放到lib目录中。
在接下来,我们在下面的DataSources点右键,选取Import Schema From Database
在出现的对话框中,按下图所填写即可,这里的Driver和URL是连接mysql的写法,下面是连接MYSQL数据库的用户名和密码,最下面的JNDI name我们命名为mywork,这里所写的名字要与以后在配置weblogic中的名字相同。
在连接成功之后,我们会看到下图,点开mywork会出现刚才在MYSQL中建的表。
在myejb的表上点右键,在出现的菜单中选第一项Create CMP 2.0 Entity Bean,建立一个CMP的实体BEAN文件。
由于我们将EJB,和javabean都放到一个application中编辑,所以为了以后好区分,我们点击在右视图中的Myejb,在出来的菜单中选Classes and packages,在出现的对话框中我们加一个.maxuan.ejb,如下图所示。
最后我们看到JBuilder已经为我们完成了基本的CMP实体BEAN文件。
接下来,我们需要先写一个调用模型,新建一个CLASS,打包到myejb.maxuan.ejb.model中。
进入讨论组讨论。
下图是这个文件的源代码。MyejbMd
package myejb.maxuan.ejb.model;
import java.io.*;
public class MyejbMd implements Serializable {
public MyejbMd() {
}
public String dlDm;
public String dlMc;
public String action;
public String getDlDm() {
return dlDm;
}
public void setDlDm(String dlDm) {
this.dlDm = dlDm;
}
public String getDlMc() {
return dlMc;
}
public void setDlMc(String dlMc) {
this.dlMc = dlMc;
}
public String getAction() {
return action;
}
public void setAction(String action) {
this.action = action;
}
private void writeObject(ObjectOutputStream oos) throws IOException {
oos.defaultWriteObject();
}
private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException {
ois.defaultReadObject();
}
}
然后我们需要编辑实体BEAN文件来引入模型和对数据库的基本操作。
Myejb.java文件
package myejb.maxuan.ejb;
import javax.ejb.*;
import java.util.*;
import myejb.maxuan.ejb.model.*;
public interface Myejb extends javax.ejb.EJBLocalObject {
public String getDlDm();
public void setDlMc(String dlMc);
public String getDlMc();
public MyejbMd getDlMd();
public void setMyejbMd(MyejbMd dlMd);
}
MyejbBean.java文件
package myejb.maxuan.ejb;
import javax.ejb.*;
import myejb.maxuan.ejb.model.*;
abstract public class MyejbBean implements EntityBean {
EntityContext entityContext;
public java.lang.String ejbCreate(java.lang.String dlDm) throws CreateException {
setDlDm(dlDm);
return null;
}
public void ejbPostCreate(java.lang.String dlDm) throws CreateException {
/**@todo Complete this method*/
}
public java.lang.String ejbCreate(java.lang.String dlDm, java.lang.String dlMc) throws CreateException {
setDlDm(dlDm);
setDlMc(dlMc);
return null;
}
public void ejbPostCreate(java.lang.String dlDm, java.lang.String dlMc) throws CreateException {
/**@todo Complete this method*/
}
public void ejbRemove() throws RemoveException {
/**@todo Complete this method*/
}
public abstract void setDlDm(java.lang.String dlDm);
public abstract void setDlMc(java.lang.String dlMc);
public abstract java.lang.String getDlDm();
public abstract java.lang.String getDlMc();
public void ejbLoad() {
/**@todo Complete this method*/
}
public void ejbStore() {
/**@todo Complete this method*/
}
public void ejbActivate() {
/**@todo Complete this method*/
}
public void ejbPassivate() {
/**@todo Complete this method*/
}
public void unsetEntityContext() {
this.entityContext = null;
}
public void setEntityContext(EntityContext entityContext) {
this.entityContext = entityContext;
}
public myejb.maxuan.ejb.model.MyejbMd getDlMd() {
MyejbMd dlMd = new MyejbMd();
dlMd.setDlDm(getDlDm());
dlMd.setDlMc(getDlMc());
return dlMd;
}
public void setMyejbMd(MyejbMd dlMd){
setDlMc(dlMd.getDlMc());
}
}
接着我们要编辑最后的MyejbHome.java,双击左边树的EJB,在右边的面板中选中Myejb后点右键,在出现的菜单中选ADD,选取下面的Findel方法,如下图所示:
在接着出现的对话框中选择填写如下:
我们继续编辑MyejbHome.java文件
package myejb.maxuan.ejb;
import javax.ejb.*;
import java.util.*;
public interface MyejbHome extends javax.ejb.EJBLocalHome {
public Myejb create(String dlDm) throws CreateException;
public Myejb create(String dlDm, String dlMc) throws CreateException;
public Collection findAll() throws FinderException;
public Myejb findByPrimaryKey(String dlDm) throws FinderException;
}
好了,实体BEAN文件我们已经写完了,现在我们编译一下,看有没有什么错误。
新手提示:在引入模型之前,我们需要先编译一下模型文件。
在接下来我们将写一个SessionBean。
我们继续来完成这个EJB,我们需要来写一个SessionBean,创建方法与创建实体BEAN一样,这里不在多说,只把它们的源码贴出,请大家仔细看,理解其中的意义!
这里我将SessionBean命名为MyejbWeb
MyejbWeb.java
package myejb.maxuan.ejb;
import javax.ejb.*;
import java.util.*;
import java.rmi.*;
import java.sql.*;
import java.io.*;
import myejb.maxuan.ejb.model.*;
public interface MyejbWeb extends javax.ejb.EJBObject {
public ArrayList getDlList() throws RemoteException;
public MyejbMd getDl(String dlDm) throws RemoteException;
}
MyejbWebBean.java
package myejb.maxuan.ejb;
import javax.ejb.*;
import java.util.*;
import java.sql.*;
import java.sql.Date;
import java.io.InputStream;
import java.io.OutputStream;
import myejb.maxuan.ejb.model.*;
public class MyejbWebBean implements SessionBean {
SessionContext sessionContext;
public void ejbCreate() throws CreateException {
/**@todo Complete this method*/
}
public void ejbRemove() {
/**@todo Complete this method*/
}
public void ejbActivate() {
/**@todo Complete this method*/
}
public void ejbPassivate() {
/**@todo Complete this method*/
}
public void setSessionContext(SessionContext sessionContext) {
this.sessionContext = sessionContext;
}
public ArrayList getDlList(){
ArrayList dlList=new ArrayList();
try {
javax.naming.Context context = new javax.naming.InitialContext();
MyejbHome dlHome= (MyejbHome)context.lookup("Myejb");
Collection dlCntl = dlHome.findAll();
Iterator iterator = dlCntl.iterator();
while(iterator.hasNext()){
Myejb myEjb = (Myejb) iterator.next();
MyejbMd dlMd = myEjb.getDlMd();
dlList.add(dlMd);
}
}catch (Exception ex) {
throw new EJBException(ex);
}
return dlList;
}
public MyejbMd getDl(String dlDm){
MyejbMd dlMd=new MyejbMd();
try {
javax.naming.Context context = new javax.naming.InitialContext();
MyejbHome dlHome= (MyejbHome)context.lookup("Myejb");
try{
Myejb myEjb = dlHome.findByPrimaryKey(dlDm);
dlMd = myEjb.getDlMd();
}catch(FinderException fe){
dlMd=null;
}
}catch (Exception ex) {
throw new EJBException(ex);
}
return dlMd;
}
}
MyejbWebHome.java
package myejb.maxuan.ejb;
import javax.ejb.*;
import java.util.*;
import java.rmi.*;
public interface MyejbWebHome extends javax.ejb.EJBHome {
public MyejbWeb create() throws CreateException, RemoteException;
}
至此,我们的EJB部份已经完成,明天我们将继续写一个javabean来访问这个EJB!同时我们也会引入struts,请大家留意!
PS:虽然这只是一个简单的EJB网络应用结构,但却是建立J2EE大型应用的基础,希望大家多多交流!!
进入讨论组讨论。
(出处:http://www.knowsky.com)