weblogic 9.0實在太慢了,今天嘗試了一下配置jboss4.04 + tomcat5.0, 居然通過了,呵呵,愚人自得。。。
只要運行jboss 的run就可以了,自動起tomcat。
三、JBoss的目錄結構
1.bin:開始和停止JBoss的地方。
其中有兩個主要的批處理文件:run.bat和shutdown.bat。要啓動jboss只要執行run.bat文件即可;要停止JBoss必須執行shutdown.bat。
注意,shutdown.bat文件直接執行並不會自動停止JBoss,它必須要輸入參數,參數意義如下:
h顯示幫助信息;D設置系統屬性;-停止處理選項;s停止用JNDI URL指定的遠程服務;n通過制定JMX名字來停止服務;a適配到指定的JNDI名稱的遠程服務;u指定用戶名稱;p指定用戶密碼;S停止服務器;e從虛擬機退出;H暫停。
一般,我們使用S選項來停止服務器。即使執行shutdown.bat -S。
2.docs:放置jboss的例子、測試腳本和各種腳本配置文件的DTD。
3.lib:放置jboss所需要的部分jar包文件。
4.client:放置EJB客戶端運行時所需要的jar包。
5.server:放置各啓動類型的服務器端EJB配置所需要的文件等。
四、啓動並檢驗
打開IE輸入
http://localhost:8080/jmx-concose
如果有頁面則表示JBOSS和TOMCAT配置成功
同時轉貼一下簡單deploy JSP方法:
一、編寫一個最簡單的jsp文件
先寫一個簡單的html,代碼如下:
<html>
<body>HelloWorld</body>
</html>
將文件保存爲index.jsp,我們暫定存放的目錄爲C:/jsp。
二、製作war部署文件
1.JDK提供了一個打包工具,就是jdk的bin目錄的那個jar.exe應用程序。爲了更方便的使用這個程序,我們在系統的path環境變量中增加jdk/bin的路徑,這樣我們就可以直接訪問jar.exe了。
2.對於jar的使用方法,我建議各位直接察看jar的幫助,在這裏我就不詳細說明了。pass:你問我怎麼看幫助?簡單,運行一下jar.exe即可:)
3.在我們存放index.jsp的目錄,即c:/jsp中執行jar cvf hello.war index.jsp,可以看到在目錄中多了一個剛生成的hello.war文件,這個就是我們要部署到jboss中的包文件。它包含了一個網絡訪問的索引和目錄結構。
4.把生成的hello.war拷貝到jboss安裝目錄/server/default/deploy/下,部署成功。
三、測試jsp
首先,保證jboss已經成功啓動。然後,打開瀏覽器輸入網址:http://localhost:8080/hello/。如果頁面中顯示HelloWorld字樣,那麼表示發佈成功了。成功後,你可以看到地址欄自動變爲打開瀏覽器,輸入網址:http://localhost:8080/hello/index.jsp
四、製作並部署SERVLET
還記得上次測試jsp時使用的jar程序嗎?這次我們還是用它來生成部署的war文件。
在c:/servlet下執行jar cvf hello.war *.*,很快就生成了一個名爲hello.war的文件,接着把hello.war複製到jboss的安裝目錄/server/default/deploy/下完成部署。
五、測試
在瀏覽器的地址欄中輸入http://localhost:8080/hello/HelloWorld如果出現HelloWorld字樣那麼部署成功。
另一個deploy JSP, Servlet, EJB 的文章:
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.0lib ools.jar;
D:jboss-3.2.1serverdefaultlibjavax.servlet.jar;
D:jboss-3.2.1serverdefaultlibjboss-j2ee.jar;
.;
D:jboss-3.2.1clientjbossall-client.jar;
D:jboss-3.2.1clientjnet.jar;
D:jboss-3.2.1clientlog4j.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.1serverdefaultdeploy下面。下面就介紹測試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.1serverdefaultlib目錄下面
<<3>>將jboss-3.2.1docsexamplesjcamssql-ds.xml複製一份到jboss-3.2.1serverdefaultdeploy下面
部分修改如下:
<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:sessionEjbHello.class
d:sessionEjbHelloBean.class
d:sessionEjbHelloHome.class
d:sessionEjbMETA-INFejb-jar.xml
d:sessionEjbMETA-INFjboss.xml
然後打包d:sessionEjbjar 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 + " ");
}
}
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:sessionbeanjava 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:cmpbeanCD.class
d:cmpbeanCDHome.class
d:cmpbeanCDBean.class
d:cmpbeanMETA-INFejb-jar.xml
d:cmpbeanMETA-INFjboss.xml
d:cmpbeanMETA-INFjbosscmp-jdbc.xml
打包:d:cmpbeanjar 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>