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:zhjx_10@hotmail.com</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: zhjx_10@hotmail.com