上篇开发了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