把 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;
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
没有什么好多说的 .
定义一个 Web 服务接口
package ejb;
import java.rmi.*;
public interface WebServiceTest extends Remote {
public void hello() throws RemoteException;
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
生成 Web 服务所需的配置文件 :
< configuration xmlns="http://www.jboss.org/jbossws-tools"
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">
< java-wsdl>
< service name="WebServiceTest" style="rpc" endpoint="ejb.WebServiceTest"/>
< namespaces target-namespace="http://ejb" type-namespace="http://ejb"/>
< mapping file="jaxrpc-mapping.xml"/>
< webservices ejb-link="WebServiceBean"/>
< /java-wsdl>
< /configuration>
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
利用 Jboss 自带的工具生成 Web 服务所需要的布署文件 . wstools -cp classes -config wstools-config.xml
把生成的布署文件放到 META-INF 文件夹而不是 JSE 端点的 web-INF 文件夹下 .
修改 ejb-jar.xml 文件加上
客户端调用程序
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();
}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
以上介绍了J2EE web service开发中将ejb发布为web服务的方法。
【编辑推荐】