Eclipse零起步系列讲座 (七)
===========================================
(前言)
上篇我们讲了lomboz和jboss/tomcat的配置,和lomboz的web开发, 今天我们讲一个用lom
boz开发ejb的例子.
(正文)
现在我们试着用lomboz开发一个简单的ejb, 这个bean主要负责用户身份认证.数据库操
作使用DAO技术.
主要的需求有: 所有的用户,供应商和经理都有唯一的一个username和userid来登录,如
果要登录,则需要使用方法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 对话框里选择java->lomboz j2e
e
wizards->lomboz j2ee project,按next,
填入项目名MyStore, 按next,
在java setting对话框,翻到source页面, 设置项目的源目录为MyStore/src, 输出目录
为MyStore/bin, 按next
在create j2ee module对话框, 翻到web module页面, 然后添加一个module名字叫: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 below.
* @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}/${ejbsrc.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"
/>
这是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, class的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 below.
* @jonas.bean ejb-name="StoreAccess"
* jndi-name="StoreAccessBean"
*
*--
* @ejb.dao class="edu.sjtu.eclipse.session.StoreAccessDAO" //添加对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 classes, 此时就会
自动生成我们所需要的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 methods, 按next
添加一个remote的business方法: public String loginUser(String username,
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.init()");
InitialContext c = null;
if (null == this.jdbcFactory) {
try {
c = new InitialContext();
this.jdbcFactory =
(DataSource) c.lookup("java:comp/env/jdbc/DefaultDS");
} catch (NamingException e) {
System.out.println("Error in StoreAccessDAOImpl.init()");
}
}
System.out.println("Leaving StoreAccessDAOImpl.init()");
}
public String loginUser(String username, String password) {
System.out.println("Entering StoreAccessDAOImpl.loginUser");
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
String userID = null;
try {
conn = jdbcFactory.getConnection();
String queryString =
"select userid from storeaccess where username = ? 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 " + userID);
}
} catch (SQLException e) {
e.printStackTrace();
System.out.println("Inside StoreAccessDAOImpl.loginUser" + e);
} finally {
try {
rs.close();
ps.close();
conn.close();
} catch (Exception e) {
}
}
System.out.println("Leaving StoreAccessDAOImpl.loginUser");
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是继承了StoreAccessBean
这个类, 而且对于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 below.
* @jonas.bean ejb-name="StoreAccess"
* jndi-name="StoreAccessBean"
*
*--
* @ejb.dao class="edu.sjtu.eclipse.session.StoreAccessDAO"
* 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"));
--------------
然后运行这个application,从console中看到:
Request from client :
Reply from Server: Your userid is null
呵呵, 数据里面没有东西的,所以是null, 如果想加的话,看看jboss的说明
我们用的是jboss里自带的那个Hypersonic SQL
|