第一次接触ejb

发表于:2007-06-22来源:作者:点击数: 标签:
这是我第一次使用EJB,以前从来没有接触过,也许是因为没有几乎,也许是因为敬畏。 在青州实习有机会使用EJB了,实际上是可用可不用( 培训 课程的网上提交),但我认为这是个学习的机会,就开始独自摸爬滚打了。 我采用Eclipse3.0+JBoss3.2.5+JBossIDE1.3.3

   
  这是我第一次使用EJB,以前从来没有接触过,也许是因为没有几乎,也许是因为敬畏。

在青州实习有机会使用EJB了,实际上是可用可不用(培训课程的网上提交),但我认为这是个学习的机会,就开始独自摸爬滚打了。

我采用Eclipse3.0+JBoss3.2.5+JBossIDE1.3.30+Sybase Adaptive SQL Anywhere9.0的模式。

没有太多的难点,但是还是折腾了2天多。

问题1:下载了JBoss3.2.5和JBossIDE1.3.30,但是如何安装这个IDE插件到Eclipse当中呢?首先询问Eclipse插件开发经验的人,说插件一般拷贝到plugin目录下就可以了,然后customize perspective里面选择相应的选项就可以了,比如(New,open perspective和show view,New是说可以new出相应的工程或者文件,show view就是可以生成一个相应的视图)。但是我把JBossIDE解压拷贝到plugin中后,在customize的时候只发现了几个能在show view中出现的选项,和JBoss网站上下载的tutorial上说的有新建工程不同。所以郁闷了一阵。解决的方法是install手册上说应该用Eclipse的Help->Software Updates->Find and install...菜单,然后添加相应JBossIDE的更新网站就可以了。按照说明果然成功。

后来又进行了default sever的设置,参见JBossIDE tutorial上的最后部分。

问题2:连接http://localhost:8080/ 后的相应的jsp网页报告找不到co.sun.tools.javac.Main,报告可能的原因是该类不在JAVA_HOME目录下。我首先在环境变量中设置但是没有作用,后来在Eclipse的Window->Preferences菜单下的Java->Installed JREs中编辑j2re1.4.2里面Add External JARs添加了tools.jar,然后就好使了。

问题3:如何将Sybase ASA(Adaptive sql anywhere)加入JBoss中。我参考了比较多的资料。在Huihoo.org(http://www.huihoo.org/jboss/)上找的一篇文章还不错。如下:

Jboss3.0-tomcat4.03的配置-4(数据库的配置)

(灰狐动力-中间件技术论坛 by huihoo.com Etre)

Jboss3.0-Tomcat4.03的数据库的配置(以Oracle为例)
一、 请将classes12.zip加入classpath中去。
二、请参况hsqldb-service.xml文件编写Oracledb-service.xml文件
请打开serverdefaultdeploy目录下的hsqldb-service.xml文件,这就是一个Jboss3.0_Tomcat4.03下实现数据库连接的例子,它是连接hsql数据库的它的内容如下:
<?xml version="1.0" encoding="UTF-8"?>

<!-- ===================================================================== -->
<!-- -->
<!-- JBoss Server Configuration -->
<!-- -->
<!-- ===================================================================== -->

<!-- $Id: hsqldb-service.xml,v 1.2.2.5 2002/06/23 21:25:58 d_jencks Exp $ -->

<server>

<!-- ==================================================================== -->
<!-- New ConnectionManager setup for default hsql dbs -->
<!-- Build jmx-api (build/build.sh all) and view for config documentation -->
<!-- ==================================================================== -->

<mbean code="org.jboss.resource.connectionmanager.LocalTxConnectionManager" name="jboss.jca:service=LocalTxCM,name=hsqldbDS">

<!-- Include a login module configuration named HsqlDbRealm.
Update your login-conf.xml, here is an example for a
ConfiguredIdentityLoginModule:

<application-policy name = "HsqlDbRealm">
<authentication>
<login-module code = "org.jboss.resource.security.ConfiguredIdentityLoginModule" flag = "required">
<module-option name = "principal">sa</module-option>
<module-option name = "userName">sa</module-option>
<module-option name = "password"></module-option>
<module-option name = "managedConnectionFactoryName">jboss.jca:service=LocalTxCM,name=hsqldbDS</module-option>
</login-module>
</authentication>
</application-policy>

NOTE: the application-policy name attribute must match
SecurityDomainJndiName, and the
module-option name = "managedConnectionFactoryName"
must match the object name of the ConnectionManager you are configuring here.
-->
<!--uncomment out this line if you are using the DB2DbRealm above
<attribute name="SecurityDomainJndiName">HsqlDbRealm</attribute>
-->

<depends optional-attribute-name="ManagedConnectionFactoryName">
<!--embedded mbean-->
<mbean code="org.jboss.resource.connectionmanager.RARDeployment" name="jboss.jca:service=LocalTxDS,name=hsqldbDS">

<attribute name="JndiName">DefaultDS</attribute>
<attribute name="ManagedConnectionFactoryProperties">
<properties>
<config-property name="ConnectionURL" type="java.lang.String">jdbc:hsqldb:hsql://localhost:1476</config-property>
<config-property name="DriverClass" type="java.lang.String">org.hsqldb.jdbcDriver</config-property>
<config-property name="UserName" type="java.lang.String">sa</config-property>
<config-property name="Password" type="java.lang.String"></config-property>
</properties>
</attribute>

<!--Below here are advanced properties -->
<!--hack-->
<depends optional-attribute-name="OldRarDeployment">jboss.jca:service=RARDeployment,name=JBoss LocalTransaction JDBC Wrapper</depends>
<depends>jboss:service=Hypersonic</depends>

</mbean>
</depends>
<depends optional-attribute-name="ManagedConnectionPool">
<!--embedded mbean-->
<mbean code="org.jboss.resource.connectionmanager.JBossManagedConnectionPool" name="jboss.jca:service=LocalTxPool,name=hsqldbDS">

<attribute name="MinSize">0</attribute>
<attribute name="MaxSize">50</attribute>
<attribute name="BlockingTimeoutMillis">5000</attribute>
<attribute name="IdleTimeoutMinutes">15</attribute>
<!--criteria indicates if Subject (from security domain) or app supplied
parameters (such as from getConnection(user, pw)) are used to distinguish
connections in the pool. Choices are
ByContainerAndApplication (use both),
ByContainer (use Subject),
ByApplication (use app supplied params only),
ByNothing (all connections are equivalent, usually if adapter supports
reauthentication)-->
<attribute name="Criteria">ByContainer</attribute>
</mbean>
</depends>
<depends optional-attribute-name="CachedConnectionManager">jboss.jca:service=CachedConnectionManager</depends>

<depends optional-attribute-name="JaasSecurityManagerService">jboss.security:service=JaasSecurityManager</depends>

<attribute name="TransactionManager">java:/TransactionManager</attribute>

<!--make the rar deploy! hack till better deployment-->
<depends>jboss.jca:service=RARDeployer</depends>

</mbean>

<!-- Moved to end to test anonymous depends -->

<mbean code="org.jboss.jdbc.HypersonicDatabase"
name="jboss:service=Hypersonic">
<attribute name="Port">1476</attribute>
<attribute name="Silent">true</attribute>
<attribute name="Database">default</attribute>
<attribute name="Trace">false</attribute>
</mbean>

</server>
在<!-- -->之间没有用的一些说明,所以去掉这一些说明后经过改写一个存取oracle数据库的服务的XML的文件是Oracledb-service.xml
<?xml version="1.0" encoding="UTF-8"?>

<server>

<mbean code="org.jboss.resource.connectionmanager.LocalTxConnectionManager" name="jboss.jca:service=LocalTxCM,name=oracleDS">

<depends optional-attribute-name="ManagedConnectionFactoryName">
<!--embedded mbean-->
<mbean code="org.jboss.resource.connectionmanager.RARDeployment" name="jboss.jca:service=LocalTxDS,name=oracleDS">

<attribute name="JndiName">OracleDS</attribute>
<attribute name="ManagedConnectionFactoryProperties">
<properties>
<config-property name="ConnectionURL" type="java.lang.String">jdbc:oracle:thin:@cuipeng:1521:Ora8</config-property>
<config-property name="DriverClass" type="java.lang.String">oracle.jdbc.driver.OracleDriver</config-property>
<config-property name="UserName" type="java.lang.String">system</config-property>
<config-property name="Password" type="java.lang.String">manager</config-property>
</properties>
</attribute>

<depends optional-attribute-name="OldRarDeployment">jboss.jca:service=RARDeployment,name=JBoss LocalTransaction JDBC Wrapper</depends>
</mbean>
</depends>
<depends optional-attribute-name="ManagedConnectionPool">
<!--embedded mbean-->
<mbean code="org.jboss.resource.connectionmanager.JBossManagedConnectionPool" name="jboss.jca:service=LocalTxPool,name=oracleDS">

<attribute name="MinSize">0</attribute>
<attribute name="MaxSize">50</attribute>
<attribute name="BlockingTimeoutMillis">5000</attribute>
<attribute name="IdleTimeoutMinutes">15</attribute>
<attribute name="Criteria">ByContainer</attribute>
</mbean>
</depends>
<depends optional-attribute-name="CachedConnectionManager">jboss.jca:service=CachedConnectionManager</depends>

<depends optional-attribute-name="JaasSecurityManagerService">jboss.security:service=JaasSecurityManager</depends>

<attribute name="TransactionManager">java:/TransactionManager</attribute>

<depends>jboss.jca:service=RARDeployer</depends>

</mbean>

</server>
请大家对比两个文件的不同之外,很容易写出其它数据库的存取服务了,主要的是下面这个部分
<mbean code="org.jboss.resource.connectionmanager.RARDeployment" name="jboss.jca:service=LocalTxDS,name=oracleDS">

<attribute name="JndiName">OracleDS</attribute><!--这个地方是JNDI的名字在ejb或jsp中调用的是java:/OracleDS - ->
<attribute name="ManagedConnectionFactoryProperties">
<properties>
<config-property name="ConnectionURL" type="java.lang.String">jdbc:oracle:thin:@cuipeng:1521:ora8</config-property>
<config-property name="DriverClass" type="java.lang.String">oracle.jdbc.driver.OracleDriver</config-property>
<config-property name="UserName" type="java.lang.String">system</config-property>
<config-property name="Password" type="java.lang.String">manager</config-property>
</properties>
</attribute>
<depends optional-attribute-name="OldRarDeployment">jboss.jca:service=RARDeployment,name=JBoss LocalTransaction JDBC Wrapper</depends>
</mbean>
还有就是各个部分的名字了name=oracleDS
三、测试数据的连接列子(我用的是jsp)
你必需要编写.war或.ear包来测试一个简易的做法就是:
一、 在deploy目录下建立oracle-test.war目录。
二、在oracle-test.war目录下建立WEB-INF目录,其中有两个文件
jboss-web.xml和web.xml
内容分别是
jboss-web.xml内容是
<jboss-web>
</jboss-web>
web.xml内容是
<?xml version="1.0"?>
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
</web-app>
三、在oracle-test.war目录下建立新文件index.jsp其内容是
<%@page contentType="text/html"%>
<%@ page import="java.sql.*, javax.sql.DataSource, javax.naming.InitialContext" %>

<h3>Test Oracle DB</h3>

<%

InitialContext ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("java:/OracleDS"); //注意这里哦和前面对应
Connection conn = ds.getConnection();

Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM TAB");

while ( rs.next() ) {
out.println( rs.getString("TNAME") + "<br>");
}

conn.close();

%>
 四、请访问http://localhost:8080/oracle-test
一切都测试OK的,如果有什么不对的地方请指哦,我也是学习的。这是一个快速的配置方法,在过一些时间我会把每个属性表示什么给大家说说.


经我根据摸索Sybase ASA更改后如下:

1 在Sql Anywhere 9目录的java目录下找到jdbcdrv.zip,拷贝到jboss-3.2.5的serverdefaultlib目录下

2 在jboss-3.2.5docsexamplesjca目录下找到sybase-ds.xml拷贝到jboss-3.2.5serverdefaultdeploy目录下

3 修改sybase-ds.xml文件

<?xml version="1.0" encoding="UTF-8"?>

<!-- ===================================================================== -->
<!-- -->
<!-- JBoss Server Configuration -->
<!-- -->
<!-- New ConnectionManager setup for Sybase ASE/ASA jConnect driver -->
<!-- Thanks to Marc Zampetti <zampetti@aol.net> -->
<!-- This is a minimal example. See the generic example for other stuff -->
<!-- ===================================================================== -->

<!-- $Id: sybase-ds.xml,v 1.1.2.2 2003/09/05 16:38:24 patriot1burke Exp $ -->

<datasources>
<local-tx-datasource>
<jndi-name>jdbc/SybaseDB</jndi-name>
<!-- Sybase jConnect URL for the database.
NOTE: The hostname and port are made up values. The optional
database name is provided, as well as some additinal Driver
parameters.
-->
<connection-url>jdbc:sybase:Tds:Gibeon:2638/QZCFTraining?JCONNECT_VERSION=4</connection-url>
<driver-class>com.sybase.jdbc.SybDriver</driver-class>
<user-name>DBA</user-name>
<password>SQL</password>
<exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.SybaseExceptionSorter</exception-sorter-class-name>
<!-- sql to call when connection is created
<new-connection-sql>some arbitrary sql</new-connection-sql>
-->

<!-- sql to call on an existing pooled connection when it is obtained from pool
<check-valid-connection-sql>some arbitrary sql</check-valid-connection-sql>
-->

</local-tx-datasource>

</datasources>



4 修改index.jsp文件,如下:

<%@page contentType="text/html"%>
<%@ page import="java.sql.*, javax.sql.DataSource, javax.naming.InitialContext" %>

<h3>Test Sybase DB</h3>

<%

InitialContext ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("java:/jdbc/SybaseDB"); //注意这里哦和前面对应
Connection conn = ds.getConnection();

Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM Trainee");

while ( rs.next() ) {
out.println( rs.getString("name") + "<br>");
}

conn.close();

%>



然后就好使了,但是现在存在的问题是中文问题!!!

我准备开始进行真正的开发了,按照《实用J2EE设计模式编程指南.pdf》

其他资料http://www.huihoo.org/jboss/

原文转自:http://www.ltesting.net