最近由于项目需要,完成了关于Java webservice axis 的项目,记录下来,以供以后和各位网友参考。
首先关键的是server-config.wsdd,配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<globalConfiguration>
<parameter name="sendMultiRefs" value="true"/>
<parameter name="disablePrettyXML" value="true"/>
<parameter name="dotNetSoapEncFix" value="true"/>
<parameter name="enableNamespacePrefixOptimization" value="false"/>
<parameter name="sendXMLDeclaration" value="true"/>
<parameter name="sendXsiTypes" value="true"/>
<parameter name="attachments.Directory" value="./attachments" />
<parameter name="attachments.implementation" value="org.apache.axis.attachments.AttachmentsImpl" />
<parameter name="sendMultiRefs" value="true" />
<parameter name="axis.sendMinimizedElements" value="true" />
<requestFlow>
<handler type="java:org.apache.axis.handlers.JWSHandler">
<parameter name="scope" value="session" />
</handler>
<handler type="java:org.apache.axis.handlers.JWSHandler">
<parameter name="scope" value="request" />
<parameter name="extension" value=".jwr" />
</handler>
</requestFlow>
</globalConfiguration>
<handler type="java:org.apache.axis.handlers.http.URLMapper" name="URLMapper"/>
<!--
<service name="Login.jws" provider="java:RPC">
<parameter name="className" value="com.tacteonltd.colligo.Login"/>// 你要改的就是这.这写上要调用的类.就可以
<parameter name="scope" value="request"/>
<parameter name="allowedMethods" value="*"/> // 这*代表所有的方法
<messageReceiver class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver"/>
<beanMapping qname="myNS:HCAIOCF18"
xmlns:myNS="urn:BeanService"
languageSpecificType="java:com.tacteonltd.colligo.premier.control.hcai.ws.HCAIOCF18"/>
</service>
-->
<!--
<service name="OrderProcessor" provider="java:RPC">
<parameter name="className" value="com.tacteonltd.colligo.BeanService"/>
<parameter name="scope" value="request"/>
<parameter name="allowedMethods" value="*"/>
<beanMapping qname="myNS:Order" xmlns:myNS="urn:BeanService" languageSpecificType="java:com.tacteonltd.colligo.Order"/>
</service>
-->
<service name="OrderProcessor" provider="java:RPC">
<parameter name="className" value="com.tacteonltd.colligo.Login"/>
<parameter name="scope" value="request"/>
<parameter name="allowedMethods" value="*"/>
<beanMapping qname="myNS:HCAIOCF18" xmlns:myNS="urn:Login" languageSpecificType="java:com.tacteonltd.colligo.premier.control.hcai.ws.HCAIOCF18"/>
<beanMapping qname="myns:HCAIOCF18NonSesionEstimated" xmlns:myns="myNS:HCAIOCF18" languageSpecificType="java:com.tacteonltd.colligo.premier.control.hcai.ws.HCAIOCF18NonSesionEstimated"/>
<typeMapping
xmlns:myNS="urn:Login"
qname="myNS:HCAIOCF18"
type="java:com.tacteonltd.colligo.premier.control.hcai.ws.HCAIOCF18"
serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
<typeMapping
xmlns:ns="myNS:HCAIOCF18"
qname="ns:ArrayOf_HCAIOCF18NonSesionEstimated"
type="java:com.tacteonltd.colligo.premier.control.hcai.ws.HCAIOCF18NonSesionEstimated[]"
serializer="org.apache.axis.encoding.ser.ArraySerializerFactory"
deserializer="org.apache.axis.encoding.ser.ArrayDeserializerFactory"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
/>
</service>
<transport name="http">
<requestFlow>
<handler type="URLMapper"/>
</requestFlow>
</transport>
</deployment>
接下来是web.xml,配置如下
<!-- web service -->
<servlet>
<servlet-name>AxisServlet</servlet-name>
<servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
Order.java 如下
package Test;
public class Order implements java.io.Serializable{
private String customerName;
private String shippingAddress;
public String getCustomerName()
{ return customerName; }
public void setCustomerName(String name)
{ customerName = name; }
private String[] items;
public String[] getItems() {
return items;
}
public void setItems(String[] items) {
this.items = items;
}
}
BeanService.java 服务器端代码:
package com.tacteonltd.colligo;
public class BeanService {
public Order getNewOrder(Order order)
{
order.setCustomerName("changed man");
Order order11 = new Order();
order11.setCustomerName("121212 man ");
String [] items = new String[] { "Ipod21212", "ThinkPad212121212" };
order11.setItems(items);
return order11;
}
}
Client.java 客户端调用:
package Test;
import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
public class Client {
private final static String targetEndpointAddress = "http://localhost:8080/New/services/OrderProcessor";
private final static QName qn = new QName( "urn:BeanService", "Order" );
public static void main(String [] args) throws Exception
{
Order order = new Order();
order.setCustomerName("old man ");
//order.addCount(10);
String [] items = new String[] { "Ipod", "ThinkPad" };
order.setItems(items);
Service service = new Service();
Call call = (Call) service.createCall();
call.registerTypeMapping(Order.class, qn,
new org.apache.axis.encoding.ser.
BeanSerializerFactory(Order.class, qn),
new org.apache.axis.encoding.ser.
BeanDeserializerFactory(Order.class, qn));
call.setTargetEndpointAddress(new java.net.URL(targetEndpointAddress));
call.setOperationName(new QName("OrderProcessor", "getNewOrder"));
call.addParameter("order", qn, ParameterMode.IN);
call.setReturnType(qn, Order.class);
Order newOrder = (Order) call.invoke(new Object[] {order});
System.out.println("new custname:"+newOrder.getCustomerName());
//System.out.println("new number:"+newOrder.getInter().getCount());
for(int i=0; i<newOrder.getItems().length; i++){
System.out.println("Item " + (i+1) + newOrder.getItems()[i] );
}
}
}
如此,一个webservice 就完成了。
本项目中还完成了传送的类的对象的元素包含字符串数组和对象数组的功能,可谓一大突破。