[使用 lomboz 开发一个 stateless session bean]
现在我们试着用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 j2ee
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类
这个node,配置了DAO信息,不用修改了
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的配置信息,我们要做一下修改,改成:
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
/////////////////////////////
第2篇
1.建立基本的JDBC连接
JDBC(Java Database Connectivity)是Java应用程序与数据库的接口规范,旨在让各数据库开发商为Java程序员提供标准的数据库应用程序编程接口(API)。JDBC定义了一个跨数据库、跨平台的通用SQL数据库API。DM JDBC 3.0驱动程序符合SUN JDBC3.0标准,兼容DM JDBC 2.0。 DM JDBC驱动程序是DM数据库的JDBC驱动程序,它是一个能够支持基本SQL功能的通用低层应用程序编程接口,支持一般的SQL数据库访问。 要建立JDBC连接,首先要注册数据库驱动程序。可以通过调用java.sql.DriverManager类的registerDriver方法显式注册驱动程序,也可以通过加载数据库驱动程序类隐式注册驱动程序。 // 显示注册 隐式注册过程中加载实现了 java.sql.Driver的类,该类中有一静态执行的代码段,在类加载的过程中向驱动管理器DriverManager注册该类。而这段静态执行的代码段其实就是上述显式注册的代码。 注册驱动程序之后,就可以调用驱动管理器的 getConnection方法来建立连接。建立数据库连接需要指定标示不同数据库的url、登录数据库所用的用户名user和密码password。 通过DriverManager建立连接的具体过程,如以下示例: String driver= "dm.jdbc.driver.DmDriver"; try { 持久层中间件iBatis连接数据库的方式有3种,连接数据库的方式是JDBC,可以通过在XML文件中配置数据库连接,也可以在properties文件中配置。下面列出transactionManager的type为JDBC的3种连接配置。 dataSource的type为SIMPLE的连接配置 以下是配置数据库连接参数的properties文件sql-map-config.properties的内容: SimpleDataSource properties DMDBMS <?xml version="1.0" encoding="UTF-8" standalone="no"?> <sqlMapConfig> Pool.MaximumActiveConnections 最大连接数 <transactionManager type="JDBC"> 说明:上面的${driver}等连接信息定义在另外一个properties文件或XML文件中,同dataSource的type为SIMPLE的连接配置。 dataSource的type为JNDI的连接配置 <transactionManager type="JDBC" > 说明:前提是在应用服务器中配置了JNDI为jdbc/jpetstore的配置。 3.Hibernate的连接设置 持久层中间件Hibernate,连接数据库的方式是JDBC,通过配置文件hibernate.cfg.xml配置数据库连接设置。文件hibernate.cfg.xml的配置示例如下: <?xml version=’1.0’ encoding=’UTF-8’?> <hibernate-configuration> Tomcat支持通过配置文件%TOMCAT_HOME%\conf\server.xml来配置数据库连接,在Tomcat中配置DM的连接,首先需要将DM的JDBC驱动程序DmJdbcDriver.jar复制到%TOMCAT_HOME%\common\lib目录下面;然后修改配置文件server.xml,在元素的最后一个子元素后添加以下子元素内容: <Context path="/yourApp" reloadable="true" docBase="D:\yourApp" 在Web应用中可以通过下面的代码来获取数据源和数据库连接 javax.naming.InitialContext context = new javax.naming.InitialContext(); 在使用Spring、Hibernate等技术的web应用中,可能只需要将java:/comp/env/jdbc/DMDB配置在配置文件中即可。 5.JBoss下JNDI连接 JBoss下配置JNDI需要修改几个配置文件,需要修改的配置文件如下: %JBOSS_HOME% \server\default\conf\standardjaws.xml
首先需要将DM的JDBC驱动程序DmJdbcDriver.jar复制到 %JBOSS_HOME% \server\default\lib目录下面。 修改%JBOSS_HOME% \server\default\conf\standardjaws.xml,将"java:/DefaultDS"改成"java:/ DMDS "。如下:<datasource>java:/DMDS</datasource> 修改%JBOSS_HOME%\server\default\conf\standardjbosscmp-jdbc.xml,将"java:/DefaultDS"改成"java:/DM"。如下:<datasource>java:/DMDS</datasource> 修改%JBOSS_HOME%\server\default\deploy\ejb-deployer.xml,将DefaultDS修改为DMDS。如下: <depends optional-attribute-name="DataSource"> 增加文件%JBOSS_HOME% \server\default\deploy\DM-ds.xml,内容如下: <?xml version="1.0" encoding="UTF-8"?> 6.Apusic下数据源的配置 首先需要将DM的JDBC驱动程序DmJdbcDriver.jar复制到% APUSIC_HOME % \lib目录下面。 修改% APUSIC _HOME%\config\datasources.xml,将内容修改为: <datasources> 总结 以上列出了在常见的web应用服务器和数据库中间件中,通过JDBC连接达梦数据库的例子。更详细的连接方式见web应用服务器和数据库中间件的文档。 |