Moshco zhu 2007年9月24日星期一
目录
Java Transaction API(Java事务API) (JTA)Java Transaction API(Application Programming Interface)
JTA Transaction是指由J2EE Transaction manager去管理的事务。其最大的特点是调用UserTransaction接口的begin,commit和rollback方法来完成事务范围的界定,事务的提交和回滚。JTA Transaction可以实现同一事务对应不同的数据库,但是它仍然无法实现事务的嵌套。
JTA可以处理任何提供符合XA接口的资源。包括:数据库,JMS,商业对象等等
Ant是一种基于Java的build工具。理论上来说,它有些类似于(Unix)C中的make ,但没有make的缺陷。
与基于shell命令的扩展模式不同,Ant用Java的类来扩展。(用户)不必编写shell命令,配置文件是基于XML的,通过调用target树,就可执行各种task。每个task由实现了一个实现了特定Task接口的对象来运行。
Ant是Apache软件基金会JAKARTA目录中的一个子项目,它有以下的优点。
跨平台性。Ant是存Java语言编写的,所示具有很好的跨平台性。
操作简单。Ant是由一个内置任务和可选任务组成的。Ant运行时需要一个XML文件(构建文件)。
Ant通过调用target树,就可以执行各种task。每个task实现了特定接口对象。由于Ant构建文件时XML格式的文件,所以和容易维护和书写,而且结构很清晰。
Ant可以集成到开发环境中。由于Ant的跨平台性和操作简单的特点,它很容易集成到一些开发环境中去。
EJB是sun的服务器端组件模型,最大的用处是部署分布式应用程序,类似微软的.com技术。凭借java跨平台的优势,用EJB技术部署的分布式系统可以不限于特定的平台。
EJB (Enterprise JavaBean)是J2EE的一部分,定义了一个用于开发基于组件的企业多重应用程序的标准。其特点包括网络服务支持和核心开发工具(SDK)。
在J2EE里,Enterprise Java Beans(EJB)称为Java 企业Bean,是Java的核心代码,分别是会话Bean(Session Bean),实体Bean(Entity Bean)和消息驱动Bean(MessageDriven Bean)。
JBoss是全世界开发者共同努力的成果,一个基于J2EE的开放源代码的应用服务器。 因为JBoss代码遵循LGPL许可,你可以在任何商业应用中免费使用它,而不用支付费用。JBoss支持EJB 1.1和EJB 2.0 EJB3.0的规范,它是一个管理EJB的容器和服务器。类似于Sun's J2SDK Enterprise Edition(J2EE),JBoss的目标是一个源代码开放的J2EE环境。但是JBoss核心服务仅是提供EJB服务器。JBoss不包括serverlers/JSP page 的WEB容器,当然可以和Tomcat或Jetty绑定使用。
Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括 Java 开发工具(Java Development Tools,JDT)。
虽然大多数用户很乐于将 Eclipse 当作 Java IDE 来使用,但 Eclipse 的目标不仅限于此。Eclipse 还包括插件开发环境(Plug-in Development Environment,PDE),这个组件主要针对希望扩展 Eclipse 的软件开发人员,因为它允许他们构建与 Eclipse 环境无缝集成的工具。由于 Eclipse 中的每样东西都是插件,对于给 Eclipse 提供插件,以及给用户提供一致和统一的集成开发环境而言,所有工具开发人员都具有同等的发挥场所。
1.6. WTP
WTP(Web Tools Platform )项目在eclipse平台上进行扩展,是一个开发J2EE Web应用程序的工具集。WTP包含以下工具:
u 一个源码编辑器可以用来编辑HTML, Javascript, CSS, JSP, SQL, XML, DTD, XSD, 和WSDL。
u 一个图形编辑器用来编辑XSD与WSDL。
u J2EE项目构建器和一个J2EE向导工具。
u 一个Web服务创建向导和管理器,和WS-I 测试工具。
u 一个数据库访问,查询工具等。
WTP由两个子项目构成:WST(Web标准工具集) 与JST(J2EE标准工具集)。
JDK
版本:JDK5.0 Update12
下载地址:
http://java.sun.com/javase/downloads/index_jdk5.jsp
Ant
版本:Ant 1.7.0
下载地址:
http://ant.apache.org/
http://ant.apache.org/bindownload.cgi
Eclipse
下载地址:
版本:wtp-all-in-one-sdk-R-1.0.3-200607(Eclipse 3.1.2)
http://mirrors.nsa.co.il/eclipse/webtools/downloads/drops/R1.0/R-1.0.3-200607290929/wtp-all-in-one-sdk-R-1.0.3-200607290929-win32.zip
中文包下载:
http://archive.eclipse.org/eclipse/downloads/drops/L-3.1.1_Language_Packs-200510051300/index.php
JBoss IDE for Eclipse
版本:JBossIDE-1.6.0.GA
下载地址:
http://labs.jboss.com/jbosside/download/index.html
http://belnet.dl.sourceforge.net/sourceforge/jboss/JBossIDE-1.6.0.GA-ALL.zip
JBoss Application Server
版本:4.0.5.GA
下载地址:
http://labs.jboss.com/jbossas/downloads
Microsoft SQL Server 2000
版本:Microsoft SQL Server 2000 + SQL Server 2000 SP4
Sybase 12.5
版本:12.5.1
JDBC
版本:
下载地址:SQL Server 2000 JDBC
http://download.microsoft.com/download/4/1/d/41d3e9c0-64d1-451e-947b-7a4cba273b2d/setup.exe
这就不多说了吧!要注意配置系统环境变量[Path]和[CLASS_PATH]。
1.直接将其解压缩到指定目录;
2.然后配置系统环境[Path]中添加Ant目录下的[bin]目录;
1.先将WTP包解压缩到[D:/1]目录;
2.解压缩JBoss IDE for Eclipse到[D:/1]目录;
3.解压缩所有的语言包到[D:/1]目录;
4.将[D:/1/eclipse]目录拷贝到你想安装Eclipse的目录;
1.安装MS SQL Server2000,安装的时候注意选择混合模式,sa密码要设置;
2.安装SP4补丁包;
1.将压缩包解压到你想安装JBoss的位置;
1.MS SQL2000 JDBC是需要安装的,安装的时候要选择自定义安装,设定并记录安装的目录;
目录结构:
项目 | 备注 |
项目名称 | Transaction |
目录设计 | 公用代码:/src EJB:/ejb Web Java代码:/websrc Web Jsp:/WebContext Ant编译临时目录:/Tmp 库目录:/lib 数据源配置文件目录:/ds |
应用程序 | 名称:Transaction |
EJB版本 | 2.0 |
J2EE版本 | J2EE 1.4 |
EJB | 名称:Ejb2 Bean类型:Stateless 接口:Remote |
数据库设计
服务器 | moshco | 服务器类型 | MS SQL2000 Server | |
数据库 | Transaction | 表 | UserName | |
描述 | 测试表 | |||
字段 | 数据类型 | 长度 | ISNULL | 描述 |
Id | int | 4 | FALSE | 记录编号 |
Name | nvarchar | 64 | TRUE | 姓名 |
|
|
|
|
|
服务器 | moshco | 服务器类型 | MS SQL2000 Server | |
数据库 | Transaction | 表 | UUI | |
描述 | 测试表 | |||
字段 | 数据类型 | 长度 | ISNULL | 描述 |
Id | int | 4 | FALSE | 记录编号 |
Name | nvarchar | 64 | TRUE | 姓名 |
|
|
|
|
|
添加数据库记录
Insert into UUI(Id,Name) values(1,'moshco zhu') |
1.新建项目,打开Eclipse开发环境,创建一个J2EE 1.4的项目。如图操作,选择下一步;
2.输入数据项目名称[Transanction]。选择完成;
3.创建完成的项目如下:
4.创建目录结构:
如下图所示,逐一创建如下目录:
ds:数据源配置文件目录、
ejb:EJB源代码目录、
ejb/META-INF:EJB部署配置文件目录、
lib:库文件目录、
META-INF:应用程序部署配置文件目录、
Src:公用源代码目录、
Tmp:Ant编译临时目录、
Tmp/ear、
Tmp/ejb、
Tmp/src、
Tmp/web、
Tmp/websrc、
WebContext:Web内容目录、
WebContext/WEB-INF:WEB配置文件目录、
WebContext/WEB-INF/lib:WEB库文件目录、
websrc:WEB源代码目录。
创建完毕以后目录结构应该如下图:
5.配置源代码目录:
在项目[Transaction]上点击右键,选择[属性],在弹出的窗体中选择[Java构建路径],再选择右边的[源代码],点击[添加文件夹(A)…],选择/ejb、/src、/websrc,点击确定按钮。
设置缺省输出文件夹: /Transaction/WebContext/WEB-INF/classes
最后点击确定。
6.配置库lib目录。将安装在MS SQL2000 JDBC目录下的文件[msbase.jar、mssqlserver.jar、msutil.jar]拷贝到[/lib]目录下,然后设置它们为库;
3.2.2.1. EJB
1.新建SessionBean类
设置包:ejbs
名称Ejb2Bean
Ejb类型:Stateless
Ejb接口:Remote
创建哪些方法:全选
最后点击完成。
2.创建Ejb接口。分别创建Ejb2Home(实现接口EJBHome)、Ejb2接口(实现接口EJBObject)
3.在Ejb2Home.java中定义方法[Ejb2 create() throws RemoteException, CreateException;],代码如下所示:
Ejb2 create() throws RemoteException, CreateException; |
4.在[src]源代码目录中,创建一个处理事务的DAO类[Dao.java],包名[com.mh.dao],实现接口[java.io.Serializable]
编写代码如下:
/** * */ package com.mh.dao;
import java.io.Serializable; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet;
import javax.naming.Context; import javax.naming.InitialContext; import javax.sql.DataSource; import javax.transaction.UserTransaction;
/** * @author moshco zhu * */ public class Dao implements Serializable {
/** * @param args */ public static void main(String[] args) { // TODO 自动生成方法存根
}
/** * @功能:获取数据库连接 * * @return */ public static Connection getConnection() {
// 定义变量 Context ctx = null; DataSource ds = null; Connection conn = null;
try {
// 创建环境对象 ctx = new InitialContext();
// 获取数据源 ds = (DataSource) ctx.lookup("java:jdbc/MSSQL_XA"); // 获取数据库连接 conn = ds.getConnection(); // 打印提示信息 if (conn != null && !conn.isClosed()) { System.out.println("获取数据库连接[java:jdbc/MSSQL_XA]成功!");
}
} catch (Exception e) { e.printStackTrace(); } finally { }
// 返回函数值 return conn; }
/** * @功能:EJB测试函数 * * @return */ public String test() {
// 定义变量 String strResult = ""; Context ctx = null; Connection conn = null; PreparedStatement ps = null; String strUserName = ""; UserTransaction utx = null;
try {
// 创建环境对象 ctx = new InitialContext();
// 获取Bean事务管理类 utx = (UserTransaction) ctx.lookup("java:comp/UserTransaction");
// 事务开始 utx.begin();
// 获取数据库连接 conn = Dao.getConnection();
// 查询用户名称 ps = conn.prepareStatement("select * from UUI where id = ?"); ps.setInt(1, 1); ResultSet rs = ps.executeQuery(); while (rs.next()) { strUserName = rs.getString("name"); break; }
// 插入2条新的数据 ps = conn .prepareStatement("insert into username(name) values('hede2')"); ps.executeUpdate(); ps = conn.prepareStatement("insert into UUI(name) values('hede1')"); ps.executeUpdate();
// 提交事务 utx.commit();
} catch (Exception e) { e.printStackTrace(); try { utx.rollback(); } catch (Exception e1) { e1.printStackTrace(); } } finally { strResult = "Hello," + strUserName; if (conn != null) { try { conn.close(); } catch (Exception e) { e.printStackTrace(); } conn = null; } }
// 返回函数值 return strResult; }
} |
5.在[Ejb2Bean.java]中添加方法[public String sayHello() throws RemoteException],代码如下:
/** * @功能:业务功能:测试函数 * * @return * @throws RemoteException */ public String sayHello() throws RemoteException {
// 创建事务DAO对象,实现事务方法 String strResult = (new Dao()).test(); // 返回函数值 return strResult; } |
6.在[Ejb2.java]中添加方法[public String sayHello() throws RemoteException;]定义,代码如下:
public String sayHello() throws RemoteException; |
7.在目录[/ejb/META-INF]中创建部署描述文件[ejb-jar.xml]和[jboss.xml],内容如下:
ejb-jar.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ejb-jar PUBLIC '-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN' 'ejb-jar_2_0.dtd'> <!-- http://java.sun.com/dtd/ejb-jar_2_0.dtd http://localhost:8080/haiejb/WEB-INF/--> <ejb-jar> <description>Ejb2</description> <display-name>EJB Transaction</display-name> <enterprise-beans> <session> <ejb-name>Ejb2</ejb-name> <home>ejbs.Ejb2Home</home> <remote>ejbs.Ejb2</remote> <ejb-class>ejbs.Ejb2Bean</ejb-class> <session-type>Stateless</session-type> <transaction-type>Bean</transaction-type>
<resource-ref> <description></description> <res-ref-name>jdbc/MSSQL_XA</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref>
</session> </enterprise-beans> </ejb-jar>
|
需要注意的是:
[<transaction-type>]的设置一定要是[Bean],否则事务DAO中的方法[test]是没有办法正确执行下面这条语句的:
[utx = (UserTransaction) ctx.lookup("java:comp/UserTransaction")]
jboss.xml
<?xml version="1.0" encoding="UTF-8"?> <jboss> <enterprise-beans> <session> <ejb-name>Ejb2</ejb-name> <jndi-name>Ejb2</jndi-name> </session> </enterprise-beans> </jboss> |
3.2.2.2. WEB
1.在[websrc]中创建一个Servlet [SayHello.java]类,源代码如下:
/** * */ package com.mh.servlet;
import java.io.IOException; import java.io.PrintWriter;
import javax.naming.InitialContext; import javax.rmi.PortableRemoteObject; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;
import ejbs.Ejb2; import ejbs.Ejb2Home;
/** * @author moshco zhu * */ public class SayHello extends HttpServlet {
/** * @param args */ public static void main(String[] args) { // TODO 自动生成方法存根
}
public void destroy() { // TODO Auto-generated method stub super.destroy(); }
public void init() throws ServletException { // TODO Auto-generated method stub super.init(); }
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取输出对象 request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); // 设置输出编码 response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); // 结果值 String strResult = "Test!";
String message = "nothing!"; try {
InitialContext ic = new InitialContext();
Object objRef = ic.lookup("Ejb2");// java:comp/env/Ejb2
Ejb2Home home = null; try { home = (Ejb2Home) PortableRemoteObject.narrow(objRef, Ejb2Home.class); if (home != null) { System.out.println("取得Home!"); } } catch (Exception e) { System.out.println("这里出错了!/n"); e.printStackTrace(); }
// 创建EJB对象 Ejb2 ejb = home.create(); // 调用业务方法 message = ejb.sayHello();
} catch (Exception e) { e.printStackTrace(); message = e.toString(); } finally { }
// 输出 out.print(message + "<br>"); out.print(strResult); out.flush(); out.close(); }
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } |
2.配置[web.xml],在路径[/WebContext/WEB-INF]下创建文件[web.xml]
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'web-app_2_3.dtd'> <!-- http://java.sun.com/dtd/web-app_2_3.dtd http://localhost:8080/haiejb/WEB-INF/ --> <web-app>
<servlet> <servlet-name>SayHello</servlet-name> <servlet-class>com.mh.servlet.SayHello</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>SayHello</servlet-name> <url-pattern>/sv/SayHello.do</url-pattern> </servlet-mapping>
<resource-ref> <description></description> <res-ref-name>jdbc/MSSQL_XA</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref>
<ejb-ref> <ejb-ref-name>Ejb2</ejb-ref-name> <ejb-ref-type>Session</ejb-ref-type> <home>ejbs.Ejb2Home</home> <remote>ejbs.Ejb2</remote> </ejb-ref>
<welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
|
3.配置[jboss-web.xml],在路径[/WebContext/WEB-INF]下创建文件[jboss-web.xml]
<?xml version="1.0" encoding="UTF-8"?> <jboss-web>
<resource-ref> <description>Ejb2</description> <res-ref-name>jdbc/MSSQL_XA</res-ref-name> <jndi-name>jdbc/MSSQL_XA</jndi-name> </resource-ref>
<ejb-ref> <ejb-ref-name>Ejb2</ejb-ref-name> <jndi-name>Ejb2</jndi-name> </ejb-ref>
</jboss-web> |
4.在[/WebContext/index.jsp]下创建文件index.jsp,文件内容如下:
<%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>Ejb测试</title> </head> <body>
<p> <center><a href="/ejb2/sv/SayHello.do" target="_blank">EJB测试</a></center> </p>
</body> </html>
|
3.2.2.3. 应用程序
1.在[/META-INF]下创建文件[application.xml],内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<application> <display-name>Transaction EJB J2EE Application</display-name> <module> <web> <web-uri>ejb2.war</web-uri> <context-root>/ejb2</context-root> </web> </module> <module> <ejb>ejb2.jar</ejb> </module> </application>
|
1.创建文件[/build.xml],内容如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!-- 一个项目,可包含很多任务组(target) --> <project default="main" basedir=".">
<!-- 项目名称 --> <property name="prjname" value="ejb2" />
<!-- 临时目录 --> <property name="tmp" value="Tmp" /> <!-- JBoss安装目录 --> <property name="jboss.home" value="d:/jboss-4.0.5.GA" />
<!-- JBoss启动服务类型 --> <property name="jboss.server" value="all" />
<!-- 路径变量定义 --> <property name="jre.home" value="d:/Java/jdk1.5.0_12/jre" /> <property name="j2ee.classpath" value="D:/Eclipse/Eclipse_3.1.2_JBossIDE_1.6.0/plugins/org.jboss.ide.eclipse.jdt.j2ee.core_1.6.0.GA" /> <property name="webServices.classpath" value="D:/Eclipse/Eclipse_3.1.2_JBossIDE_1.6.0/plugins/org.jboss.ide.eclipse.jdt.ws.core_1.6.0.GA" /> <property name="jboss.classpath" value="${jboss.home}/server/${jboss.server}/lib/jboss-j2ee.jar" />
<!-- 编译库 --> <path id="classpath">
<!-- JRE --> <pathelement location="${jre.home}/lib" /> <pathelement path="${jre.home}/lib/rt.jar" /> <pathelement path="${jre.home}/lib/jsse.jar" /> <pathelement path="${jre.home}/lib/jce.jar" /> <pathelement path="${jre.home}/lib/charsets.jar" /> <pathelement path="${jre.home}/lib/ext/dnsns.jar" /> <pathelement path="${jre.home}/lib/ext/localedata.jar" /> <pathelement path="${jre.home}/lib/ext/sunjce_provider.jar" /> <pathelement path="${jre.home}/lib/ext/sunpkcs11.jar" />
<!-- J2EE --> <pathelement location="${j2ee.classpath}/lib/j2ee-1.4" /> <pathelement path="${j2ee.classpath}/lib/j2ee-1.4/ejb-api.jar" /> <pathelement path="${j2ee.classpath}/lib/j2ee-1.4/jacc-api.jar" /> <pathelement path="${j2ee.classpath}/lib/j2ee-1.4/jca-api.jar" /> <pathelement path="${j2ee.classpath}/lib/j2ee-1.4/jms-api.jar" /> <pathelement path="${j2ee.classpath}/lib/j2ee-1.4/jsp-api.jar" /> <pathelement path="${j2ee.classpath}/lib/j2ee-1.4/jta-api.jar" /> <pathelement path="${j2ee.classpath}/lib/j2ee-1.4/servlet-api.jar" /> <pathelement path="${j2ee.classpath}/lib/j2ee-1.4/sql-api.jar" />
<!-- Web Services --> <pathelement location="${webServices.classpath}/lib/wsi-1.0" /> <pathelement path="${webServices.classpath}/lib/wsi-1.0/jaxr-api.jar" /> <pathelement path="${webServices.classpath}/lib/wsi-1.0/jaxrpc-api.jar" /> <pathelement path="${webServices.classpath}/lib/wsi-1.0/saaj-api.jar" /> <pathelement path="${webServices.classpath}/lib/wsi-1.0/xml-api.jar" />
<!-- Lib --> <pathelement location="lib" /> <pathelement path="lib/jtds-1.2.2.jar" /> <pathelement path="lib/msbase.jar" /> <pathelement path="lib/mssqlserver.jar" /> <pathelement path="lib/msutil.jar" />
<!-- EJB --> <pathelement path="${tmp}/ejb/${prjname}.jar" />
</path>
<!-- EJB包 --> <target name="ejb"> <delete dir="${tmp}/ejb" /> <mkdir dir="${tmp}/ejb" /> <javac srcdir="src" destdir="${tmp}/ejb"> <classpath refid="classpath" /> </javac> <javac srcdir="ejb" destdir="${tmp}/ejb"> <classpath refid="classpath" /> </javac> <copy todir="${tmp}/ejb/META-INF"> <fileset dir="ejb/META-INF" /> </copy> <jar basedir="${tmp}/ejb" jarfile="${tmp}/ejb/${prjname}.jar" /> </target>
<!-- WEB包 --> <target name="web" depends="ejb"> <delete dir="${tmp}/web" /> <mkdir dir="${tmp}/web" /> <delete dir="${tmp}/websrc" /> <mkdir dir="${tmp}/websrc" /> <!-- 编译 --> <javac srcdir="websrc" destdir="${tmp}/websrc"> <classpath refid="classpath" /> </javac>
<!-- <copy todir="${tmp}/web/WEB-INF/lib"> <fileset file="${tmp}/ejb/${prjname}.jar" /> </copy> --> <copy todir="${tmp}/web"> <fileset dir="WebContext/" /> </copy> <delete dir="${tmp}/web/WEB-INF/classes" /> <jar basedir="${tmp}/websrc" jarfile="${tmp}/web/WEB-INF/lib/websrc.jar" /> <copy todir="${tmp}/web/WEB-INF/lib"> <fileset dir="lib" /> </copy> <jar basedir="${tmp}/web" jarfile="${tmp}/web/${prjname}.war" /> </target>
<!-- EAR包 --> <target name="main" depends="web"> <delete file="${prjname}.ear" /> <delete dir="${tmp}/ear" /> <mkdir dir="${tmp}/ear" /> <copy todir="${tmp}/ear"> <fileset file="${tmp}/web/${prjname}.war" /> <fileset file="${tmp}/ejb/${prjname}.jar" /> </copy> <copy todir="${tmp}/ear/META-INF"> <fileset dir="META-INF" /> </copy> <jar basedir="${tmp}/ear" jarfile="${prjname}.ear" /> <!-- 发布 --> <copy todir="${jboss.home}/server/${jboss.server}/lib"> <fileset dir="lib" /> </copy> <copy todir="${jboss.home}/server/${jboss.server}/deploy"> <fileset dir="ds" /> <fileset file="${prjname}.ear" /> </copy> </target>
</project> |
2.编写脚本[/ant.bat],内容如下:
F: cd F:/Epd/Eclipse/eclipse_3.1.2+JBoss IDE 1.6.0.GA/Transaction %ANT_HOME%/bin/ant -file build.xml pause |
3.编译运行,在文件[ant.bat]上点击右键,选择[打开方式]->[缺省编辑器];
或者这样:在[build.xml]上点击右键,选择[运行方式]->[Ant构建],结果如下图:
因为我们使用的是JTA,因此我们需要配置XA的数据库源;
1.打开数据库和服务器分布式服务;见这里。
2.从JBoss安装目录下的目录[docs/examples/jca]下拷贝文件[mssql-xa-ds.xml]到目录[/ds];
3.打开编辑文件[mssql-xa-ds.xml],内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!-- ===================================================================== --> <!-- --> <!-- JBoss Server Configuration --> <!-- --> <!-- ===================================================================== -->
<!-- $Id: mssql-xa-ds.xml 23720 2004-09-15 14:37:40Z loubyansky $ --> <!-- ==================================================================== --> <!-- ConnectionManager setup for xa Microsoft SQL Server 2000, using --> <!-- Microsoft's JDBC driver. --> <!-- Thanks to Benjamin Geer <benjamin.geer@misys.com> --> <!-- Be sure to set the JndiName property to the name you want to look up --> <!-- the datasource under and set the location of your database in --> <!-- the xa-datasource-property section. --> <!-- ==================================================================== -->
<datasources> <xa-datasource> <jndi-name>jdbc/MSSQL_XA</jndi-name> <track-connection-by-tx /> <isSameRM-override-value>false</isSameRM-override-value> <xa-datasource-class>com.microsoft.jdbcx.sqlserver.SQLServerDataSource</xa-datasource-class> <xa-datasource-property name="ServerName">moshco</xa-datasource-property> <xa-datasource-property name="DatabaseName">Transaction</xa-datasource-property> <xa-datasource-property name="SelectMethod">cursor</xa-datasource-property> <!-- not sure if these should be here--> <user-name>sa</user-name> <password>sa12</password>
<!-- corresponding type-mapping in the standardjbosscmp-jdbc.xml (optional) --> <metadata> <type-mapping>MS SQLSERVER2000</type-mapping> </metadata> </xa-datasource>
</datasources>
|
注意:
如果你配置的不是XA数据源,你需要拷贝的是[mssql-ds.xml],如果你想在一次事务中实现多个SQL操作,你需要在配置文件中做如下的配置,与一般不同的是,Url的配置多了一段[electMethod=cursor;],这个非常重要,否则会报告[Can't start a cloned connection while in manual transaction mode]错误。
<?xml version="1.0" encoding="UTF-8"?>
<!-- ===================================================================== --> <!-- --> <!-- JBoss Server Configuration --> <!-- --> <!-- ===================================================================== -->
<!-- $Id: mssql-ds.xml,v 1.3 2004/09/15 14:37:40 loubyansky Exp $ -->
<!-- ======================================================================--> <!-- New ConnectionManager setup for Microsoft SQL Server 2000 driver --> <!-- You may download the latest Microsoft JDBC driver from *Microsoft* --> <!-- http://msdn.microsoft.com/downloads/default.asp?url=/downloads/sample.asp?url=/MSDN-FILES/027/001/779/msdncompositedoc.xml&frame=true --> <!-- ===================================================================== -->
<datasources> <local-tx-datasource> <jndi-name>jdbc/MSSQL</jndi-name> <connection-url>jdbc:microsoft:sqlserver://moshco:1433;DatabaseName=Transaction;SelectMethod=cursor;</connection-url> <driver-class>com.microsoft.jdbc.sqlserver.SQLServerDriver</driver-class> <user-name>sa</user-name> <password>sa12</password> <!-- 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> -->
<!-- corresponding type-mapping in the standardjbosscmp-jdbc.xml (optional) --> <metadata> <type-mapping>MS SQLSERVER2000</type-mapping> </metadata> </local-tx-datasource>
</datasources> |
1. 打开Jboss服务器视图:[窗体]->[显示视图]->[其它],然后选择[Jboss-IDE]->[Server Navigator],点击确定。
2. 在视图中点击右键,选择[Configuration…],选择[Jboss 4.0.x],点击[新建],输入名称[JBoss 4.0.5.GA],设置Jboss的安装目录[D:/jboss-4.0.5.GA],选择服务器配置[all],点击[应用],点击关闭;
3. 运行[/ant.bat];
4. 在服务器视图中选择,刚才设置的服务器,点击右键,选择[start],如果弹出Window防火墙的窗体,选择解除阻止;
这里需要说明一下:它表示你配置的数据源[jdbc/MSSQL_XA]被绑定到了[java:jdbc/MSSQL_XA],所以在引用的时候不能写成[java:comp/env/jdbc/MSSQL]。 |
如果你的程序在调试时出现下面的错误,你需要删除[WEB-INF/lib]下的EJB Jar包,或者在发布的时候就不要将Jar包拷贝到[WEB-INF/lib]。这个问题很奇怪,不知道JBoss怎么会出这样的错误!
java.lang.ClassCastException at com.sun.corba.se.impl.javax.rmi.PortableRemoteObject.narrow(PortableRemoteObject.java:229) |
1. 在浏览器中打开连接[http://localhost:8080/ejb2/],点击[测试EJB];正确的结果如下图:
2. 可能有人会问,从哪里可以验证我们使用的JTA正确运行了呢?你可以打开[MS SQL2000的[企业管理器]],你会发现数据库中已经多了几条记录。
1.不要疲劳状态下开发(如果累了,就喝杯咖啡,休息一下。);
2.要善于使用网络资源(www.baidu.com、www.google.cn......);
3.迂回战术(先解决能够解决的);
4.不要放弃(不要轻易说自己搞不定);
5.不要急躁(不要怨天尤人)。
MS SQL2000 Server默认情况下,是不会启动分布式服务的,需要我们进行一些设置,设置步骤如下:
1.安装补丁;
首先将MS SQL2000 JDBC安装目录下的文件[/SQLServer JTA/sqljdbc.dll]拷贝到目录[/MSSQL/Binn]下。
打开SQL查询分析器,打开MS SQL2000 JDBC安装目录下的文件[/SQLServer JTA/instjdbc.sql],选中所有的SQL代码,点击执行。
做完这步,需要从新启动数据库服务。
如果你的程序报告错误[未能找到存储过程 'master..xp_jdbc_open'],其原因就是因为你没有安装这个补丁。
2.配置服务器MSDTC服务;
打开[控制面板]->[管理工具]->[组件服务],选中[控制台根目录]->[组件服务]->[计算机]->[我的电脑],点击右键,选择[属性],选择[MSDTC]->[安全性配置],选择[网络DTC]访问,选择[启用XA事务],确认[DTC]登录帐号是:[NT AUTHORITY/NetworkService],然后确定。
如果你的JBoss服务器已经启动,做完这一步,你需要从新启动的JBoss服务。
如果你的程序报告下面的错误,其原因,就是因为你没有配置服务器的MSDTC服务。
[JBossManagedConnectionPool] Throwable while attempting to get a new connection: null org.jboss.resource.JBossResourceException: Could not create connection; - nested throwable: (java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]Error establishing socket.) |
3.启动数据库DTC服务;
打开[企业管理器],在数据库目录下选择[支持服务]->[分布式事务处理协调器],点击右键选择[启动]。
如果你的程序报告错误如下,其原因就是因为你没有打开这项服务。
Throwable while attempting to get a new connection: null org.jboss.resource.JBossResourceException: Could not create connection; - nested throwable: (java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]xa_open (0) returns -3) |
或者是:
Could not create connection; - nested throwable: (java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]Failed to initialize DTC. Check if DTC service is running.) |
查找JNDI:
如果要查明自己获取资源JNDI的正确写法,可以打开如下连接[http://localhost:8080/jmx-console/],如果要求输入用户名和密码,你可以在JBoss安装目录的[server/all/conf/props/ jmx-console-users.properties]中找到,默认是:[admin/admin]。在打开的视图中选择[jboss]->[ service=JNDIView]
这里 |
进入程序,到[list]方法,点击下面的按钮[Invoke];
这里 |
Eclipse+Jboos开发JTA实战经验