把
ejb
作為
web
服務(wù)發(fā)布比
JSE
端點要復(fù)雜些
.
并且只有無狀態(tài)會話
Bean
才能發(fā)布成
Web
服務(wù)
.
利用
ejb
的一大好處就是容器管理的事務(wù)
.
但是
spring
同樣能做到這個
,
這一點不再具有很大的吸引力了
.
那么剩下的好處估計就只有用在必須用
ejb
的情況下又同時需要
web
服務(wù)這種情況了
. EJB
端點跟
JSE
端點跟一個不同點在于
:
不需要在
web.xml
文件中配置
servlet
映射
,
但是需要在
ejb-jar.xml
文件中配置
web
服務(wù)端點接口
.
另一個不同之處就是不需要一個實現(xiàn)
web
服務(wù)接口的具體類
. Jboss 4.04
版本下具體實現(xiàn)
.
建立一個無狀態(tài)會話
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
服務(wù)接口
package ejb;
?
import java.rmi.*;
?
public interface WebServiceTest extends Remote {
??? public void hello() throws RemoteException;
}
生成
Web
服務(wù)所需的配置文件
:
<?xml version="1.0" encoding="UTF-8"?>
<!--
? wstools -cp? classes -config wstools-config.xml
-->
?
<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>
?
利用
Jboss
自帶的工具生成
Web
服務(wù)所需要的布署文件
. wstools -cp? classes -config wstools-config.xml
把生成的布署文件放到
META-INF
文件夾而不是
JSE
端點的
web-INF
文件夾下
.
修改
ejb-jar.xml
文件加上
<service-endpoint>ejb.WebServiceTest</service-endpoint>
元素
,
注意順序
.OK
打包發(fā)布
.
客戶端調(diào)用程序
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
歡迎加入QQ群:30406099