開發CMP

上篇開發了Stateless Session Bean ,這篇介紹了CMP的開發。

Web測試模塊的建立不再重複。Ant腳本也無需作任何修改。在上個例子的基礎上,我們直接Code CMP 即可。

步驟:

1PointBase建一個名爲mydb的數據庫,建一張user表,表裏有idnameage三列。

2 創建一個名爲UserBeanCMPBean裏有userId,name,age三個字段。

3 編輯Bean和修改部署描述符

4 編譯,deploy

5 編寫jsp進行測試

Nowlet’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下看到UserUserBeanUserHome三個文件,並且META-INF裏的三個配置文件的內容已經改變。

 

3 編輯Bean和修改部署描述符

下面我們給BeanHome接口增加幾個方法。

打開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>

 

OkCMP開發工作已完成。

 

4 編譯,deploy

使用原來的build腳本即可。

重啓服務器,登陸到管理界面。

 

創建Connetion Pool

Database Type :選擇PointBase

Database Driver :選擇 PointBase’s DriverType 4Version : 4.x

然後點continue

在這個界面,輸入:

nameejbSamplesPool

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好些,可以讓weblogicdeploy時查找潛在的錯誤。

刪除原來的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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章