j2ee web service开发(五) 把ejb发布为web服务 - 一切从实用出发!...

来源:百度文库 编辑:神马文学网 时间:2024/04/27 22:07:15

 

把 ejb 作为 web 服务发布比 JSE 端点要复杂些 . 并且只有无状态会话 Bean 才能发布成 Web 服务 . 利用 ejb 的一大好处就是容器管理的事务 . 但是 spring 同样能做到这个 , 这一点不再具有很大的吸引力了 . 那么剩下的好处估计就只有用在必须用 ejb 的情况下又同时需要 web 服务这种情况了 . EJB 端点跟 JSE 端点跟一个不同点在于 : 不需要在 web.xml 文件中配置 servlet 映射 , 但是需要在 ejb-jar.xml 文件中配置 web 服务端点接口 . 另一个不同之处就是不需要一个实现 web 服务接口的具体类 . Jboss 4.04 版本下具体实现 .

建立一个无状态会话 bean

package ejb;

 

import javax.ejb.SessionBean;

import javax.ejb.SessionContext;

import javax.ejb.CreateException;

 

public class WebServiceBean implements SessionBean {

    SessionContext sessionContext;

    public void ejbCreate() throws CreateException {

    }

 

    public void ejbRemove() {

    }

 

    public void ejbActivate() {

    }

 

    public void ejbPassivate() {

    }

 

 

    public void setSessionContext(SessionContext sessionContext) {

        this.sessionContext = sessionContext;

    }

 

    public void hello() {

        System.out.println("hello");

    }

}

 

package ejb;

 

import javax.ejb.EJBObject;

import java.rmi.RemoteException;

 

public interface WebService extends EJBObject {

    public void hello() throws RemoteException;

}

 

package ejb;

 

import javax.ejb.EJBHome;

import javax.ejb.CreateException;

import java.rmi.RemoteException;

 

 

public interface WebServiceBeanHome extends EJBHome {

  public WebService create() throws CreateException, RemoteException;

}

 

没有什么好多说的 .

定义一个 Web 服务接口


package ejb;

 

import java.rmi.*;

 

public interface WebServiceTest extends Remote {

    public void hello() throws RemoteException;

}

生成 Web 服务所需的配置文件 :

 

   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

   xsi:schemaLocation="http://www.jboss.org/jbossws-tools http://www.jboss.org/jbossws-tools/schema/jbossws-tool_1_0.xsd">

 

   

   

   

   

 

 

利用 Jboss 自带的工具生成 Web 服务所需要的布署文件 . wstools -cp  classes -config wstools-config.xml

把生成的布署文件放到 META-INF 文件夹而不是 JSE 端点的 web-INF 文件夹下 .

修改 ejb-jar.xml 文件加上 ejb.WebServiceTest 元素 , 注意顺序 .OK 打包发布 .

客户端调用程序

package ejb;

 

import java.net.URL;

import javax.xml.rpc.*;

import javax.xml.namespace.QName;

import javax.naming.*;

import javax.rmi.PortableRemoteObject;

import javax.naming.InitialContext;

import java.util.Hashtable;

 

public class ClientTest {

 

    private WebServiceTest getPort() throws Exception {

        ServiceFactory factory = ServiceFactory.newInstance();

        URL wsdlURL = new URL("http://hechang:8080/ejb/TestService?wsdl");

        QName qname = new QName("http://ejb", "WebServiceTest");

        Service service = factory.createService(wsdlURL, qname);

        WebServiceTest port = (WebServiceTest) service.getPort(WebServiceTest.class);

        return port;

    }

 

    private WebService ejbTest() throws Exception {

        Hashtable environment = new Hashtable();

 

        environment.put(Context.INITIAL_CONTEXT_FACTORY,

                        "org.jnp.interfaces.NamingContextFactory");

        environment.put(Context.URL_PKG_PREFIXES,

                        "org.jboss.naming:org.jnp.interfaces");

        environment.put(Context.PROVIDER_URL, "jnp://localhost:1099");

        Context context = new InitialContext(environment);

        Object ref = context.lookup("WebServiceBean");

        WebServiceBeanHome webServiceHome = (WebServiceBeanHome) PortableRemoteObject.

                                        narrow(ref, WebServiceBeanHome.class);

        WebService webService = webServiceHome.create();

        return webService;

    }

 

    public static void main(String[] args) throws Exception {

        ClientTest clienttest = new ClientTest();

        WebServiceTest webService = clienttest.getPort();

        webService.hello();

        WebService webService2=clienttest.ejbTest();

        webService2.hello();

    }

}

打包 ejb文件下载:EJBModlue.jar