枫林在线论坛精华区>>程序设计 |
[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 |
||
========== * * * * * ==========
|
返回 |