1、下载和安装 <1>下载可以到www.jboss.org下载,我下的是jboss3.2.1。并且不是那个和tomcat整合的版本。 <2>安装方法就是将文件解压到硬盘的某个目录下(例如:我的解到 d:\jboss-3.2.1)。 2、配置 <1>首先必须安装jdk。jboss不像weblogic自带java标准开发包。我安装的是1.4 安装目录是C:\j2sdk1.4.0 。 <2>设置环境变量 <<1>>JAVA_HOME设置为JDK的安装目录(例如:我的为C:\j2sdk1.4.0) <<2>>classpath的设置:看看我的,大家就知道该包含哪些包了 C:\j2sdk1.4.0\lib\tools.jar; D:\jboss-3.2.1\server\default\lib\javax.servlet.jar; D:\jboss-3.2.1\server\default\lib\jboss-j2ee.jar; .; D:\jboss-3.2.1\client\jbossall-client.jar; D:\jboss-3.2.1\client\jnet.jar; D:\jboss-3.2.1\client\log4j.jar; 3、运行 进入jboss3.2.1的bin目录,执行run.bat就可以了。看到出现 00:59:26,978 INFO [Server] JBoss (MX MicroKernel) [3.2.1 (build: CVSTag=JBoss_3 _2_1 date=200305041533)] Started in 17s:595ms 这样的提示信息就说明启动成功,测试方法如下 http://localhost:8080/jmx-console 你将看到jmx agent view
4、使用 <1>html,jsp测试 jboss的默认web目录是在jboss-3.2.1\server\default\deploy下面。下面就介绍测试jsp,servlet,ejb的方法: 对于测试首先在deploy下建立一个test.war文件夹,然后将html,jsp文件都可以放到这里进行测试 例如建立一test.jsp如下: <%@ page language="java" %> <%@ page contentType="text/html;charset=gb2312" %> <%@ page import="java.util.*" %> <%=new Date().toLocalString()%> 通过http://localhost:8080/test/test.jsp调用就可得到当前日期时间。 <2>设置sql server2000的数据源然后在jsp中操调用操作数据库 <<1>>下载安装sql server2000的jdbc驱动(微软提供) <<2>>将mssqlserver,msbase,msutil三个jar文件复制到jboss-3.2.1\server\default\lib目录下面 <<3>>将jboss-3.2.1\docs\examples\jca\mssql-ds.xml复制一份到jboss-3.2.1\server\default\deploy下面 部分修改如下: <datasources> <local-tx-datasource> <jndi-name>ds</jndi-name> <connection-url>jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=Northwind</connection-url> <driver-class>com.microsoft.jdbc.sqlserver.SQLServerDriver</driver-class> <user-name>sa</user-name> <password></password> </local-tx-datasource> </datasources>
上面的配置就是用ds作为数据源的名称,用不带密码的sa用户连接sql server的样板数据库northwind。你可以作适当的修改。 <<4>>配置完成后,用如下testSql.jsp文件测试数据库操作 <%@ page language="java" %> <%@ page import="javax.naming.*" %> <%@ page import="javax.sql.*" %> <%@ page import="java.sql.*" %> <%! javax.sql.DataSource ds; %> <% try { Context ctx = new InitialContext(); ds = (javax.sql.DataSource)ctx.lookup("java:/ds"); } catch (Exception e) { out.println("erro when connect to java naming api"); } Connection conn = ds.getConnection(); Statement st = conn.createStatement(); String sqlStr = "select * from categories"; ResultSet rs = st.executeQuery(sqlStr); while ( rs.next() ) { out.println(rs.getString("categoryName")+"<br>"); } rs.close(); st.close(); conn.close(); %> 将输出categories表的每条记录的categoryName,值得注意的是在mssql-ds.xml设置的jndi-name是ds,而真正的绑定是 java:/ds。
<3> servlet的配置测试 <<1>>编写并编译如下的简单servlet import java.io.*; import javax.servlet.*; import javax.servlet.http.*;
public class HelloWorld extends HttpServlet { public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println(""); out.println("Hello World"); out.println("<p><p><p><p><div align='right'>author's email:[email protected]</div>"); } } <<2>>在test.war文件夹下建立一个WEB-INF目录,里面再建立一个classes目录和web.xml文件目录结构如下: [test.war] [WEB-INF] [classes] web.xml 将编译成功的HelloWorld.class放置到classes目录下,web.xml内容如下:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN" "http://java.sun.com/j2ee/dtds/web-app_2.2.dtd"> <web-app> <servlet> <servlet-name>HelloWorld</servlet-name> <servlet-class>HelloWorld</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloWorld</servlet-name> <url-pattern>/HelloWorld</url-pattern> </servlet-mapping> </web-app>
通过调用http://localhost:8080/test/HelloWorld 就可以看到hello world的输出 <4>session bean的测试(Hello) 这是一个简单的stateless session bean的测试 <<1>>Hello.java
import java.rmi.RemoteException; import javax.ejb.EJBObject;
public interface Hello extends javax.ejb.EJBObject { public String hello() throws java.rmi.RemoteException; }
<<2>>HelloHome.java
import java.rmi.RemoteException;
public interface HelloHome extends javax.ejb.EJBHome { Hello create() throws java.rmi.RemoteException,javax.ejb.CreateException; }
<<3>>HelloBean.java import javax.ejb.SessionBean; import javax.ejb.SessionContext;
public class HelloBean implements javax.ejb.SessionBean { private SessionContext ctx; public void ejbCreate() { System.out.println("ejbCreate()"); } public void ejbRemove() { System.out.println("ejbRemove()"); } public void ejbActivate() { System.out.println("ejbActivate()"); } public void ejbPassivate() { System.out.println("ejbPassivate()"); } public void setSessionContext(javax.ejb.SessionContext ctx) { his.ctx = ctx; } public String hello() { System.out.println("hello()"); return "hello,world"; } } <<4>>ejb-jar.xml <?xml version="1.0"?> <!DOCTYPE ejb-jar PUBLIC '-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN' 'http://java.sun.com/dtd/ejb-jar_2_0.dtd'>
<ejb-jar> <enterprise-beans> <session> <ejb-name>Hello</ejb-name> <home>HelloHome</home> <remote>Hello</remote> <ejb-class>HelloBean</ejb-class> <session-type>Stateless</session-type> <transaction-type>Container</transaction-type> </session> </enterprise-beans> </ejb-jar> <<5>>jboss.xml <?xml version="1.0" encoding="UTF-8"?> <jboss> <enterprise-beans> <session> <ejb-name>Hello</ejb-name> <jndi-name>HelloEJB</jndi-name> </session> </enterprise-beans> </jboss> <<6>>
编译3个.java文件后按照以下路径存放文件(假设放到d:\sessionEjb下面) d:\sessionEjb\Hello.class d:\sessionEjb\HelloBean.class d:\sessionEjb\HelloHome.class d:\sessionEjb\META-INF\ejb-jar.xml d:\sessionEjb\META-INF\jboss.xml
然后打包d:\sessionEjb\jar cvf helloejb.jar *.*,打包后将helloejb.jar放到deploy目录下面,会在控制台看到如下输出
11:35:30,815 INFO [EjbModule] Creating 11:35:30,825 INFO [EjbModule] Deploying Hello 11:35:30,835 INFO [StatelessSessionContainer] Creating 11:35:30,835 INFO [StatelessSessionInstancePool] Creating 11:35:30,835 INFO [StatelessSessionInstancePool] Created 11:35:30,845 INFO [StatelessSessionContainer] Created 11:35:30,845 INFO [EjbModule] Created 11:35:30,845 INFO [EjbModule] Starting 11:35:30,845 INFO [StatelessSessionContainer] Starting 11:35:30,905 INFO [StatelessSessionInstancePool] Starting 11:35:30,905 INFO [StatelessSessionInstancePool] Started 11:35:30,905 INFO [StatelessSessionContainer] Started 11:35:30,905 INFO [EjbModule] Started 11:35:30,905 INFO [EJBDeployer] Deployed: file:/D:/jboss-3.2.1/server/default/d eploy/helloejb.jar 11:35:30,925 INFO [MainDeployer] Deployed package: file:/D:/jboss-3.2.1/server/ default/deploy/helloejb.jar
表明配置没有错误信息
测试的客户端代码
import javax.naming.InitialContext; import javax.naming.Context; import javax.naming.NamingException; import javax.ejb.CreateException; import java.rmi.RemoteException; import javax.rmi.PortableRemoteObject; import java.util.Properties; import java.awt.*; import java.awt.event.*; import javax.swing.*;
public class HelloWorldClient extends JFrame implements ActionListener { public HelloWorldClient() { addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); setTitle("EJBClient"); setSize(300,200); Container contentPane = getContentPane(); area = new JTextArea(6,20); subButton = new JButton("Say hello to EJB"); subButton.setActionCommand("sya"); subButton.addActionListener(this); contentPane.add(area,"Center"); contentPane.add(subButton,"South"); } public void actionPerformed(ActionEvent e) { if ( e.getActionCommand().equals("sya") ) { ejbSays = getEJBInfo(); area.append(ejbSays + "\n"); } } public String getEJBInfo() { try { Context jndiContext = getInitialContext(); Object ref = jndiContext.lookup("HelloEJB"); HelloHome home = (HelloHome)PortableRemoteObject.narrow(ref,HelloHome.class); Hello hw= home.create(); ejbSays = hw.hello(); } catch (java.rmi.RemoteException e) { e.printStackTrace(); } catch ( Throwable t ) { t.printStackTrace(); } finally { } return ejbSays; } public static Context getInitialContext() throws Exception { Properties p = new Properties(); p.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory"); p.put(Context.PROVIDER_URL, "localhost:1099"); return new InitialContext(p); } public static void main(String[] args) { JFrame win = new HelloWorldClient(); win.pack(); win.setVisible(true); } private String ejbSays=""; private JTextField info; private JButton subButton; private JTextArea area; }
作了一个简单的gui,主要注意的是getInitalContext()方法jboss的连接参数的设置和getEJBInfo()方法对ejb的调用
将编译好的HelloWorldClient.class,HelloWorldClient$1.class,放置到d:\sessionbean目录下(如果放到别的地方,确定可以 通过路径找到HelloBean,HelloHome,Hello类
d:\sessionbean\java HelloWorldClient
点按钮就会返回hello world(做gui是为了复习一下以前的知识)
<5>cmp的测试 此cmp继续使用上面的数据源对应的northwind数据库,要在其中建一个表cd。 <<1>>CD.java
import javax.ejb.EJBObject; import java.rmi.RemoteException;
public interface CD extends EJBObject {
public Integer getId() throws RemoteException; public void setId(Integer id) throws RemoteException; public String getTitle() throws RemoteException; public void setTitle(String title) throws RemoteException;
public String getArtist() throws RemoteException; public void setArtist(String artist) throws RemoteException;
public String getType() throws RemoteException; public void setType(String type) throws RemoteException;
public String getNotes() throws RemoteException; public void setNotes(String notes) throws RemoteException; }
<<2>>CDHome.java
import javax.ejb.EJBHome; import javax.ejb.CreateException; import javax.ejb.FinderException; import java.rmi.RemoteException; import java.util.Collection;
public interface CDHome extends EJBHome { public CD create(Integer id,String title,String artist,String type,String notes) throws RemoteException,CreateException;
public CD findByPrimaryKey(Integer id) throws RemoteException,FinderException;
public Collection findByType(String type) throws RemoteException,FinderException;
}
<<3>>CDBean.java import javax.ejb.EntityBean; import javax.ejb.EntityContext; import java.rmi.RemoteException; import javax.ejb.CreateException;
public abstract class CDBean implements EntityBean { EntityContext ctx;
public Integer id; public String title; public String artist; public String type; public String notes;
public Integer ejbCreate(Integer id,String title,String artist,String type,String notes) throws CreateException{ setId(id); setTitle(title); setArtist(artist); setType(type); setNotes(notes); return id; }
public void ejbPostCreate(Integer id,String title,String artist,String type,String notes) { }
public abstract String getTitle() ;
public abstract void setTitle(String _title) ; public abstract Integer getId() ;
public abstract void setId(Integer _id); public abstract String getArtist();
public abstract void setArtist(String _artist) ;
public abstract String getType() ; public abstract void setType(String _type) ;
public abstract String getNotes() ;
public abstract void setNotes(String _notes);
public void setEntityContext(EntityContext ctx) { this.ctx = ctx; }
public void unsetEntityContext() { ctx = null; }
public void ejbActivate() {} public void ejbPassivate() {} public void ejbLoad() {} public void ejbStore() {} public void ejbRemove() {} }
<<4>>ejb-jar.xml
<?xml version="1.0"?>
<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd">
<ejb-jar> <display-name>MusicCDs</display-name> <enterprise-beans> <entity> <description>Modles a music CD</description> <ejb-name>CDBean</ejb-name> <home>CDHome</home> <remote>CD</remote> <ejb-class>CDBean</ejb-class> <persistence-type>Container</persistence-type> <prim-key-class>java.lang.Integer</prim-key-class> <reentrant>False</reentrant> <cmp-version>2.x</cmp-version> <abstract-schema-name>cd</abstract-schema-name> <cmp-field><field-name>id</field-name></cmp-field> <cmp-field><field-name>title</field-name></cmp-field> <cmp-field><field-name>artist</field-name></cmp-field> <cmp-field><field-name>type</field-name></cmp-field> <cmp-field><field-name>notes</field-name></cmp-field>
<primkey-field>id</primkey-field>
<query> <query-method> <method-name>findByType</method-name> <method-params> <method-param>java.lang.String</method-param> </method-params> </query-method> <ejb-ql><![CDATA[ SELECT OBJECT(A) FROM cd AS A WHERE A.type=?1 ]]></ejb-ql> </query> </entity> </enterprise-beans>
<assembly-descriptor> <container-transaction> <method> <ejb-name>CDBean</ejb-name> <method-name>*</method-name> </method> <trans-attribute>Required</trans-attribute> </container-transaction> </assembly-descriptor> </ejb-jar>
<<5>>jboss.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE jboss PUBLIC "-//JBoss//DTD JBOSS 3.0//EN" "http://www.jboss.org/j2ee/dtd/jboss_3_0.dtd">
<jboss> <enterprise-beans> <entity> <ejb-name>CDBean</ejb-name> <jndi-name>ejb/cdbean</jndi-name> </entity> </enterprise-beans> </jboss>
<<6>>jbosscmp-jdbc.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE jbosscmp-jdbc PUBLIC "-//JBoss//DTD JBOSSCMP-JDBC 3.0//EN" "http://www.jboss.org/j2ee/dtd/jbosscmp-jdbc_3_0.dtd">
<jbosscmp-jdbc> <defaults> <datasource>java:/ds</datasource> <datasource-mapping>MS SQLSERVER2000</datasource-mapping> <create-table>true</create-table> <remove-table>true</remove-table> <pk-constraint>true</pk-constraint> <preferred-relation-mapping>foreign-key</preferred-relation-mapping> </defaults>
<enterprise-beans>
<entity> <ejb-name>CDBean</ejb-name> <table-name>cd</table-name>
<cmp-field> <field-name>id</field-name> <column-name>id</column-name> </cmp-field>
<cmp-field> <field-name>title</field-name> <column-name>title</column-name> </cmp-field>
<cmp-field> <field-name>artist</field-name> <column-name>artist</column-name> </cmp-field>
<cmp-field> <field-name>type</field-name> <column-name>type</column-name> </cmp-field>
<cmp-field> <field-name>notes</field-name> <column-name>notes</column-name> </cmp-field> </entity>
</enterprise-beans>
</jbosscmp-jdbc>
需要解释的是 <create-table>true</create-table> <remove-table>true</remove-table> 会在部署的时候自动在库中建立数据表,而在删除的时候同时删除对应的表
<<7>>编译部署 编译3个.java文件,按照下面的目录结构存放(假设放在d:\cmpbean下面) d:\cmpbean\CD.class d:\cmpbean\CDHome.class d:\cmpbean\CDBean.class d:\cmpbean\META-INF\ejb-jar.xml d:\cmpbean\META-INF\jboss.xml d:\cmpbean\META-INF\jbosscmp-jdbc.xml
打包:d:\cmpbean\jar cvf cdejb.jar *.*
将cdejb.jar复制到deploy目录下
<<8>>客户端代码测试
import javax.naming.InitialContext; import javax.naming.Context; import javax.naming.NamingException; import javax.ejb.CreateException; import java.rmi.RemoteException; import javax.rmi.PortableRemoteObject; import java.util.Properties; import java.util.*;
public class CDClient { public static Context getInitialContext() throws Exception { Properties p = new Properties(); p.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory"); p.put(Context.PROVIDER_URL, "localhost:1099"); return new InitialContext(p); }
public static void main(String[] args) { try { Context jndiContext = getInitialContext(); Object ref= jndiContext.lookup("ejb/cdbean"); CDHome home = (CDHome)PortableRemoteObject.narrow(ref,CDHome.class); home.create(new Integer(100),"Bohn jove","rock and roll","rock","a good type"); home.create(new Integer(200),"黑宝","rock","rock","roll star"); home.create(new Integer(300),"mike jackson","sssss","iiop","none"); Collection c = home.findByType("rock"); Iterator i = c.iterator(); while ( i.hasNext() ) { String ss = ( (CD)javax.rmi.PortableRemoteObject.narrow(i.next(),CD.class)).getNotes(); System.out.println(ss); }
} catch (java.rmi.RemoteException e) { e.printStackTrace(); } catch (Throwable t) { t.printStackTrace(); } finally { } } }
请确保通过类路径可以找到CD.class,CDHome.Class. 执行java CDclient 将看到如下输出:
D:\cmpbean\>java CDClient a good type roll star
D:\cmpbean\>
5、结束语
首先我也是个初学者,自己在csdn上多次提问有关jboss的问题,却所得到回答甚少。 而且搜索了很久也找不到相应的文档可以了解jboss3.2的使用。 为此希望写此文档为初学者提供一点帮助,错误的地方还请指正。 另外、对于jboss3.2 mssql-xa-ds.xml的设置以及连接池的 使用方法,有谁弄过,请告诉我,不胜感激。 email: [email protected]

|