中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Java > 软件工程
用Cactus来测试J2ee应用
作者:未知 时间:2005-07-24 21:26 出处:JR 责编:chinaitpower
              摘要:用Cactus来测试J2ee应用
Author: 韩伟 北京某公司系统分析员
Date: 2002 年 8 月
From: IBM developerWorks (original file)
Modified by Bruce


Junit是当前最流行的测试框架,它能够让开发人员很方便的编写测试单元,可以使他们"放心"地开发。但是现在很多的应用都是基于j2ee的,代码都是在服务器端的容器里面运行,这个使测试带来了一些麻烦。对于普通的jsp,servlet用Junit来测试好像已经不是那么方便,对于EJB来说,特别是2.0版本,很多接口都是Local Interface,没有办法进行分布式的测试。那么我们如何进行这些代码的测试呢?Apache为我们提供了一个强大的工具 Cactus!它是一套简单,易于使用的服务器端测试框架,可以使开发人员很轻松的测试服务器端的程序,他们会说:"哦,就是这么简单"。Cactus是Junit的一个扩展,但是它又和Junit有一些不同。Cactus的测试分为三种不同的测试类别,JspTestCase,ServletTestCase,FilterTestCase,而不是像Junit就一种TestCase。Cactus的测试代码有服务器端和客户端两个部分,他们协同工作。那我们为什么不用Junit来做测试呢?主要有一下几个理由:
  1. EJB2.0中的Local interface ,不允讯远程调用。用Junit不好测试,而Cactus的redirector位于服务器端,可以和EJB运行在一个容器中,这使得它可以直接访问Local Interface。
  2.  
  3. 一般EJB或者servlet,jsp都是运行在服务器上,如果你使用junit测试的话,你的测试是在客户端,这使的运行环境和测试环境处于不同的系统环境中,这个有时候会不同的测试结果。
  4.  
  5. 在一个EJB的应用中,一般都会有一些前端应用来访问EJB,例如:jsp,servlet,javabean。这就意味着你需要一个测试框架来测试这些前端的组件。Cactus提供了所有这些组件的测试方法。哦,太棒了。 

  6. Cactus和ant很好的结合在一起,可以很容易的完成自动化测试,减少了很多工作量。当然,junit也提供这样的支持。


前面是对Cactus作了一个大致的介绍,接下来我们用一个实际的例子来运用一下这个强大的测试框架。首先我们需要一个被测试的对象,在这里我们选用EJB2.0 CMP.我们做一个简单的用户管理。以下就一些主要的代码,来进行一些分析。

User相关类


UserHome.java
  1. package usersystem;
  2. import javax.ejb.*;
  3. import java.util.*;
  4. public interface UserHome extends javax.ejb.EJBLocalHome {
  5.   public User create(String name, String password) throws CreateException;
  6.   public Collection findAll() throws FinderException;
  7.     public User findByPrimaryKey(String name) throws FinderException;
  8. }


User.java
  1. package usersystem;
  2. import javax.ejb.*;
  3. import java.util.*;
  4. public interface User extends javax.ejb.EJBLocalObject {
  5.   public String getName();
  6.   public void setPassword(String password);
  7.   public String getPassword();
  8.   public void setUserInfo(UserInfo userInfo);
  9.   public UserInfo getUserInfo();
  10.   public void setName(String name);
  11. }

UserInfo相关类


UserInfoHome.java
  1. package usersystem;
  2. import javax.ejb.*;
  3. import java.util.*;
  4. public interface UserInfoHome extends javax.ejb.EJBLocalHome {
  5.     public UserInfo create(String name, String email, String address, String tel) throws 
  6. CreateException;
  7.     public UserInfo findByPrimaryKey(String name) throws FinderException;
  8. }


这里有两个Entity Bean用来创建用户信息。他们之间的关系在xml部署描述文件中描述,他们是1对1的关系。

UserManager相关类


UserManagerLocal.java

  1. package usersystem;
  2. import javax.ejb.*;
  3. import java.util.*;
  4. public interface UserManagerLocal extends javax.ejb.EJBLocalObject {
  5.     public void addUser(String name, String password, String email, String address, String tel);
  6.     public Collection findAll() ;
  7.     public void delAll();
  8.     public void delByName(String name);
  9.     public User findByName(String name) ;
  10. }


UserManagerBean.java

  1. package usersystem;
  2. import javax.ejb.*;
  3. import javax.rmi.PortableRemoteObject;
  4. import javax.naming.*;
  5. import java.util.*;
  6. public class UserManagerBean implements SessionBean {
  7.   SessionContext sessionContext;
  8.   public void ejbCreate() throws CreateException {
  9.     /**@todo Complete this method*/
  10.   }
  11.   public void ejbRemove() {
  12.     /**@todo Complete this method*/
  13.   }
  14.   public void ejbActivate() {
  15.     /**@todo Complete this method*/
  16.   }
  17.   public void ejbPassivate() {
  18.     /**@todo Complete this method*/
  19.   }
  20.   public void setSessionContext(SessionContext sessionContext) {
  21.     this.sessionContext = sessionContext;
  22.   }
  23.   /**
  24.    * 添加用户
  25.    * @param name 用户姓名
  26.    * @param password 密码
  27.    * @param email 电子邮件
  28.    * @param address 地址
  29.    * @param tel 电话
  30.    */
  31.   public void addUser(String name, String password, String email, String address, String tel) {
  32.       try{
  33.           UserHome userHome=getUserHome();
  34.           User user=userHome.create(name,password)  ;  //create user entity
  35.           UserInfoHome userInfoHome=getUserInfoHome();
  36.           UserInfo userInfo=userInfoHome.create(name,email,address,tel) ;// create userinfo 
  37. entity
  38.           user.setUserInfo(userInfo) ;
  39.       }catch(Exception e){
  40.           throw new javax.ejb.EJBException (e.toString());
  41.       }
  42.   }
  43.   /**
  44.    * 返回UserHome接口
  45.    * @return userHome
  46.    */
  47.   private UserHome getUserHome(){
  48.     try {
  49.         javax.naming.InitialContext ctx=new javax.naming.InitialContext ();
  50.           Object ref = ctx.lookup("User");
  51.           //cast to Home interface
  52.           UserHome userHome = (UserHome) PortableRemoteObject.narrow(ref, UserHome.class);
  53.           return userHome;
  54.     }
  55.     catch (ClassCastException ex) {
  56.         ex.printStackTrace() ;
  57.         return null;
  58.     }catch (NamingException ex) {
  59.         ex.printStackTrace() ;
  60.         return null;
  61.     }
  62.   }
  63.   /**
  64.    * 返回UserInfoHome接口
  65.    * @return
  66.    */
  67.   private UserInfoHome getUserInfoHome(){
  68.     try {
  69.         javax.naming.InitialContext ctx=new javax.naming.InitialContext ();
  70.           Object ref = ctx.lookup("UserInfo");
  71.           //cast to Home interface
  72.           UserInfoHome userInfoHome = (UserInfoHome) PortableRemoteObject.narrow(ref, 
  73. UserInfoHome.class);
  74.           return userInfoHome;
  75.     }
  76.     catch (ClassCastException ex) {
  77.         throw new EJBException();
  78.     }catch (NamingException ex) {
  79.         throw new EJBException(ex.toString());
  80.     }
  81.   }
  82.   /**
  83.    * 返回所有用户记录
  84.    * @return c
  85.    * @throws javax.ejb.FinderException
  86.    */
  87.   public java.util.Collection findAll() {
  88.     Collection c = null;
  89.     try {
  90.         UserHome uh=this.getUserHome() ;
  91.           c=uh.findAll() ;
  92.     }
  93.     catch (FinderException ex) {
  94.             throw new javax.ejb.EJBException ();
  95.     }
  96.       return c;
  97.   }
  98.     /**
  99.      * 删除所有记录
  100.      */
  101.     public void delAll(){
  102.         try {
  103.             UserHome u=getUserHome();
  104.             java.util.Collection c=u.findAll() ;
  105.             java.util.Iterator i=c.iterator() ;
  106.             while(i.hasNext() ){
  107.                 u.remove(((User)i.next()).getName()) ;
  108.             }
  109.         }
  110.         catch (Exception ex) {
  111.             throw new EJBException(ex.toString());
  112.         }
  113.     }
  114.     /**
  115.      * 根据用户名删除记录
  116.      * @param name
  117.      */
  118.     public void delByName(String name) {
  119.         try {
  120.             User user=findByName(name);
  121.             UserHome uh=getUserHome();
  122.             uh.remove(user.getName()) ;
  123.         }
  124.         catch (Exception ex) {
  125.             throw new javax.ejb.EJBException (ex.toString());
  126.         }
  127.     }
  128.     /**
  129.      * 通过用户名查找用户记录
  130.      * @param name
  131.      * @return
  132.      */
  133.     public User findByName(String name) {
  134.         try {
  135.             UserHome uh=this.getUserHome() ;
  136.             User user=(User)uh.findByPrimaryKey(name) ;
  137.             UserHome u=this.getUserHome() ;
  138.             User uu=u.findByPrimaryKey(name)  ;
  139.             return user;
  140.         }
  141.         catch (FinderException ex) {
  142.             throw new EJBException(ex.toString());
  143.         }
  144.     }
  145. }


UserManagerBean是一个session bean ,它主要是对user的管理,和客户端通讯,其实就是session facade模式 。代码里面有注释,这里就不多叙述了。

ejb-jar.xml 部署文件描述


[pre]<?xml version="1.0" encoding="UTF-8"?>
<!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>
            <display-name>UserManager</display-name>
            <ejb-name>UserManager</ejb-name>
            <local-home>usersystem.UserManagerLocalHome</local-home>
            <local>usersystem.UserManagerLocal</local>
            <ejb-class>usersystem.UserManagerBean</ejb-class>
            <session-type>Stateless</session-type>
            <transaction-type>Container</transaction-type>
            <ejb-local-ref>
                <description />
                <ejb-ref-name>User</ejb-ref-name>
                <ejb-ref-type>Entity</ejb-ref-type>
                <local-home>usersystem.UserHome</local-home>
                <local>usersystem.User</local>
                <ejb-link>User</ejb-link>
            </ejb-local-ref>
            <ejb-local-ref>
                <description />
                <ejb-ref-name>UserInfo</ejb-ref-name>
                <ejb-ref-type>Entity</ejb-ref-type>
                <local-home>usersystem.UserInfoHome</local-home>
                <local>usersystem.UserInfo</local>
                <ejb-link>UserInfo</ejb-link>
            </ejb-local-ref>
        </session>
        <entity>
            <display-name>User</display-name>
            <ejb-name>User</ejb-name>
            <local-home>usersystem.UserHome</local-home>
            <local>usersystem.User</local>
            <ejb-class>usersystem.UserBean</ejb-class>
            <persistence-type>Container</persistence-type>
            <prim-key-class>java.lang.String</prim-key-class>
            <reentrant>False</reentrant>
            <cmp-version>2.x</cmp-version>
            <abstract-schema-name>User</abstract-schema-name>
            <cmp-field>
                <field-name>name</field-name>
            </cmp-field>
            <cmp-field>
                <field-name>password</field-name>
            </cmp-field>
            <primkey-field>name</primkey-field>
            <query>
                <query-method>
                    <method-name>findAll</method-name>
                    <method-params />
                </query-method>
                <ejb-ql>select Object(theUser) from User as theUser</ejb-ql>
            </query>
        </entity>
        <entity>
            <display-name>UserInfo</display-name>
            <ejb-name>UserInfo</ejb-name>
            <local-home>usersystem.UserInfoHome</local-home>
            <local>usersystem.UserInfo</local>
            <ejb-class>usersystem.UserInfoBean</ejb-class>
            <persistence-type>Container</persistence-type>
            <prim-key-class>java.lang.String</prim-key-class>
            <reentrant>False</reentrant>
            <cmp-version>2.x</cmp-version>
            <abstract-schema-name>UserInfo</abstract-schema-name>
            <cmp-field>
                <field-name>name</field-name>
            </cmp-field>
            <cmp-field>
                <field-name>email</field-name>
            </cmp-field>
            <cmp-field>
                <field-name>address</field-name>
            </cmp-field>
            <cmp-field>
                <field-name>tel</field-name>
            </cmp-field>
            <primkey-field>name</primkey-field>
        </entity>
    </enterprise-beans>
    <relationships>
        <ejb-relation>
            <ejb-relation-name>userInfo-user</ejb-relation-name>
            <ejb-relationship-role>
                <description>userInfo</description>
                <ejb-relationship-role-name>UserInfoRelationshipRole</ejb-relationship-role-name>
                <multiplicity>One</multiplicity>
                <cascade-delete />
                <relationship-role-source>
                    <description>userInfo</description>
                    <ejb-name>UserInfo</ejb-name>
                </relationship-role-source>
                <cmr-field>
                    <description>user</description>
                    <cmr-field-name>user</cmr-field-name>
                </cmr-field>
            </ejb-relationship-role>
            <ejb-relationship-role>
                <description>user</description>
                <ejb-relationship-role-name>UserRelationshipRole</ejb-relationship-role-name>
                <multiplicity>One</multiplicity>
                <relationship-role-source>
                    <description>user</description>
                    <ejb-name>User</ejb-name>
                </relationship-role-source>
                <cmr-field>
                    <description>userInfo</description>
                    <cmr-field-name>userInfo</cmr-field-name>
                </cmr-field>
            </ejb-relationship-role>
        </ejb-relation>
    </relationships>
    <assembly-descriptor>
        <container-transaction>
            <method>
                <ejb-name>User</ejb-name>
                <method-name>*</method-name>
            </method>
            <trans-attribute>Required</trans-attribute>
        </container-transaction>
        <container-transaction>
            <method>
                <ejb-name>UserManager</ejb-name>
                <method-name>*</method-name>
            </method>
            <trans-attribute>Required</trans-attribute>
        </container-transaction>
        <container-transaction>
            <method>
                <ejb-name>UserInfo</ejb-name>
                <method-name>*</method-name>
            </method>
            <trans-attribute>Required</trans-attribute>
        </container-transaction>
    </assembly-descriptor>
</ejb-jar>[/pre]

Servlet客户端


接下来是访问EJB的客户端,我们用了一个servlet.

ManaServlet.java
  1. package usersystem.servlet;
  2. import javax.servlet.*;
  3. import javax.servlet.http.*;
  4. import java.io.*;
  5. import java.util.*;
  6. import usersystem.*;
  7. import javax.naming.*;
  8. import javax.ejb.*;
  9. import javax.ejb.*;
  10. import javax.ejb.*;
  11. /**
  12.  * <p>Title: </p>
  13.  * <p>Description: </p>
  14.  * <p>Copyright: Copyright (c) 2002</p>
  15.  * <p>Company: </p>
  16.  * @author unascribed
  17.  * @version 1.0
  18.  */
  19. public class ManaServlet extends HttpServlet {
  20.     static final private String CONTENT_TYPE = "text/html; charset=GBK";
  21.     private UserManagerLocalHome h=null;
  22.     private UserManagerLocal uml=null;
  23.     public void init() throws ServletException{
  24.         try {
  25.             h=getHome();
  26.             uml=h.create() ;
  27.         }
  28.         catch (CreateException ex) {
  29.             ex.printStackTrace() ;
  30.         }
  31.     }
  32.     public void doGet(HttpServletRequest request, HttpServletResponse response) throws 
  33. ServletExceptionIOException {
  34.     }
  35.     public void doPost(HttpServletRequest request, HttpServletResponse response) throws 
  36. ServletExceptionIOException {
  37.     }
  38.     public void addUser(HttpServletRequest request, HttpServletResponse response) throws 
  39. javax.ejb.EJBException  {
  40.         String name=request.getParameter("name") ;
  41.         String tel=request.getParameter("tel") ;
  42.         String address=request.getParameter("address") ;
  43.         String email=request.getParameter("email") ;
  44.         String pass=request.getParameter("pass") ;
  45.         uml.addUser(name,pass,email,address,tel) ;
  46.     }
  47.     public User findByName(String name) throws javax.ejb.EJBException {
  48.         User u = null;
  49.         u=uml.findByName(name) ;
  50.         return u;
  51.     }
  52.     public java.util.Iterator findAll() throws javax.ejb.EJBException {
  53.         java.util.Collection c=uml.findAll() ;
  54.         return c.iterator() ;
  55.     }
  56.     public void delAll() throws javax.ejb.EJBException {
  57.         uml.delAll() ;
  58.     }
  59.     public void delUser(String name) throws javax.ejb.EJBException  {
  60.             uml.delByName(name) ;
  61.     }
  62.     public UserManagerLocalHome getHome() {
  63.         UserManagerLocalHome home = null;
  64.         try {
  65.             javax.naming.InitialContext ctx=new javax.naming.InitialContext ();
  66.             home=(UserManagerLocalHome)ctx.lookup("UserManagerLocal") ;
  67.         }
  68.         catch (NamingException ex) {
  69.             ex.printStackTrace() ;
  70.             return null;
  71.         }
  72.         return home;
  73.     }
  74.     public void destroy() {
  75.     }
  76. }


这个servlet在doGet,doPost没有实现任何方法,这个不影响我们测试,我们要测试的只是这些public method. 我们的测试代码如下:

Cactus测试代码


  1. package usersystem.test;
  2. /**
  3.  * <p>Title: </p>
  4.  * <p>Description: </p>
  5.  * <p>Copyright: Copyright (c) 2002</p>
  6.  * <p>Company: </p>
  7.  * @author unascribed
  8.  * @version 1.0
  9.  */
  10. import usersystem.servlet.*;
  11. import java.io.IOException;
  12. import java.net.URLDecoder;
  13. import java.util.Hashtable;
  14. import junit.framework.Test;
  15. import junit.framework.TestSuite;
  16. import org.apache.cactus.Cookie;
  17. import org.apache.cactus.ServletTestCase;
  18. import org.apache.cactus.WebRequest;
  19. import org.apache.cactus.WebResponse;
  20. import javax.ejb.*;
  21. import javax.servlet.*;
  22. import usersystem.*;
  23. public class ManaServletTest  extends ServletTestCase{
  24.     ManaServlet servlet=new ManaServlet();
  25.     public ManaServletTest(String theName) {
  26.         super(theName);
  27.     }
  28.     public void setUp(){
  29.         try {
  30.             servlet.init() ;
  31.         }
  32.         catch (ServletException ex) {
  33.             ex.printStackTrace() ;
  34.             this.fail() ;
  35.         }
  36.     }
  37.     public void tearDown(){
  38.     }
  39.     public void beginAddUser(WebRequest theRequest)
  40.     {
  41.         theRequest.addParameter("name""nameValue");
  42.         theRequest.addParameter("pass","passValue") ;
  43.         theRequest.addParameter("tel","telValue") ;
  44.         theRequest.addParameter("address","addressValue") ;
  45.         theRequest.addParameter("email","emailValue");
  46.     }
  47.     public void testAddUser() throws javax.ejb.EJBException{
  48.         servlet.addUser(request,response) ;
  49.     }
  50.     public void testFindAll(){
  51.         java.util.Iterator i=servlet.findAll() ;
  52.         //assertEquals(null,i);
  53.         boolean ok=false;
  54.         while(i.hasNext() ){
  55.             if(((User)i.next()).getName().equals("nameValue")) {
  56.                 ok=true;
  57.             };
  58.         }
  59.         this.assertTrue(ok) ;
  60.     }
  61.     public void testFindByName() throws javax.ejb.EJBException {
  62.         User u=servlet.findByName("nameValue") ;
  63.         UserInfo ui=u.getUserInfo() ;
  64.         this.assertEquals("email",ui.getEmail()) ;
  65.         this.assertEquals("tel",ui.getTel()) ;
  66.         this.assertEquals("nameValue",u.getName()) ;
  67.         this.assertEquals("passValue",u.getPassword()) ;
  68.     }
  69.     public void testDel() throws javax.ejb.EJBException {
  70.             servlet.delUser("nameValue8") ;
  71.     }
  72.     public void testDelAll() throws javax.ejb.EJBException {
  73.         servlet.delAll() ;
  74.     }
  75.     public static void main(String[] theArgs)
  76.     {
  77.         junit.textui.TestRunner.main(new String[]{
  78.         ManaServletTest.class.getName()});
  79.     }
  80.     public static Test suite()
  81.     {
  82.         return new TestSuite(ManaServletTest.class);
  83.     }
  84. }


测试类 ManaServletTest 继承于ServletTestCase, 我们要测试的是一个servlet,所以我们继承ServletTestCase,如果你测试jsp的话,就继承JspTestCase.

  1.     public ManaServletTest(String theName) {
  2.         super(theName);
  3.     }

    
和junit一样,ServletTestCase不允许使用默认的构造函数,所以必须使用一个带参数的构造函数,并且调用父类的构造函数。

  1.     public void setUp(){
  2.         try {
  3.             servlet.init() ;
  4.         }
  5.         catch (ServletException ex) {
  6.             ex.printStackTrace() ;
  7.             this.fail() ;
  8.         }
  9.     }
  10.     public void tearDown(){
  11.     }


setUp是在测试类运行时候首先被调用的办法,在这里可以进行一些数据初始化之类的工作。在这里我们调用了 servlet.init().

在测试类运行的时候需要显式的调用servlet的init()方法。因为cactus在测试servlet的时候是实例化一个servlet的,不会调用inti(),而servlet enginer在调用的时候是会自动调用servlet的init()方法的。tearDown方法在测试完成的时候运行,进行一些必要的数据处理,比如删除一些测试数据等,这里我们没有做任何工作。

  1.     public void beginAddUser(WebRequest theRequest)
  2.     {
  3.         theRequest.addParameter("name""nameValue");
  4.         theRequest.addParameter("pass","passValue") ;
  5.         theRequest.addParameter("tel","telValue") ;
  6.         theRequest.addParameter("address","addressValue") ;
  7.         theRequest.addParameter("email","emailValue");
  8.     }
  9.     public void testAddUser() throws javax.ejb.EJBException{
  10.         servlet.addUser(request,response) ;
  11.     }


在Cactus中,你需要用testXXX来命名你的方法,这样Cactus会自动调用这个方法进行测试。而BeingXXX则是在调 用test方法之前调用,也就是说在一个功能测试之前运行。这里我们现在beginAddUser中添加一些必要的参数 。WebRequest是Cactus提供的一个类,它允许你设置一些Http参数,如果你使用了 theRequest.addParameter("name","nameValue"),那么在servlet中你就可以用request.getParameter("name") 来取得name的值。当然还可以设置Cookie,Http Head参数。在testAddUser()方法中我们测试addUser方法,如 果测试有异常,则会产生EJBException,得到一个测试失败。

  1.     public void testFindByName() throws javax.ejb.EJBException {
  2.         User u=servlet.findByName("nameValue") ;
  3.         UserInfo ui=u.getUserInfo() ;
  4.         this.assertEquals("email",ui.getEmail()) ;
  5.         this.assertEquals("tel",ui.getTel()) ;
  6.         this.assertEquals("nameValue",u.getName()) ;
  7.         this.assertEquals("passValue",u.getPassword()) ;
  8.     }
    
这个测试是测试根据用户名查找用户,之后你可以用assertEquals方法来测试返回的值是否正确。

  1.     public static void main(String[] theArgs)
  2.     {
  3.         junit.textui.TestRunner.main(new String[]{
  4.         ManaServletTest.class.getName()});
  5.     }

    
这里我们使用textui来运行我们的测试类,提供文本的测试信息,还有一个Swing的测试方法,一共一个界面, 但是没有什么太大的意义。

到此我们介绍了所有的主要方法。最后我们谈谈如何运行这个测试。

环境配置与运行


  1. 首先下载Cactus。
  2.  
  3. 把lib/下的jar文件加入到 web app的lib下。以及你客户端的classpath中,这是最保险的,虽然不是所有 的jar都用的着。
  4.  
  5. 设置你的Cactus.找到cactus.properties 文件,把它加入到客户端的classpath中。
  6.  
  7. 修改cactus.properties 文件,把http://localhost:8080/test 改成你相应的设置,test是你web应用的 名称。其他设置可以不变。 

  8. 修改服务器端web应用的配置,在web.xml中加入: 
    [pre]    <filter>
            <filter-name>FilterRedirector</filter-name>
            <filter-class>org.apache.cactus.server.FilterTestRedirector</filter-class>
        </filter>

        <filter-mapping>
            <filter-name>FilterRedirector</filter-name>
            <url-pattern>/FilterRedirector</url-pattern>
        </filter-mapping>

        <servlet>
            <servlet-name>ServletRedirector</servlet-name>
            <servlet-class>org.apache.cactus.server.ServletTestRedirector</servlet-class>
        </servlet>

        <servlet>
            <servlet-name>JspRedirector</servlet-name>
            <jsp-file>/jspRedirector.jsp</jsp-file>
        </servlet>

        <servlet-mapping>
            <servlet-name>ServletRedirector</servlet-name>
            <url-pattern>/ServletRedirector</url-pattern>
        </servlet-mapping>

        <servlet-mapping>
            <servlet-name>JspRedirector</servlet-name>
            <url-pattern>/JspRedirector</url-pattern>
        </servlet-mapping>[/pre]

  9. 编译ejb和servlet,把EJB文件的jar,和servlet的war文件打包成 ear文件。

  10. 发布你的ear文件到web application.
  11.  
  12. 运行本地的测试文件ManaServletTest.class


哈哈~~,终于完成了所有的工作,我们可以看看运行结果,"哦,不",居然出现了一个Error,那就是你的程序出现了问题,仔细看看吧,测试是不会骗你的 :) 。 以上代码在 win2000+JBOSS3.0+MySql MAX 3.24+Cactus1.3上运行成功。

关于作者

韩伟,任北京某公司系统分析员,主要从事j2ee发面的开发,对设计模式,Java,软件工程很感兴趣。您可以通过email:java_cn@21cn.com跟他取得联系。
关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有