答案:利用JDBC RowSet讓EJB返回數据集(手記)
**************************************************************************
前言:
前几日在Weblogic6.1上試驗使用數据集OK(EJB和客戶端都在Weblogic上),后來將
客戶端部署到另外一臺服務器上(運行Resin),想由Resin上的JSP客戶端調用來獲得
Weblogic上的EJB返回的數据集,發現行不通.
經過日夜搜索,終于發現一偏關于JDBC RowSet的文章(JDBC 2.0 Optional Package API),
正是我想要的.
馬上行動!
**************************************************************************
注意:安以下步驟部署你必須熟悉Weblogic6.1的EJB部署,數据源部署.
1.到http://developer.java.sun.com/developer/earlyAccess/下載rowset.jar
//JDBC RowSet The three JDBC RowSet implementations in this release demonstrate some of the many possibilities for implementing the javax.sql.RowSet inte易做图ce, which is part of the JDBC 2.0 Optional Package API. (June 30, 2000)
2.將rowset.jar放到你的CLASSPATH中.(我使用的是Weblogic6.1)
3.寫你的EJB,如下列:
************************************************************************
CoffeesEJB.java
************************************************************************
import java.sql.*;
import javax.sql.*;
import sun.jdbc.rowset.*; //倒入rowset.jar類
import javax.naming.*;
import javax.ejb.*;
public class CoffeesEJB implements SessionBean {
private SessionContext sc = null;
private Context ctx = null;
private DataSource ds = null;
public CoffeesEJB () {}
public void ejbCreate() throws CreateException {
try {
ctx = new InitialContext();
ds = (DataSource)ctx.lookup("bbb.OracleThintxds"); //數据源
}
catch (Exception e) {
System.out.println(e.getMessage());
throw new CreateException();
}
}
public RowSet getCoffees() throws SQLException {
Connection con = null;
ResultSet rs;
CachedRowSet crs;
try {
con = ds.getConnection("system", "command1"); //EJB Server的用戶和密易做图,我用的是Weblogic6.1
Statement stmt = con.createStatement();
rs = stmt.executeQuery("select * from coffees");
crs = new CachedRowSet();
crs.populate(rs);
// the writer needs this because JDBC drivers
// don't provide this meta-data.
crs.setTableName("coffees");
rs.close();
stmt.close();
} finally {
if (con != null)
con.close();
}
return crs;
}
//
// Methods inherited from SessionBean
//
public void setSessionContext(SessionContext sc) {
this.sc = sc;
}
public void ejbRemove() {}
public void ejbPassivate() {}
public void ejbActivate() {}
}
************************************************************************
4.發布CoffeesEJB到你的EJB Server上.
ok!EJB在EJB Server上的部署完成!下面是客戶端的部署.
5.同樣將rowset.jar放到你的客戶端服務器的CLASSPATH中.(我使用的是Resin2.0)
6.寫你的客戶端jsp代易做图,如下列:
************************************************************************
CoffeesClient.jsp
************************************************************************
<%@ page import="java.sql.*"%>
<%@ page import="java.util.*"%>
<%@ page import="javax.naming.*"%>
<%@ page import="sun.jdbc.rowset.*"%>
<%@ page import="javax.servlet.*"%>
<%@ page import="javax.servlet.http.*"%>
<%@ page import="weblogic.jndi.T3InitialContextFactory" %>
<% // 來自weblogic.jar %>
<%@ page import="java.io.*"%>
<%@ page import="javax.rmi.*"%>
<%@ page import="Coffees"%>
<%@ page import="CoffeesHome"%>
<%@ page contentType="text/html;charset=big5" %>
<%
Properties p = new Properties() ;
p.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.T3InitialContextFactory");
p.put(Context.PROVIDER_URL,"t3://192.1.1.23:7001"); //Weblogic服務器的地址和端口
String info="";
try{
Context initial = new InitialContext(p);
Object objref = initial.lookup("statelessSession.Coffees");
CoffeesHome home =(CoffeesHome)PortableRemoteObject.narrow(objref,CoffeesHome.class);
Coffees currencymyString = home.create();
CachedRowSet rset = (CachedRowSet)currencymyString.getCoffees();
String coffeeName="";
while (rset.next()) {
coffeeName = rset.getString("COF_NAME");
out.println(coffeeName + "<BR><HR size=1>" );
}
out.println("<br>********************<br>");
currencymyString.remove();
}catch(javax.naming.NamingException ne){
info = "錯誤:EJB服務器找不到!無法使用遠程方法.<br>" + ne.toString();
}catch(java.rmi.RemoteException re){
info = re.toString();
}catch(javax.ejb.CreateException ce){
info = ce.toString();
}catch(javax.ejb.RemoveException re){
 
上一个:关于thin和oci,其实最主要的不是功能上的区别而是驱动程序的类型不同。
下一个:3.类一级的静态变量能否锁定