上篇開發了Stateless Session Bean ,這篇介紹了CMP的開發。
Web測試模塊的建立不再重複。Ant腳本也無需作任何修改。在上個例子的基礎上,我們直接Code CMP 即可。
步驟:
1在PointBase建一個名爲mydb的數據庫,建一張user表,表裏有id,name,age三列。
2 創建一個名爲UserBean的CMP,Bean裏有userId,name,age三個字段。
3 編輯Bean和修改部署描述符
4 編譯,deploy
5 編寫jsp進行測試
Now,let’s go!
1 在PointBase裏建表
在本例我們使用weblogic自帶的pointbase數據庫,如果你想了解配置pointbase的信息,請參考我的另一篇帖子 —《PointBase入門》
定位到Pointbase文件夾。它通常位於:
<bea home>/weblogic81/common/eval/pointbase
進入tools目錄,啓動startPointBase.cmd 腳本。然後會看到彈出一個cmd窗口,當顯示數據庫端口信息時,就完成啓動了(很快,不到1秒)
然後啓動 startPointBaseConsole.cmd 腳本,會彈出一個對話框。
Jdbc Driver :不用修改
url :輸入 jdbc:pointbase:server://localhost/mydb
user:輸入 pbpublic
password :輸入 pbpublic
在下方有三個選項,選擇中間的“create new database”,然後點ok。
行了,mydb數據庫創建成功。
接下來我們創建表。可以使用菜單裏創建表的wizard,用腳本快點:
create table user (
id INTEGER NOT NULL,
name VARCHAR (30) ,
age Integer,
CONSTRAINT pk_id PRIMARY KEY (id)
);
然後插入三條數據:
insert into user (id,name,age) values ( 1,'Diegoyun',25);
insert into user (id,name,age) values (2,'Houqi',25);
insert into user (id,name,age) values ( 3,'Zhihua',26);
至此,數據庫準備工作完成。
2 創建ejb
在com.diegoyun.ejb下新建entity包。
在idea裏,新建一個CMP,會彈出ejb的屬性框,這個和SessionBean的是一樣的,屬性設置如下:
<ejb-name> :輸入User
Package :com.diegoyun.ejb.entity
Primary Key Class:改爲java.lang.Integer
爲了簡單起見,我們這裏的CMP使用Remote接口,所以其他信息不用修改,點ok
然後會彈出cmp的屬性設置框,進行如下設置:
Display name : UserBean
Add CMP Field :
點擊這個框,添加三個字段,分別作如下設置:
userId Integer PK
name String
age Integer
然後切換到WeblogicServer屬性頁,設置jndi名字爲:ejb/entity/UserBean
在這個屬性頁還會看到許多屬性,本例先不設置。
關閉屬性頁。
這樣,包括Remote接口的CMP和大部分配置信息已經創建完畢。
你可以在com.diegoyun.entity下看到User,UserBean和UserHome三個文件,並且META-INF裏的三個配置文件的內容已經改變。
3 編輯Bean和修改部署描述符
下面我們給Bean的Home接口增加幾個方法。
打開UserHome文件,添加如下方法:
public Collection findByAge(Integer age)throws RemoteException,FinderException;
public User create(Integer userId,String name,Integer age)throws RemoteException,CreateException;
然後打開UserBean文件,添加:
public Integer ejbCreate(Integer userId,String name,Integer age)throws CreateException {
setUserId(userId);
setName(name);
setAge(age);
return userId;
}
public void ejbPostCreate(Integer userId,String name,Integer age){
}
並且添加一個private字段:
private EntityContext context;
修改setEntityContext 和 unsetEntityContext 方法如下:
public void setEntityContext(EntityContext entityContext) throws EJBException {
this.context = entityContext;
}
public void unsetEntityContext() throws EJBException {
this.context = null;
}
ok,源碼code完。
接下來修改部署描述符。
打開ejb-jar.xml
剛纔我們在UserHome裏定義了一個finder方法,必須要定義它:
在<primkey-field>userId</primkey-field>信息下另起一行,加上:
<query>
<query-method>
<method-name>findByAge</method-name>
<method-params>
<method-param>java.lang.Integer</method-param>
</method-params>
</query-method>
<ejb-ql>
<![CDATA[SELECT OBJECT(a) FROM UserEJB AS a WHERE a.age = ?1]]>
</ejb-ql>
</query>
然後打開weblogic-cmp-rdbms-jar.xml,修改如下:
<?xml version="1.0"?>
<!DOCTYPE weblogic-rdbms-jar PUBLIC
'-//BEA Systems, Inc.//DTD WebLogic 7.0.0 EJB RDBMS Persistence//EN' 'http://www.bea.com/servers/wls700/dtd/weblogic-rdbms20-persistence-700.dtd'>
<weblogic-rdbms-jar>
<weblogic-rdbms-bean>
<ejb-name>UserEJB</ejb-name>
<data-source-name>ejbSamples-ds</data-source-name>
<table-map>
<table-name>USER</table-name>
<field-map>
<cmp-field>userId</cmp-field>
<dbms-column>ID</dbms-column>
</field-map>
<field-map>
<cmp-field>name</cmp-field>
<dbms-column>NAME</dbms-column>
</field-map>
<field-map>
<cmp-field>age</cmp-field>
<dbms-column>AGE</dbms-column>
</field-map>
</table-map>
</weblogic-rdbms-bean>
<create-default-dbms-tables>Disabled</create-default-dbms-tables>
</weblogic-rdbms-jar>
接下來打開 weblogic-ejb-jar.xml ,修改如下:
<?xml version="1.0"?>
<!DOCTYPE weblogic-ejb-jar PUBLIC "-//BEA Systems, Inc.//DTD WebLogic 7.0.0 EJB//EN" "http://www.bea.com/servers/wls700/dtd/weblogic-ejb-jar.dtd" >
<weblogic-ejb-jar>
<weblogic-enterprise-bean>
<ejb-name>UserEJB</ejb-name>
<entity-descriptor>
<persistence>
<persistence-use>
<type-identifier>WebLogic_CMP_RDBMS</type-identifier>
<type-version>7.0</type-version>
<type-storage>META-INF/weblogic-cmp-rdbms-jar.xml</type-storage>
</persistence-use>
</persistence>
</entity-descriptor>
<jndi-name>ejb/entity/UserBean</jndi-name>
</weblogic-enterprise-bean>
<weblogic-enterprise-bean>
<ejb-name>HelloworldEJB</ejb-name>
<jndi-name>ejb/session/Helloworld</jndi-name>
</weblogic-enterprise-bean>
</weblogic-ejb-jar>
Ok,CMP開發工作已完成。
4 編譯,deploy
使用原來的build腳本即可。
重啓服務器,登陸到管理界面。
創建Connetion Pool :
Database Type :選擇PointBase
Database Driver :選擇 PointBase’s Driver(Type 4)Version : 4.x
然後點continue
在這個界面,輸入:
name:ejbSamplesPool
Database Name :輸入mydb
Database User Name :輸入pbpublic
Password : 輸入pbpublic
然後點continue。之後可以進行測試連接,如無意外,connectin pool創建完成。
創建 Data Source :
name 和 jndi name 都輸入 :ejbSamples-ds
pool選擇ejbSamplesPool
deploy ejb :
關於deploy,前面說過,如果用upload方式deploy的話,不需要重新deploy ejb。但因爲這個CMP是新建的,還是重新deploy好些,可以讓weblogic在deploy時查找潛在的錯誤。
刪除原來的ejb,重新Deploay ejb ,它應該位於:
<bea home>/user_projects/domains/mydomain/myserver/upload 目錄下
ok,部署工作完成。
5 編寫jsp進行測試
在web下新建四個文件如下:
index.html(導航作用)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Simple CMP Example -- User</title>
</head>
<body>
<center>
<h1>Simple CMP Example -- User</h1>
<a href="createUser.jsp">Create New User</a>
<p>
<a href="searchUser.jsp">Search User By Id</a>
<p>
<a href="searchUserByAge.jsp">Search User By Age</a>
<p>
</center>
</body>
</html>
createUser.jsp
<%@ page language="java" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.Collection" %>
<%@ page import="javax.ejb.ObjectNotFoundException" %>
<%@ page import="javax.naming.Context" %>
<%@ page import="javax.naming.InitialContext" %>
<%@ page import="javax.naming.NamingException" %>
<%@ page import="com.diegoyun.ejb.entity.User" %>
<%@ page import="com.diegoyun.ejb.entity.UserHome" %>
<%@ page import="javax.rmi.PortableRemoteObject" %>
<%@ page import='java.util.*' %>
<html>
<head><title>CMP_DEMO</title></head>
<body bgcolor="white">
<center>
<h2>CMP_DEMO_TITLE</h2>
Create user :
<p>
<form method="post" action="createUser.jsp">
<table border=10>
<tr>
<td>userId : </td>
<td><input type="text" name="userId" size="11" value=""></td>
</tr>
<tr>
<td>name : </td>
<td><input type="text" name="name" size="25" value=""></td>
</tr>
<tr>
<td>age : </td>
<td><input type="text" name="age" size="25" value=""></td>
</tr>
</table>
<p>
<input type="submit" name="submit" value="Submit">
<p>
</form>
<%
String tid = request.getParameter("userId");
String name = request.getParameter("name");
String tage = request.getParameter("age");
Integer userId = null;
Integer age = null;
if(tid!=null && !"".equals(tid))
userId = Integer.valueOf(tid);
if(tage!=null && !"".equals(tage))
age = Integer.valueOf(tage);
if (userId != null && !"".equals(userId) && name != null && !"".equals(name) && age != null && !"".equals(age)) {
try {
InitialContext ic = new InitialContext();
Object o = ic.lookup("ejb/entity/UserBean");
UserHome home = (UserHome) o;
User user = home.create(userId, name, age);
%>
New User [<%=userId%>] created !!:
<%
} catch(Exception e) {
e.printStackTrace();
out.println("Create User Failed : " + e.toString());
}
}
%>
<hr>
[<a href="index.html">home</a>]
</center>
</body>
</html>
searchUser.jsp
<%@ page language="java" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.Collection" %>
<%@ page import="javax.ejb.ObjectNotFoundException" %>
<%@ page import="javax.naming.Context" %>
<%@ page import="javax.naming.InitialContext" %>
<%@ page import="javax.naming.NamingException" %>
<%@ page import="com.diegoyun.ejb.entity.User" %>
<%@ page import="com.diegoyun.ejb.entity.UserHome" %>
<%@ page import='java.util.*' %>
<html>
<head><title>CMP_DEMO_TITLE</title></head>
<body bgcolor="white">
<center>
<h2>CMP_DEMO_TITLE</h2>
Search by id:
<p>
<form method="get" action="searchUser.jsp">
<input type="text" name="searchText" size="25">
<p>
<input type="submit" value="Search"/>
</form>
<%
String text = request.getParameter("searchText");
Integer id=null;
if(text!=null && !"".equals(text))
id = Integer.valueOf(text);
User user = null;
if (id != null && !"".equals(id)) {
try {
String url = "t3://localhost:7001";
Hashtable h = new Hashtable();
h.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");
h.put(Context.PROVIDER_URL, url);
Context ic = new InitialContext(h);
Object o = ic.lookup("ejb/entity/UserBean");
UserHome home = (UserHome) o;
try {
user = home.findByPrimaryKey(id);
} catch (ObjectNotFoundException ex) {
//throw new Exception(ex);
}
%>
results : <p>
<%
if (user != null) {
%>
User [<%=user.getUserId()%>] :
<%=user.getName()%>, <%=user.getAge()%>
<p>
<%
} else {
%>
User [<%=id%>] not found.
<%
}
} catch(Exception e) {
e.printStackTrace();
out.println(e.toString());
}
}
%>
<hr>
[<a href="index.html">home</a>]
</center>
</body>
</html>
searchUserByAge.jsp
<%@ page language="java" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.Collection" %>
<%@ page import="javax.ejb.ObjectNotFoundException" %>
<%@ page import="javax.naming.Context" %>
<%@ page import="javax.naming.InitialContext" %>
<%@ page import="javax.naming.NamingException" %>
<%@ page import="com.diegoyun.ejb.entity.User" %>
<%@ page import="com.diegoyun.ejb.entity.UserHome" %>
<%@ page import="javax.rmi.PortableRemoteObject" %>
<%@ page import='java.util.*' %>
<html>
<head><title>CMP_DEMO_TITLE</title></head>
<body bgcolor="white">
<center>
<h2>CMP_DEMO_TITLE</h2>
Search by age:
<p>
<form method="get" action="searchUserByAge.jsp">
<input type="text" name="searchText" size="25">
<p>
<input type="submit" value="Search"/>
</form>
<%
String text = request.getParameter("searchText");
Integer id=null;
if(text!=null && !"".equals(text))
id = Integer.valueOf(text);
User user = null;
Collection userList = null;
if (id != null && !"".equals(id)) {
try {
String url = "t3://localhost:7001";
Hashtable h = new Hashtable();
h.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");
h.put(Context.PROVIDER_URL, url);
Context ic = new InitialContext(h);
Object o = ic.lookup("ejb/entity/UserBean");
UserHome home = (UserHome) o;
try {
userList = home.findByAge(id);
} catch (ObjectNotFoundException ex) {
//throw new Exception(ex);
}
%>
results : <p>
<%
if (userList != null && !userList.isEmpty()) {
for(Iterator it = userList.iterator();it.hasNext();){
user = (User) PortableRemoteObject.narrow(it.next(), User.class);
%>
User : id[<%=user.getUserId()%>]<br>
name : <%=user.getName()%><br>
age : <%=user.getAge()%><br>
<%
if(it.hasNext())
%> <p>
<% ;
}
} else {
%>
User not found.
<%
}
} catch(Exception e) {
e.printStackTrace();
out.println(e.toString());
}
}
%>
<hr>
[<a href="index.html">home</a>]
</center>
</body>
</html>
在瀏覽器打開:
http://localhost:7001/web/index.html
好好享受自己的成果 :)
diegoyun At 4/20/2005 12:20:45 AM