• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

Jbuilder6.0+Weblogic6.0完成EJB开发部署

发布: 2007-7-01 20:40 | 作者: admin | 来源: | 查看: 11次 | 进入软件测试论坛讨论

领测软件测试网

  一、环境的建立

  1、 Weblogic6.0与ejb相关的环境配置

  与数据库发生关系的EJB,所以需要建立一个ConnectionPool和DataSource。

  ●创建ConnectionPool

  (1)我使用的是ORACLE8I数据库。将classes12.zip(oracle的type4类型jdbc驱动程序)拷贝到bea的相关目录(我这儿放在了mydomain下的lib目录下)。然后在setenv.cmd中的"set CLASSPATH="后面加上%WL_HOME%\config\mydomain\lib\classes12.zip;将驱动程序加入到classpath中。

  (2)启动weblogic并打开控制台(http://127.0.0.1:7001/console),选择左面数型结构的功能栏中的Services-----JDBC----Connection Pools---Create a new JDBC Connection Pool。

  (3)Name栏中输入自己为该Pool定义的名称。例如:TestConnectionPool

  在URL中输入:jdbc:oracle:thin:@127.0.0.1:1521:oracle (IP、端口号、服务名按照自己的修改);

  在Driver Classname栏中输入:oracle.jdbc.driver.OracleDriver;

  在Properties(key=value)栏中输入:

    user=scott
    password=tiger
    dll=ocijdbc8
    protocol=thin

  分别是数据库连接用户名、密码、动态连接库以及协议(其中用户名和密码按自己的修改)。

  在Target页签中选择服务器名,并Apply。

  (4)、其他的参数设置例如Intial Capacity等可以自己按照字面意思进行配置。
  ●创建Data Source

  (1)、在左面树型结构的Services---JDBC---Data Sources下Create a new JDBC Data Source

  (2)、在Name中输入自己定义的名称

  例如:TestDataSourc,在JNDI Name栏中输入:自己定义的名称;

  例如:CRMDBSource,在Pool Name中输入刚才创建的JDBC Connection Pool的Name, 上面的TestConnectionPool,在Targets页中选择服务器名称并Apply即可。

  这样就在Weblogic6.0中建立了ORACLE的数据库连接池和数据源。

  ●配置Weblogic的classpath

  由于我的ejb运行时需要调用别的类,所以必须在classpath中指定路径,例如:我要使用mydomain\applications\testfile这个目录下的文件。那么在setenv.cmd文件中进行如下修改

set APPLICATIONS=.\applications
set CLIENT_CLASSES=.\applications\testfile
set EX_WEBAPP_CLASSES=%WL_HOME%\config\mydomain\applications\testfile

  然后在set CLASSPATH中加入%CLIENT_CLASSES%;%EX_WEBAPP_CLASSES%;

  在startWeblogic.cmd文件的set CLASSPATH中加入%classpath%;.;

  2、Jbuilder6.0的环境建立

  要想在Jbuilder中使用weblogic,就要先安装Borland App Server,然后才能使用weblogic。(我也不知到为什么,谁能告诉我)我安装了Borland App Server4.5。

  ●在jbuilder6.0的Tools菜单下选择Enterprise Setup----Application Servers----BAS4.5的BAS4.5 installation directory下选择你的BAS4.5安装的路径,我这儿是D:/Borland/AppServer

  ● 还是在Application Servers页下选择Weblogic6.x,在Weblogic 6.x installation directory下
选择weblogic6.0的安装路径,我这儿是E:/bea/wlserver6.0,在BEA home directory:下选择BEA的home路径,我这儿是E:/bea,在Password for "system" user:下输入weblogic中system用户的密码,Domain name中输入weblogic6.0的主域名称我这儿是mydomain,在Server name下输入weblogic6.0中的应用服务器名,我这儿是myserver。

  ● 在建立Project文件后还要在Project菜单下选择Project Properties---Paths设置你程序运行所需资源文件,一定要添加Weblogic 6.x Client和j2ee.jar。

  ● 还是在上面的界面中选择Servers页,在Application server:下一定要选择Weblogic
Application Server 6.x,因为我这篇文章就是讲的利用jbuilder和weblogic联合开发ejb。

  ●修改Weblogic6.0的一个Bug,在使用Jbuilder和weblogic联合使用时,最好在计算机系统中设置环境变量。步骤是从我的电脑---属性---高级---环境变量---Administrator的用户变量---新建:变量名:TEMP,变量值:d:\temp;新建:变量名:TMP,变量值:d:\temp。

  我这儿就假设d:\temp是临时目录。如果不这样做,那么在生成jar文件的时候会报奇怪的错误,虽然这好像不影响什么。

  这样所需要的开发环境都已经建好了,下面就可以将全身心都投入到ejb的开发中了!
  二、SessionBean的开发

  1、 通过File菜单的new Project创建一个新的Project,然后再new----选择Enterprise页下的Enterprise JavaBean 1.x,我这儿开发的是ejb1.1。就出现了Enterprise JavaBean Wizard-Step 1 of 3向导窗口(如图1), 因为我们还没有现存的EJB module,所以New一个(如图2),输入你的EJB module名,自定义,ok后继续,出现Wizard-Step 2 of 3(如图3)。这儿定义包名和Bean类名称以及Bean类的基类,还有Bean的属性,是stateless session bean还是Stateful session bean还是….,继续就到了Wizard-Step 3 of 3(如图4),Finish后。你会发现在IDE中已经有了远程接口,Home接口,Bean类以及ejb-jar.xml和weblogic-ejb-jar.xml,全都有了,只要你将它们充实了就行了。特别是xml文件都可以实现可视化的定义操作了。


              图1


               图2


             图3


              图4

  2、我的这个SessionBean要实现客户端程序和数据库的接口。也就是说所有的SQL语句可以通过这个SessionBean来执行并返回处理结果。

  首先定义了一个SQL语句类的接口

package hello;

public interface DefaultSQLContext {
public String getSQL();
public String[] getParameterType();
public int getType();
}

  所有的封装了SQL语句的类都必须要实现该接口。

  例如:hello.TestSQL.java

package hello;
public class TestSQL implements DefaultSQLContext{
static String[] paraValue;
public String getSQL(){
return "select baseitemid,datasource,baseitemname,maxlength,description from ctm_baseitem where businesstypeid=?";
}
public String[] getParameterType(){
return new String[]{"varchar"};
}
//执行SQL的动作类型,是查询还是更新语句;
//0是查询语句,1表示更新语句;
public int getType(){
return 0;
}
}

  EJB的程序如下所示:

  hello.HelloWord.java文件如下所示:

package hello;
import java.rmi.*;
import javax.ejb.*;
import java.sql.*;
import java.util.Vector;
public interface HelloWorld extends EJBObject {
public void execute() throws RemoteException;
public Vector getQueryResult() throws RemoteException;
}

  提供了执行SQL语句的execute()方法,getQueryResult()方法获得查询获得值。

  Hello. HelloWorldBean文件如下所示,真正的执行程序:

package hello;

import java.rmi.*;
import javax.ejb.*;
import javax.sql.*;
import javax.naming.*;
import java.util.*;
import java.sql.*;

public class HelloWorldBean implements SessionBean {
private SessionContext sessionContext;
private defaultSQLContext sql;
private String sqlContext = "";
private Connection con = null;
private Context initCtx = null;
private Vector vResult,vColumnName;
private int iReturn = 1;
String[] paraValue;

public void init(){
try{
initCtx= new InitialContext();
DataSource ds = (javax.sql.DataSource) initCtx.lookup("DBSource");
con= ds.getConnection();
System.out.println("connection = "+con);
}catch(Exception e){System.out.println(e);}
}
/*
//设置SQLContext的类名;
public void setSqlContext(String str){
sqlContext = str;
}
*/
private void initSQLContext(){

init();

try{
Class aclass= Class.forName(sqlContext);
sql = (defaultSQLContext)aclass.newInstance();
}catch (Exception e){
System.out.println("cannot initialize instance"+sqlContext);
System.out.println(e);
}
}

/*
public void setParaValue(String[] str){
this.paraValue = str;
}
*/

public void execute(){
String[] paraType;
int iColumnCount = 0;
ResultSet rs = null;
ResultSetMetaData rsm= null;
Vector vInnerValue;
//首先获得SQLContext;
initSQLContext();

try{
PreparedStatement ps = con.prepareStatement(sql.getSQL());
System.out.println("SQL = "+sql.getSQL());
if(sql.getParameterType()!=null&¶Value!=null)
{
paraType = sql.getParameterType();
for(int i=0;i {
if(paraType[i].equalsIgnoreCase("varchar")||paraType[i].equalsIgnoreCase("varchar2"))
ps.setString(i+1,paraValue[i].trim());
else if(paraType[i].equalsIgnoreCase("integer")||paraType[i].equalsIgnoreCase("int"))
ps.setInt(i+1,Integer.parseInt(paraValue[i].trim()));
else if(paraType[i].equalsIgnoreCase("long"))
ps.setLong(i+1,Long.parseLong(paraValue[i].trim()));
else if(paraType[i].equalsIgnoreCase("date"))
ps.setDate(i+1,java.sql.Date.valueOf(paraValue[i].trim()));
else if(paraType[i].equalsIgnoreCase("boolean"))
ps.setBoolean(i+1,Boolean.getBoolean(paraValue[i].trim()));
else if(paraType[i].equalsIgnoreCase("double"))
ps.setDouble(i+1,Double.parseDouble(paraValue[i].trim()));
else
ps.setString(i+1,paraValue[i].trim());
System.out.print("ParameterType["+i+"] = "+paraType[i]);
System.out.println(" ParameterValue["+i+"] = "+paraValue[i]);
}//end for
}//end if

if(sql.getType()==0) //查询;
{
vResult = new Vector();
System.out.println("execute Query!");
rs = ps.executeQuery();
rsm= rs.getMetaData();
iColumnCount= rsm.getColumnCount();
while(rs.next()){
vInnerValue= new Vector();
for(int j=1;j<=iColumnCount;j++)
{
Object o = rs.getObject(j);
if(o==null)
vInnerValue.addElement("");
else
vInnerValue.addElement(o.toString());
}//end for
vResult.addElement(vInnerValue);
}//end while
vColumnName = new Vector(); //获得字段名;
for(int i=1;i<=iColumnCount;i++)
vColumnName.addElement(rsm.getColumnName(i));
}//end if 查询;
else if(sql.getType()==1) //更新语句;
{
try{
System.out.println("execute Update!");
iReturn = ps.executeUpdate();
con.commit();
}catch(Exception ex)
{
iReturn=0;
con.rollback();
System.out.println("update ejb error!"+ex);
}
}
ps.close();
}catch (Exception ne){
System.out.println(ne);
}
}

public Vector getQueryResult(){
return vResult;
}

public Vector getColumnName(){
return vColumnName;
}

public int getUpdateResult(){
return iReturn;
}
/*
public void ejbCreate(){
System.out.println("ejbCreate()");
}

public void ejbCreate(String sqlContext){
ejbCreate(sqlContext,null);
System.out.println("ejbCreate()");
}
*/
public void ejbCreate(String sqlContext,String[] paraValue) {
this.sqlContext = sqlContext;
this.paraValue = paraValue;
System.out.println("ejbCreate()");
}

public void ejbRemove() {
}
public void ejbActivate() {
}
public void ejbPassivate() {
}

public void setSessionContext(SessionContext context) {
sessionContext = context;
}

}

hello. HelloWorldHome文件(定义Home接口)如下所示:
package hello;
import java.rmi.*;
import javax.ejb.*;

public interface HelloWorldHome extends EJBHome{
public HelloWorld create(String sqlContext,String[] paraValue) throws RemoteException, CreateException;
}



客户端测试程序:
package hello;
import javax.naming.*;
import javax.rmi.PortableRemoteObject;
import java.util.*;
import java.sql.*;

public class HelloWorldBeanClient1 {
private static HelloWorldHome helloWorldHome = null;
private static HelloWorld hello = null;

static{
Context ctx = null;
Hashtable ht = new Hashtable();
System.out.println("Initializing bean access.");
try{
ht.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");
ht.put(Context.PROVIDER_URL,"t3://localhost:7001");
ctx = new InitialContext(ht);
//look up jndi name
Object ref = ctx.lookup("testBean");
//cast to Home interface
helloWorldHome = (HelloWorldHome) PortableRemoteObject.narrow(ref, HelloWorldHome.class);
System.out.println("Get the ejbHome.");
String[] paraValue = new String[]{"16"};
hello=helloWorldHome.create("hello.testSQL",paraValue);
}catch(Exception e){System.out.println("cannot get the ejbBean!"+e);}
}

public HelloWorldBeanClient1() {
Vector vInnerValue;
try {
//hello.setParaValue(value);
//hello.setSqlContext("hello.testSQL");
hello.execute();
Vector columnName = hello.getColumnName();
Vector result = hello.getQueryResult();
for(int i=0;i {
vInnerValue = (Vector)result.elementAt(i);
for(int j=0;j {
System.out.print(columnName.elementAt(j)+" = ");
System.out.println(vInnerValue.elementAt(j));
}
}

//System.out.println("execute Result = "+hello.getUpdateResult());
}catch(Exception e) {
System.out.println("Failed initializing bean access.");
e.printStackTrace();
}
}

/**Main method*/
public static void main(String[] args) {
HelloWorldBeanClient1 client = new HelloWorldBeanClient1();
}
}
}

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网