建立一個無狀態會話 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 服務所需的配置文件 :
<?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 服務所需要的布署文件 . wstools -cp? classes -config wstools-config.xml
把生成的布署文件放到 META-INF 文件夾而不是 JSE 端點的 web-INF 文件夾下 .
修改 ejb-jar.xml 文件加上 <service-endpoint>ejb.WebServiceTest</service-endpoint> 元素 , 注意順序 .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();
??? }
}
歡迎加入QQ群:30406099
服務類HandlerServic:
package handler;
public class HandlerService implements HandlerServiceInterface1 {
? public void testInOutHeader(String bodyMsg, String headerMsg)
?? {
????? System.out.print("testInHeader: " + bodyMsg + "," + headerMsg);
?? }
}
消息處理類:
package handler;
import javax.xml.rpc.handler.*;
import javax.xml.soap.*;
import javax.xml.namespace.QName;
import javax.xml.rpc.JAXRPCException;
import javax.xml.rpc.handler.soap.SOAPMessageContext;
import java.util.Iterator;
public class CutomerHandler extends GenericHandler {
?
??protected QName[] headers = new QName[] {
??????????????????????????????? new QName("http://handler", "headerMsg")
??? };
??? public QName[] getHeaders() {
??????? return headers;
??? }//
返回handler要處理的文件頭元素名的素組.
??? //
處理接收到的soap消息.如果返回值為false時JAX-RPC會立即中斷對SOAP消息處理并將soap消息回傳。關于saaj api使用方法見j2ee web service開發(三)
??? public boolean handleRequest(MessageContext msgContext) {
??????? try {
??????????? SOAPMessage soapMessage = ((SOAPMessageContext) msgContext).
????????????????????????????????????? getMessage();
??????????? SOAPHeader soapHeader = soapMessage.getSOAPHeader();
??????????? Iterator it = soapHeader.extractAllHeaderElements();
??????????? while (it.hasNext()) {
??????????????? SOAPHeaderElement headerElement = (SOAPHeaderElement) it.next();
?????
??????????Name headerName = headerElement.getElementName();
??????????????? System.out.println(" header name is: " +
?????????????????????????????????? headerName.getQualifiedName());
??????????????? System.out.println(" header value is: " +
?????????????
?????????????????????headerElement.getValue());
??????????? }
??????????? SOAPBody soapBody = soapMessage.getSOAPBody();
??????????? Iterator bodyIterator = soapBody.getChildElements();
??????????? while (bodyIterator.hasNext()) {
??????????????? SOAPBodyElement soapBodyElement = (SOAPBodyElement)
????????????????????????????????????????????????? bodyIterator.next();
??????????????? System.out.println("soapBodyElement print: " +
?????????????????????????????????? soapBodyElement.getNodeName());
??????????? }
??????????? SOAPBodyElement nextSoapBodyElement = (SOAPBodyElement) soapBody.
????????????????????????????????????????????????? getChildElements().next();
??????????? SOAPElement soapElement = (SOAPElement) nextSoapBodyElement.
?????????????????????????
????????????getChildElements().next();
??????????? System.out.println("soapElement print: " + soapElement.getLocalName() +
?????????????????????????????? "? " + soapElement.getValue());
??????? } catch (SOAPException e) {
??????????? throw new JAXRPCException(e);
??????? }
??????? return true;
??? }
//
返回soap應答消息,本例修改soap文件頭的值再返傳給客戶端.
??? public boolean handleResponse(MessageContext msgContext) {
??????? try {
??????????? SOAPMessage soapMessage = ((SOAPMessageContext) msgContext).
??????????????????????
???????????????getMessage();
??????????? SOAPHeader soapHeader = soapMessage.getSOAPHeader();
??????????? SOAPBody soapBody = soapMessage.getSOAPBody();
??????????? SOAPBodyElement soapBodyElement = (SOAPBodyElement) soapBody.
???????????????????????????
??????????????????getChildElements().next();
??????????? String rpcName = soapBodyElement.getElementName().getLocalName();
??????????????? SOAPFactory soapFactory = SOAPFactory.newInstance();
??????????????? Name headerName = soapFactory.createName("headerMsg", "ns","http://handler");
??????????????? SOAPHeaderElement she = soapHeader.addHeaderElement(headerName);
??????????????? she.setValue("return header message");
??????? } catch (SOAPException e) {
??????????? throw new JAXRPCException(e);
??????? }
??????? return true;
??? }
}
用于生成布署描述符的WSTOOLS工具的配置文件:
<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="TestService" style="rpc" endpoint="handler.HandlerServiceInterface1">
????? <operation name="testInOutHeader">
??????? <parameter type="java.lang.String"/>
??????? <parameter type="java.lang.String"/>
????? </operation>
??? </service>
??? <namespaces target-namespace="http://handler" type-namespace="http://handler"/>
??? <mapping file="HandlerServiceInterface1.xml"/>
??? <webservices servlet-link="HandlerServiceInterface1"/>
? </java-wsdl>
</configuration>
關于wstools工具的使用見j2ee web service開發(一).
在生成的webservice描述符文件中手工加入以下代碼:
???? <handler>
????? <handler-name>CutomerHandler</handler-name>
????? <handler-class>handler.CutomerHandler</handler-class>
??? </handler>
用以配置處理soap消息頭的類.
客戶端代碼:利用j2ee web serive開發(三)介紹的api不難寫出saaj客戶端代碼就不再重復勞動了。這里只介紹JBOss ws利用DII實現soap消息頭的處理,它擴展了標準jax-rpc api.
package handler;
import javax.xml.namespace.QName;
import javax.xml.rpc.Call;
import javax.xml.rpc.ParameterMode;
import javax.xml.rpc.Service;
import org.jboss.ws.Constants;
import org.jboss.ws.jaxrpc.CallImpl;
import javax.xml.rpc.ServiceFactory;
import java.util.*;
public class HandlerClient {
??? public HandlerClient() {
??? }
??? public static void main(String[] args) throws Exception{
??????? HandlerClient handlerclient = new HandlerClient();
??????? handlerclient.testUnboundInOutHeader();
??? }
??? public void testUnboundInOutHeader() throws Exception{
??????? Service service = ServiceFactory.newInstance().createService(new QName("TestService"));
?????
??CallImpl call = (CallImpl)service.createCall();
??????? call.setOperationName(new QName("http://handler", "testInOutHeader"));
??????? call.addParameter("String_1", Constants.TYPE_LITERAL_STRING, ParameterMode.IN);
??????? call.addParameter("String_2", Constants.TYPE_LITERAL_STRING, ParameterMode.IN);
??????? call.setTargetEndpointAddress("http://hechang:8082/customer-handler/services/HandlerServiceInterface1");
??????? QName xmlName = new QName("http://handler", "headerMsg");
??????? // xmlName = new QName("http://otherns", "HeaderValue");
??????? call.addUnboundHeader(xmlName, Constants.TYPE_LITERAL_STRING, String.class, ParameterMode.IN);
??????? call.setUnboundHeaderValue(xmlName, " IN header message");
//
設置消息頭 可以設定多組
??????? Object retObj = call.invoke(new Object[]{"Hello world!", "IN header message"});
???????
??????? String unboundRet = (String)call.getUnboundHeaderValue(xmlName);
?????? //
處理返回的消息頭的值
??????? System.out.println(" unboundReturn: "+unboundRet);
}
}
打包的war文件
歡迎加入QQ群:30406099
import javax.xml.soap.*;
import java.net.*;
import java.io.*;
import java.util.*;
import java.text.SimpleDateFormat;
public class SaajClient {
??? public SaajClient() {
??? }
??? public static void main(String[] args) throws Exception {
??????? SaajClient client = new SaajClient();
??????? User[] user = new User[2];
??????? user[0] = new User("張三", "027-88888888", new Date());
??????? user[1] = new User("lisi", null, new Date());
??????? saajTest(user);
??? }
??? private static void saajTest(User[] user) throws MalformedURLException,
??????????? IOException,
??????????? UnsupportedOperationException, SOAPException {
??????? MessageFactory factory = MessageFactory.newInstance();//SAAJ的根工廠類
??????? SOAPMessage message = factory.createMessage();
??????? //SOAPMessage 對象需要一些元素,包括SOAPPart,SOAPEnvelope,SOAPHeader,SOAPBody對象
??????? //SAAJ通過返回一個新的已經包括這些元素的SOAPMessage對象來簡化操作
??????? SOAPFactory s = SOAPFactory.newInstance();//通用工廠類,創建Name,SOAPElement對象
??????? Name countUser = s.createName("countUser", "mh", "http://array");
??????? //Name對象表示一個XML限定名稱
??????? Name arrayOfUser_1 = s.createName("arrayOfUser_1");
??????? Name xsi = s.createName("xmlns:xsi");
??????? Name nullAttribute = s.createName("xsi:nil");
??????? //下面的代碼創建soap對象
??????? SOAPBody body = message.getSOAPBody();
??????? SOAPBodyElement bodyChildElement = body.addBodyElement(countUser);
??????? SOAPElement arrayOfUser = bodyChildElement.addChildElement(
??????????????? arrayOfUser_1);
????? //? arrayOfUser.addAttribute(xsi, "??????? arrayOfUser.addNamespaceDeclaration("xsi","??????? //定義arrayOfUser的 xmlns:xsi屬性? 該名稱空間是XML模式實例命名空間,由XML模式規范定義,它定義了
??????? //可以在XML文檔中使用的屬于該命名空間的一些特性.
??????? for (int i = 0; i < user.length; i++) {
??????????? //需要注意順序,也就是和復雜類型的sequence元素的順序對應
??????????? Name valueName = s.createName("value");
??????????? SOAPElement value = arrayOfUser.addChildElement(valueName);
??????????? Name birthday = s.createName("birthDay");
??????????? SOAPElement birthdayElement = value.addChildElement(birthday);
??????????? if (user[i].getBirthDay() == null) {
??????????????? birthdayElement.addAttribute(nullAttribute, "1");
??????????? } else {
??????????????? //日期類型必須進行格式化
??????????????? SimpleDateFormat format= new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
??????????????? birthdayElement.addTextNode(format.format(user[i].getBirthDay()));
??????????? }
??????????? Name name = s.createName("name");
??????????? SOAPElement nameElement = value.addChildElement(name);
??????????? if (user[i].getName() == null) {
??????????????? //傳送空值
??????????????? nameElement.addAttribute(nullAttribute, "1");
??????????? } else {
??????????????? nameElement.addTextNode(user[i].getName());
??????????? }
??????????? Name phone = s.createName("phone");
??????????? SOAPElement phoneElement = value.addChildElement(phone);
??????????? if (user[i].getPhone() == null) {
??????????????? phoneElement.addAttribute(nullAttribute, "1");
??????????? } else {
??????????????? phoneElement.addTextNode(user[i].getPhone());
??????????? }
??????? }
??????? //發送soap消息
??????? SOAPConnectionFactory f = SOAPConnectionFactory.newInstance();
??????? SOAPConnection conn = f.createConnection();
??????? URL url = new URL("http://localhost:8082/complexType-array/services/CountUser");
??????? SOAPMessage response = conn.call(message, url);
??????? SOAPBody soapBody = response.getSOAPBody();
??????? Iterator it = soapBody.getChildElements();
??????? while (it.hasNext()) {
??????????? SOAPBodyElement bodyElement = (SOAPBodyElement) it.next();
??????????? String returnValue = bodyElement.getValue();
??????????? System.out.println(bodyElement.getElementName().getLocalName() +
?????????????????????????????? "????? " + returnValue);
??????? }
??????? response.writeTo(System.out);
??? }
}
程序向服務器端傳送的數據:
POST /complexType-array/services/CountUser HTTP/1.1
SOAPAction: ""
Content-Type: text/xml; charset=UTF-8
User-Agent: Java/1.5.0_03
Host: localhost:8082
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Connection: keep-alive
Content-Length: 448
<env:Envelope xmlns:env='http://schemas.xmlsoap.org/soap/envelope/'>
?? <env:Header/>
?? <env:Body>
????? <mh:countUser xmlns:mh='http://array'>
???????? <arrayOfUser_1 xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>
??????????? <value>
?????????????? <birthDay>2006-11-08T22:36:13</birthDay>
?????????????? <name>張三</name>
?????????????? <phone>027-88888888</phone>
??????????? </value>
??????????? <value>
?????????????? <birthDay>2006-11-08T22:36:13</birthDay>
?????????????? <name>lisi</name>
?????????????? <phone xsi:nil='1'/>
??????????? </value>
???????? </arrayOfUser_1>
????? </mh:countUser>
?? </env:Body></env:Envelope>
從傳送的數據來看,就是一個符合soap規范的xml文檔.既然是xml文檔,也就是說可以用jdom api 來操作它
事實上就是這樣,soap api 可以跟 jdom api混合使用.
如果你想賜教或者討論,歡迎加入QQ群:30406099
(二)動態代理:該種方式需要一個指向WSDL文檔的URL。具體實現:
??????? ServiceFactoryImpl factory = new ServiceFactoryImpl();
//
工廠類,取得service對象,
??????? URL wsdlURL = new File(? "complexType-array/WEB-INF/wsdl/CountUser.wsdl").??????????????? ??toURL(); //wsdl
文檔的URL 它可以是一個遠程的URL 但是本例引用本地硬盤上的一個wsdl文件
其好處是提高程序的性能。
??????? URL mappingURL = new File("complexType-array/WEB-INF/CountUser.xml").???????????????????????? toURL(); //
映射文件的URL 需要著重說明的就是這個映射文件了,標準的j2ee web service API實現中可不需要這玩意,但是在Jboss的實現中不要這個就會報錯cannot obtain java mapping type...,在jboss下開發的web 服務客戶端移植時需要特別注意,麻煩!
??????? QName qname = new QName("http://array", "CountUserService");
??????? Service service = factory.createService(wsdlURL, qname, mappingURL);//
通過工廠方法得到一個Service對象,但createService(wsdlURL, qname, mappingURL)方法是jboss的具體實現增加一的一個方法,標準API可沒有這玩意,對于數組類型的傳遞只能用這個方法了,奇怪的是客戶端居然需要部署在服務器端的映射文件,沒勁!???????
??????? CountUser port = (CountUser) service.getPort(CountUser.class); //
取得服務器端的接口。
(
三)動態調用。
??????? URL wsdlURL = new File(
??????????????? "complexType-array/WEB-INF/wsdl/CountUser.wsdl").
????????????????????? toURL();
??????? URL mappingURL = new File(
??????????????? "complexType-array/WEB-INF/CountUser.xml").
???????????????????????? toURL();
??????? QName qname = new QName("http://array", "CountUserService");//
表示服務名QName對象。
??????? Service service = factory.createService(wsdlURL, qname, mappingURL);
??????? Call call = service.createCall();
??? //
沒什么好說的,依然要用到wsdl文檔文件,映射文件。
??????? call.setOperationName(new QName(TARGET_NAMESPACE, "countUser"));//
指定方法名
??????? call.setPortTypeName(new QName("CountUser"));//
指定端口名
("value",Constants.TYPE_LITERAL_ANYSIMPLETYPE,ParameterMode.IN);
??????? call.setReturnType(Constants.TYPE_LITERAL_INT);
??????? Object retObj = call.invoke(new Object[] {user});
服務器端的實現參見j2ee web service(一)完整的客戶端代碼如下:
package array;
import java.net.URL;
import javax.xml.rpc.*;
import javax.xml.namespace.QName;
import java.util.*;
import java.io.File;
import org.jboss.ws.jaxrpc.ServiceFactoryImpl;
import org.jboss.ws.Constants;
public class ArrayExample {
?
?? public ArrayExample() {
??? }
??? private static final String TARGET_NAMESPACE =
??????????? "http://array";
??? private CountUser getPort() throws Exception {
??????? ServiceFactoryImpl factory = new ServiceFactoryImpl();
??????? URL wsdlURL = new File(
??????????????? "complexType-array/WEB-INF/wsdl/CountUser.wsdl").
????????????????????? toURL();
??????? URL mappingURL = new File(
??????????????? "complexType-array/WEB-INF/CountUser.xml").
???????????????????????? toURL();
??????? QName qname = new QName("http://array", "CountUserService");
??????? Service service = factory.createService(wsdlURL, qname, mappingURL);
??????? CountUser port = (CountUser) service.getPort(CountUser.class);
??????? return port;
??? }
??? public void testComplexUserArray(User[] user) throws
??????????? Exception {
??????? CountUser port = getPort();
??????? try {
??????????? int returnValue = port.countUser(user);
??????????? System.out.print(returnValue);
??????? } catch (Exception e) {
??????????? throw e;
??????? }
??? }
??? public void DIIClient(User[] user) throws Exception {
??????? ServiceFactoryImpl factory = new ServiceFactoryImpl();
??????? URL wsdlURL = new File(
??????????????? "complexType-array/WEB-INF/wsdl/CountUser.wsdl").
????????????????????? toURL();
??????? URL mappingURL = new File(
??????????????? "complexType-array/WEB-INF/CountUser.xml").
???????????????????????? toURL();
??????? QName qname = new QName("http://array", "CountUserService");
??????? Service service = factory.createService(wsdlURL, qname, mappingURL);
??????? Call call = service.createCall();
??????? call.setOperationName(new QName(TARGET_NAMESPACE, "countUser"));
??????? call.setPortTypeName(new QName("CountUser"));
??????? call.setReturnType(Constants.TYPE_LITERAL_INT);
?????
??Object retObj = call.invoke(new Object[] {user});
??????? System.out.println(retObj.toString());
??? }
??? public static void main(String[] args) throws Exception {
??????? ArrayExample arrayexample = new ArrayExample();
??????? User[] user = new User[2];
??????? user[0] = new User("
張三", "027-88888888", new Date());
??????? user[1] = new User("lisi", null, new Date());
??????? //arrayexample.testComplexUserArray(user);
??????? arrayexample.DIIClient(user);
??? }
}
如果你想賜教或者討論,歡迎加入QQ群:30406099
但是在jboss中的ws實現中確不是一件便利的事情。因為郁悶了很久,發點牢騷:)具體實現:
???
作為web service服務實現的類必須實現java.rmi.Remote的接口:
package array;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface CountUser extends Remote {
?
?? public int countUser(User[] user) throws RemoteException;
}
???
具體實現遠程接口的類:
package array;
public class CountUserImpl implements CountUser {
??? public int countUser(User[] user){
??????? for(int i=0;i<user.length;i++){
??????????? System.out.println("name "+user[i].getName()+"? phone? "+
?????????????????????????????? user[i].getPhone()+ " birthday "+user[i].getBirthDay());
??????? }
??????? return user.length;
??? }
}
?
作為數組參數傳遞的類:
package array;
import java.util.Date;
public class User {
??? private String name;
??? private String phone;
??? private Date birthDay;
??? public User() {
??? }
??? public User(String name,String phone,Date birthDay){
??????? this.name=name;
??????? this.phone=phone;
??????? this.birthDay=birthDay;
??? }
??? public void setName(String name) {
??????? this.name = name;
??? }
??? public void setPhone(String phone) {
??????? this.phone = phone;
??? }
??? public void setBirthDay(Date birthDay) {
??????? this.birthDay = birthDay;
??? }
??? public String getName() {
?
??????return name;
??? }
??? public String getPhone() {
??????? return phone;
??? }
??? public Date getBirthDay() {
??????? return birthDay;
??? }
}
使用Jboss_Home/bin 下的wstools工具生成布署j2ee web service 必須的三個文件,jax-rpc映射文件,web服務描述器文件,以及wsdl文檔用于wstools工具的配置文件jboss-config.xml類容如下:
<?xml version="1.0" encoding="UTF-8"?>
<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="ServiceBeanInterface1" style="rpc"?? endpoint="array.ServiceBeanInterface1"/>
????? <namespaces target-namespace="http://array" type-namespace="http://array"/>
???? <mapping file="ServiceBeanInterface1.xml"/>
???? <webservices servlet-link="ServiceBeanInterface1"/>?????
?
</java-wsdl>
</configuration>
使用 wstools -cp array.CountUser -config jboss-config.xml 命令可以生成布署web服務所需的三個文件。另外還得在web.xml文件中把CountUser接口作為servlet發布
? <servlet>
??? <display-name>CountUser Servlet</display-name>
??? <servlet-name>CountUser</servlet-name>
??? <servlet-class>array.CountUserImpl</servlet-class>
? </servlet>
? <servlet-mapping>
??? <servlet-name>CountUser</servlet-name>
??? <url-pattern>/CountUser</url-pattern>
? </servlet-mapping>
? <servlet-mapping>
??? <servlet-name>CountUser</servlet-name>
??? <url-pattern>/services/*</url-pattern>
? </servlet-mapping>
僅僅是這樣倒也算很容易了,但是wstools工具并不能在映射文件中正確實現User[]的映射。因此還需要手工添加如下代碼以實現User[] 到xml之間的映射。???
??? <java-xml-type-mapping>
??? <java-type>array.User[]</java-type>
??? <root-type-qname xmlns:typeNS='http://array'>typeNS:User.Array</root-type-ame>
??? <qname-scope>complexType</qname-scope>
??? </java-xml-type-mapping>
打包成war文件,并且布署。服務端的實現就完成了。打包的war文件下載
因為篇幅或許還有分類的原因,客戶端的實現將記錄在下一篇隨筆里 如果你想賜教或者討論,歡迎加入QQ群:30406099