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] 
  
   
  
   
  
  
  
   
 
  |