Axis2学习的第一天

时间:2023-03-08 21:55:52
Axis2学习的第一天

按照下面,分别建2个工程,一个client(客户端),一个server(服务端)

Axis2学习的第一天

先实现服务端:

1、编写services.xml文件,该文件是放在aar文件里的\META-INF目录下的:

<?xml version="1.0" encoding="UTF-8"?>
<!-- This file was auto-generated from WSDL -->
<!-- by the Apache Axis2 version: 1.4.1 Built on : Aug 19, 2008 (10:13:39 LKT)
<parameter name="useOriginalwsdl">false</parameter>
<parameter name="modifyUserWSDLPortAddress">true</parameter>
-->
<serviceGroup>
<service name="axis2Service">
<description>
This is a sample Web Service.
</description>
<!-- // ServiceClass指定Java Class的位置,即实现服务的类。 -->
<parameter name="ServiceClass" locked="false">com.study.axis2.service.impl.Axis2ServiceImpl</parameter>
<!-- // operation 与Java Class中方法名对应。 -->
<operation name="user">
<!-- // messageReceiver看下文注解。 -->
<messageReceiver class="com.study.axis2.receive.Axis2MessageReceiverInOut"/>
</operation>
</service>
</serviceGroup>

2、编写Axis2ServiceImpl类:

package com.study.axis2.service.impl;

import com.study.axis2.domain.User;
import com.study.axis2.domain.UserResponse;
import com.study.axis2.service.Axis2Service; public class Axis2ServiceImpl implements Axis2Service { public UserResponse user(User user) {
// 将in转换为String。
int userId = user.getUserId();
String userName = user.getUserName(); System.out.println("USER ID : " + userId + "; USER NAME : " + userName); UserResponse response = new UserResponse();
response.setRspCode("0000");
response.setRspDesc("SUCCESS"); return response;
} }

3、编写User和UserResponse类:

package com.study.axis2.domain;

public class User {

    private int userId;
private String userName; public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
package com.study.axis2.domain;

public class UserResponse {

    private String rspCode;
private String rspDesc; public String getRspCode() {
return rspCode;
}
public void setRspCode(String rspCode) {
this.rspCode = rspCode;
}
public String getRspDesc() {
return rspDesc;
}
public void setRspDesc(String rspDesc) {
this.rspDesc = rspDesc;
}
}

4、编写Axis2MessageReceiverInOut类,用来接收报文的,实际上用Axis2ServiceImpl类来处理业务逻辑,但为了省事,略,直接在InOut类里编写了响应报文:

package com.study.axis2.receive;

import java.io.ByteArrayInputStream;
import java.util.Iterator; import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.axiom.om.impl.builder.StAXOMBuilder;
import org.apache.axiom.soap.SOAPBody;
import org.apache.axiom.soap.SOAPEnvelope;
import org.apache.axiom.soap.SOAPFactory;
import org.apache.axis2.AxisFault;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.receivers.AbstractInOutMessageReceiver; public class Axis2MessageReceiverInOut extends AbstractInOutMessageReceiver{
private static String ENCODEING = "UTF-8";
private static String NAMING_SPACE = "http://impl.service.axis2.study.com"; @Override
public void invokeBusinessLogic(MessageContext envMsg, MessageContext newEnvMsg)
throws AxisFault {
System.out.println("------------------------------------");
String body = envMsg.getEnvelope().getBody().toString();
System.out.println("request body1 : " + body); //Axis2Service axis2 = new Axis2ServiceImpl(); StringBuffer soapRequestData = new StringBuffer();
soapRequestData.append("<userResponse>");
soapRequestData.append("<rspCode>0000</rspCode>");
soapRequestData.append("<rspDesc>SUCCESS</rspDesc>");
soapRequestData.append("</userResponse>"); SOAPEnvelope env = toEnvelope(soapRequestData.toString()); newEnvMsg.setEnvelope(env);
} public static SOAPEnvelope toEnvelope(String sourceXml)
{
String xmlBody = sourceXml; OMFactory of = OMAbstractFactory.getOMFactory();
OMNamespace bname = of.createOMNamespace(NAMING_SPACE, ""); SOAPFactory s12f = OMAbstractFactory.getSOAP12Factory();
SOAPEnvelope s12e = s12f.getDefaultEnvelope(); try
{
byte[] bytes = xmlBody.getBytes(ENCODEING);
ByteArrayInputStream is = new ByteArrayInputStream(bytes); StAXOMBuilder builder = new StAXOMBuilder(is); OMElement elementBody = builder.getDocumentElement();
//elementBody.setNamespace(bname);
//addNameSpacePrefix(elementBody, bname); SOAPBody s12b = s12e.getBody();
s12b.addChild(elementBody);
}
catch (Exception e)
{
e.printStackTrace();
}
return s12e;
} public static OMElement addNameSpacePrefix(OMElement element,
OMNamespace prefix)
{
if (element.getChildElements() != null)
{
Iterator<OMElement> it = element.getChildElements();
element.setNamespace(prefix);
while (it.hasNext())
{
OMElement childelement = (OMElement) it.next();
childelement.setNamespace(prefix); if ((childelement.getChildElements() == null)
|| (!childelement.getChildElements().hasNext()))
continue;
addChildNameSpacePrefix(childelement.getChildElements(), prefix);
}
} return element;
} public static void addChildNameSpacePrefix(Iterator element,
OMNamespace prefix)
{
if (element != null)
{
while (element.hasNext())
{
OMElement childelement = (OMElement) element.next(); childelement.setNamespace(prefix);
if ((childelement.getChildElements() == null)
|| (!childelement.getChildElements().hasNext()))
continue;
addChildNameSpacePrefix(childelement.getChildElements(), prefix);
}
}
} }

5、将该类和services.xml文件都放在axis2service.aar下 ,并在WEB-INF/services/services.list文件下增加axis2service.aar:

axis2service.aar
version-1.6..aar

服务端编写好,发布,http://localhost:8082/axis2_server_150701/services/axis2Service?wsdl

  <?xml version="1.0" encoding="UTF-8" ?>
- <wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:ns1="http://org.apache.axis2/xsd" xmlns:ns="http://impl.service.axis2.study.com" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" targetNamespace="http://impl.service.axis2.study.com">
<wsdl:documentation>axis2Service</wsdl:documentation>
- <wsdl:types>
- <xs:schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://impl.service.axis2.study.com">
- <xs:element name="user">
- <xs:complexType>
- <xs:sequence>
<xs:element minOccurs="0" name="user" nillable="true" type="xs:anyType" />
</xs:sequence>
</xs:complexType>
</xs:element>
- <xs:element name="userResponse">
- <xs:complexType>
- <xs:sequence>
<xs:element minOccurs="0" name="return" nillable="true" type="xs:anyType" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
</wsdl:types>
- <wsdl:message name="userRequest">
<wsdl:part name="parameters" element="ns:user" />
</wsdl:message>
- <wsdl:message name="userResponse">
<wsdl:part name="parameters" element="ns:userResponse" />
</wsdl:message>
- <wsdl:portType name="axis2ServicePortType">
- <wsdl:operation name="user">
<wsdl:input message="ns:userRequest" wsaw:Action="urn:user" />
<wsdl:output message="ns:userResponse" wsaw:Action="urn:userResponse" />
</wsdl:operation>
</wsdl:portType>
- <wsdl:binding name="axis2ServiceSoap11Binding" type="ns:axis2ServicePortType">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" />
- <wsdl:operation name="user">
<soap:operation soapAction="urn:user" style="document" />
- <wsdl:input>
<soap:body use="literal" />
</wsdl:input>
- <wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
- <wsdl:binding name="axis2ServiceSoap12Binding" type="ns:axis2ServicePortType">
<soap12:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" />
- <wsdl:operation name="user">
<soap12:operation soapAction="urn:user" style="document" />
- <wsdl:input>
<soap12:body use="literal" />
</wsdl:input>
- <wsdl:output>
<soap12:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
- <wsdl:binding name="axis2ServiceHttpBinding" type="ns:axis2ServicePortType">
<http:binding verb="POST" />
- <wsdl:operation name="user">
<http:operation location="user" />
- <wsdl:input>
<mime:content type="application/xml" part="parameters" />
</wsdl:input>
- <wsdl:output>
<mime:content type="application/xml" part="parameters" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
- <wsdl:service name="axis2Service">
- <wsdl:port name="axis2ServiceHttpSoap11Endpoint" binding="ns:axis2ServiceSoap11Binding">
<soap:address location="http://localhost:8082/axis2_server_150701/services/axis2Service.axis2ServiceHttpSoap11Endpoint/" />
</wsdl:port>
- <wsdl:port name="axis2ServiceHttpSoap12Endpoint" binding="ns:axis2ServiceSoap12Binding">
<soap12:address location="http://localhost:8082/axis2_server_150701/services/axis2Service.axis2ServiceHttpSoap12Endpoint/" />
</wsdl:port>
- <wsdl:port name="axis2ServiceHttpEndpoint" binding="ns:axis2ServiceHttpBinding">
<http:address location="http://localhost:8082/axis2_server_150701/services/axis2Service.axis2ServiceHttpEndpoint/" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>

axis2可以访问http://localhost:8082/axis2_server_150701/services/listServices来查看发布了哪些接口:
Axis2学习的第一天

以上服务端已完全搭好,现编写客户端client,服务端增加个User类:

package com.study.axis2.client;

import java.io.ByteArrayInputStream;
import java.io.InputStream; import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.InputStreamRequestEntity;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.RequestEntity; import com.study.axis2.domain.User; public class Axis2Client {
private static String url = "http://localhost:8082/axis2_server_150701/services/axis2Service"; public static void main(String[] args) { User user = new User();
user.setUserId(11111);
user.setUserName("66666"); HttpClient client = new HttpClient();
PostMethod method = new PostMethod(url);
StringBuffer soapRequestData = new StringBuffer();
soapRequestData.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
soapRequestData
.append("<soap12:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""
+ " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\""
+ " xmlns:soap12=\"http://www.w3.org/2003/05/soap-envelope\">");
soapRequestData.append("<soap12:Body>");
soapRequestData.append("<user xmlns=\"http://impl.service.axis2.study.com\">");
soapRequestData.append("<userId>" + user.getUserId() + "</userId>");
soapRequestData.append("<userName>" + user.getUserName() + "</userName>");
soapRequestData.append("</user>");
soapRequestData.append("</soap12:Body>");
soapRequestData.append("</soap12:Envelope>"); String xml = soapRequestData.toString(); byte[] b; try
{
b = xml.getBytes("utf-8"); System.out.println("request : " + xml);
InputStream is = new ByteArrayInputStream(b, 0, b.length);
RequestEntity re = new InputStreamRequestEntity(is, b.length, "application/soap+xml; charset=utf-8");
method.setRequestEntity(re); client.executeMethod(method);
String response = method.getResponseBodyAsString();
System.out.println("response : " + response);
}
catch (Exception e)
{
e.printStackTrace();
}
} }

执行客户端代码,输出(输出结果内容为xml,稍微format下):

request :
<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<user xmlns="http://impl.service.axis2.study.com">
<userId>11111</userId>
<userName>yff</userName>
</user>
</soap12:Body>
</soap12:Envelope>
response :
<?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
<soapenv:Body>
<userResponse>
<rspCode>0000</rspCode>
<rspDesc>SUCCESS</rspDesc>
</userResponse>
</soapenv:Body>
</soapenv:Envelope>