枫林在线论坛精华区>>程序设计
[340908] 主题: Eclipse零起步系列讲座(七)
作者: little (渺小·Happy^_^)
标题: Eclipse零起步系列讲座(七)[转载]
来自: 192.168.*.*
发贴时间: 2005年04月25日 11:13:42
长度: 11190字

Eclipse零起步系列讲座 (七)

===========================================

(前言)
上篇我们讲了lomboz和jboss/tomcat的配置,和lomboz的web开发, 今天我
们讲一个用lom
boz开发ejb的例子.

(正文)
[使用 lomboz 开发一个 stateless session bean]

现在我们试着用lomboz开发一个简单的ejb, 这个bean主要负责用户身份认
证.数据库操
作使用DAO技术.
主要的需求有: 所有的用户,供应商和经理都有唯一的一个username和use
rid来登录,如
果要登录,则需要使用方法login(),这个方法有两个函数,一个是username
,一

个是password, 如果身份认证通过, 则返回userid

接下来让我们看一下完成这个ejb要做的工作:

1. 创建一个j2ee项目叫MyStore
2. 创建一个stateless session bean 叫 StoreAccess
3. 添加一个业务方法,叫public String loginUser (String username, 
String
password)
4. 创建一个DAO名叫StoreAccessDAOImpl,生成DAO的接口
5. 在DAO中,实现loginUser方法
6. 添加回调函数,并实现
7. 部署ejb
8. 创建测试客户端
9. 运行客户端,测试ejb

----------------------------

1. 创建j2ee项目

点击菜单 file->new->project, 在new project 对话框里选择jav
a->lomboz j2ee
wizards->lomboz j2ee project,按next,

填入项目名MyStore, 按next,

在java setting对话框,翻到source页面, 设置项目的源目录为MyStore/s
rc, 输出目录
为MyStore/bin, 按next

在create j2ee module对话框, 翻到web module页面, 然后添加一个modu
le名字叫:Onli
neStore

再翻到ejb module页面, 然后添加一个module名字叫:MyStoreMgr

再翻到targeted server页面下,添加jboss 3.2.x服务器(就是我们昨天陪
的jboss4.0.0,
 因为是ejb,所以tomcat5.0.x不能用)


2.创建stateless session bean

创建完项目后, 点击菜单 file->new->other, 在new对话框中选择
java->lomboz j2ee
wizards->lomboz ejb creation wizard,按next

在create ejb对话框中设定以下值:
source folder: MyStore/src
package:       edu.sjtu.eclipse.session
Name:          StoreAccess
ejb type:      Stateless Session Bean
然后按finish



以下是这个bean生成的代码

------------------------------
package edu.sjtu.eclipse.session;

import javax.ejb.SessionBean;

/**
 * @ejb.bean name="StoreAccess"
 *  jndi-name="StoreAccessBean"
 *  type="Stateless"
 *
 *--
 * This is needed for JOnAS.
 * If you are not using JOnAS you can safely remove the tags bel
ow.
 * @jonas.bean ejb-name="StoreAccess"
 *  jndi-name="StoreAccessBean"
 *
 *--
 **/

public abstract class StoreAccessBean implements SessionBean {

}
----------------------------------

其中注释里标明了这个ejb的name,type,和jndi-name, 这个到时候要生成
部署描述符派
用场,写到ejb-jar.xml 和 jboss.xml中去的

如果你展开此项目的MyStoreMgr/META-INF目录,你会发现有很多***.xml,
这些都是描述,
部署ejb要用的

接下来,我们来创建包括home,remote,DAO,helper的接口类

打开/MyStoreMgr/META-INF/xdoclet.xml (也有的是叫ejbCreate.xml, 名
字其实无所谓
的,只要内容符合XDoclet规范就可以)

这个文件在你生成ejb时就自动生成了, 它能帮助你生成接口和helper类


<dao pattern="{0}" destdir="${project.dir}/${e
jbsrc.dir}"/>
这个node,配置了DAO信息,不用修改了

           <jboss
            version="3.0"
            unauthenticatedPrincipal="nobody"
            xmlencoding="UTF-8"
            destdir="${ejb.dd.dir}"
            validatexml="false"
        datasource="PLEASE_MODIFY_THIS"
            datasourcemapping="PLEASE_MODIFY_THIS"
            preferredrelationmapping="PLEASE_MODIFY_THIS&qu
ot;
          />

这是jboss的配置信息,我们要做一下修改,改成:

           <jboss
            version="3.0"
            unauthenticatedPrincipal="nobody"
            xmlencoding="UTF-8"
            destdir="${ejb.dd.dir}"
            validatexml="false"
        datasource="java:/DefaultDS"             //这个
是数据源的jndi-name
            datasourcemapping="Hypersonic SQL"       /
/映射到一个xml节点,这个
节点定义了数据结构
            preferredrelationmapping="foreign-key"   /
/数据库类型
          />


3.创建DAO接口

我们创建一个class作为DAO的实现, file -> new -> class, clas
s的package为edu.sjt
u.eclipse.dao, name为 edu.sjtu.eclipse,以下是自动生成的代码:

---------------------------------
package edu.sjtu.eclipse.dao;

public class StoreAccessDAOImpl {

}
---------------------------------

然后让一开始设计的StoreAccessBean,改一下代码:

--------------------------------
package edu.sjtu.eclipse.session;

import javax.ejb.SessionBean;

/**
 * @ejb.bean name="StoreAccess"
 *  jndi-name="StoreAccessBean"
 *  type="Stateless"
 *
 *--
 * This is needed for JOnAS.
 * If you are not using JOnAS you can safely remove the tags bel
ow.
 * @jonas.bean ejb-name="StoreAccess"
 *  jndi-name="StoreAccessBean"
 *
 *--
 * @ejb.dao class="edu.sjtu.eclipse.session.StoreAccessDAO&
quot;    //添加对dao的
访问描述
 * impl-class="edu.sjtu.eclipse.dao.StoreAccessDAOImpl"
;
 **/

public abstract class StoreAccessBean implements SessionBean {

}
--------------------------------

然后点击StoreAccessBean文件,然后右键菜单 Lomboz J2ee->add ejb
 to module, 这样
就可以把我们设计的bean添加到MyStoreMgr 这个module里去了

然后点击MyStoreMgr目录,右键菜单 Lomboz j2ee-> generate ejb cl
asses, 此时就会
自动生成我们所需要的classes,并放置在ejbsrc这个目录

+ejbsrc
  + edu.sjtu.eclipse.session
    -StoreAccess.java
    -StoreAccessDAO.java
    -StoreAccessHome.java
    -StoreAccessLocal.java
    -StoreAccessLocalHome.java
    -StoreAccessSession.java
    -StoreAccessUtil.java

4.创建business方法

右键点击StoreAccessBean.java,菜单 lomboz j2ee -> add ejb meth
ods, 按next
添加一个remote的business方法: public String loginUser(String use
rname,
String password)

则在这个bean里面,多了一个方法
----------------------------------------
    /**
     * @ejb.interface-method
     *  view-type="remote"
     * @dao.call name="loginUser"         <- // 添加
这句话,用来调用DAO
    **/
    public String loginUser(String username, String password) {

        return null;
    }

----------------------------------------

再次Generate EJB Classes, 然后看看生成的classes和原来的有什么不同


5.实现DAOImpl方法

----------------------------------------
package edu.sjtu.eclipse.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

import edu.sjtu.eclipse.session.StoreAccessDAO;

public class StoreAccessDAOImpl implements StoreAccessDAO {

    private DataSource jdbcFactory;

    public void init() {

        System.out.println("Entering StoreAccessDAOImpl.ini
t()");
        InitialContext c = null;

        if (null == this.jdbcFactory) {
            try {
                c = new InitialContext();
                this.jdbcFactory =
                    (DataSource) c.lookup("java:comp/env/jd
bc/DefaultDS");
            } catch (NamingException e) {
                System.out.println("Error in StoreAccessDAO
Impl.init()");
            }
        }

        System.out.println("Leaving StoreAccessDAOImpl.init
()");

    }

    public String loginUser(String username, String password) {


        System.out.println("Entering StoreAccessDAOImpl.log
inUser");
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String userID = null;
        try {
            conn = jdbcFactory.getConnection();
            String queryString =
                "select userid from storeaccess where usern
ame = ? and
password = ?";
            ps = conn.prepareStatement(queryString);
            ps.setString(1, username);
            ps.setString(2, password);
            rs = ps.executeQuery();
            boolean result = rs.next();
            if (result) {
                userID = rs.getString("userid");
                System.out.println("Userid is " + user
ID);

            }
        } catch (SQLException e) {
            e.printStackTrace();
            System.out.println("Inside StoreAccessDAOImpl.l
oginUser" + e);
        } finally {
            try {
                rs.close();
                ps.close();
                conn.close();
            } catch (Exception e) {

            }
        }
        System.out.println("Leaving StoreAccessDAOImpl.logi
nUser");
        return userID;
    }

}

----------------------------------------

6.在bean中设置context

----------------------------------------------------------------

public abstract class StoreAccessBean implements SessionBean {

    /**
     * @ejb.interface-method
     *  view-type="remote"
     * @dao.call name="loginUser"
    **/
    public String loginUser(String username, String password) {

        System.out.println("Entering StoreAccessBean")
;
        System.out.println("Leaving StoreAccessBean");

        return null;
    }

    //添加这个sessioncontext,并实现下面两个函数
    protected SessionContext ctx;

    public void setSessionContext(SessionContext ctx){
        this.ctx  = ctx;
    }

    public void unsetSessionContext(){
        this.ctx = null;
    }
}
----------------------------------------------------------------
---

然后再generate ejb classes,生效

其实你已经发觉了, 生成出来的ejb类,如StoreAccessSession是继承了St
oreAccessBean
这个类, 而且对于bean实现的函数,会自动用super来替代.


7. 部署bean

添加部署的一些配置

/**
 * @ejb.bean name="StoreAccess"
 *  jndi-name="StoreAccessBean"
 *  type="Stateless"
 *
 *--
 * This is needed for JOnAS.
 * If you are not using JOnAS you can safely remove the tags bel
ow.
 * @jonas.bean ejb-name="StoreAccess"
 *  jndi-name="StoreAccessBean"
 *
 *--
 * @ejb.dao class="edu.sjtu.eclipse.session.StoreAccessDAO&
quot;
 * impl-class="edu.sjtu.eclipse.dao.StoreAccessDAOImpl"
;
 *
 * @ejb.resource-ref res-ref-name="jdbc/DefaultDS"    
      <-- 从这行开始添

 * res-type="javax.sql.Datasource"                    
      <-- 这样它会自动
把这些配置
 * res-auth="Container"                               
      <-- 加到ejb-jar.x
ml
 *                                                          <
-- 和jboss.xml中

 * @jboss.resource-ref res-ref-name="jdbc/DefaultDS"
 * jndi-name="java:/DefaultDS"
 *
 **/

然后再次generating ejb classes,然后就可以测试咯~~~, 呼..., 为了做
个这东西还真
不容易

8. 测试

右键点击MyStoreMgr,然后菜单lomboz j2ee->run server,启动服务器


启动完毕后, 再右键点击MyStoreMgr, lomboz j2ee-> deploy module
, 这样我们做的My
StoreMgr就部署上去了

然后新建一个lomboz j2ee test client, 用new向导

在创建这个client向导的对话框中,填入:

source folder: MyStore/src
package:       edu.sjtu.eclipse.client
Name:          SessionClient
Ejb home:      edu.sjtu.eclipse.session.StoreAccessHome
ejb interface: edu.sjtu.eclipse.session.StoreAccess
target server: jboss 3.2.x(jboss 4.0.0)

打开SessionClient.java, 在测试函数testBean(),加入
--------------
System.out.println("Request from client : ");
System.out.println("Reply from Server: Your userid is "
;
        + myBean.loginUser("ECLIPSE", "PASSWD&quo
t;));
--------------

然后运行这个application,从console中看到:
Request from client :
Reply from Server: Your userid is null

呵呵, 数据里面没有东西的,所以是null, 如果想加的话,看看jboss的说明

我们用的是jboss里自带的那个Hypersonic SQL


========== * * * * * ==========
返回