通常情况下,我们创建的WebService服务是以aar包的形式发布到服务器上的,为了简化我们的发布过程,写一个ant脚本是理所当然的了,当然你也可以连WebService的客户端测试脚本一起写好,下面就是我做的
xml 代码
- <project basedir="." default="generate.service">
- <property environment="env"/>
- <property name="AXIS2_HOME" value="${env.AXIS2_HOME}"/>
- <property name="build.dir" value="build"/>
- <path id="axis2.classpath">
- <fileset dir="${AXIS2_HOME}/lib">
- <include name="*.jar"/>
- fileset>
- path>
- <path id="client.class.path">
- <fileset dir="${AXIS2_HOME}/lib">
- <include name="*.jar" />
- fileset>
- <pathelement location="${build.dir}/classes" />
- path>
- <target name="compile">
- <mkdir dir="${build.dir}"/>
- <mkdir dir="${build.dir}/classes"/>
- <javac debug="on"
- fork="true"
- destdir="${build.dir}/classes"
- srcdir="${basedir}/src"
- classpathref="axis2.classpath">
- javac>
- target>
- <target name="generate.service" depends="compile">
- <copy toDir="${build.dir}/classes" failonerror="false">
- <fileset dir="${basedir}/resources">
- <include name="**/*.xml"/>
- <include name="**/*.wsdl"/>
- fileset>
- copy>
- <jar destfile="${build.dir}/HelloWorldService.aar">
- <fileset excludes="**/Test.class" dir="${build.dir}/classes"/>
- jar>
- target>
- <target name="run.client" depends="compile">
- <java classname="samples.helloworld.client.HelloWorldClient">
- <classpath refid="client.class.path" />
- java>
- target>
- <target name="clean">
- <delete dir="${build.dir}"/>
- target>
- project>
WebService的服务提供类如下:
java 代码
package samples.helloworld.service.axiom; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import org.apache.axiom.om.OMElement; import org.apache.axiom.om.OMAbstractFactory; import org.apache.axiom.om.OMNamespace; import org.apache.axiom.om.OMFactory; import javax.xml.stream.XMLStreamException; /** * * Description: * @author Danlley Wei * @version 1.0 * @date 2007-4-5 */ public class HelloWorldService{ private HashMapmessages=new HashMap();//存放用户信息 public static final String URL="http://axiom.service.helloworld.samples/xsd"; public static final String NS="ns"; OMFactory fac=OMAbstractFactory.getOMFactory();//初始化工厂 OMNamespace omNs=fac.createOMNamespace(URL,NS);//生成命名空间 /** * 说明:客户端请求授权信息时调用的接口 * @param element 用来接收客户端的XML信息 * @return * @throws XMLStreamException */ public OMElement getHelloWorldMs(OMElement element)throws XMLStreamException{ try{ element.build(); element.detach(); ArrayList dataLi=new ArrayList(); String symbol=null; String userPWD=null; String transactionKey=null; for(Iterator it=element.getChildElements();it.hasNext();){ OMElement temp=(OMElement)it.next(); if(temp.getLocalName().equalsIgnoreCase("symbol")){ symbol=temp.getText(); } if(temp.getLocalName().equalsIgnoreCase("userPWD")){ userPWD=temp.getText(); } if(temp.getLocalName().equalsIgnoreCase("transactionKey")){ transactionKey=temp.getText(); } if(null!=userPWD)dataLi.add(userPWD); if(null!=transactionKey)dataLi.add(transactionKey); if(null!=symbol)dataLi.add(symbol); } // System.out.println("********"+symbol+" | "+userPWD+" | "+transactionKey+" | "+"********"); element=responseMessage("getHelloWorldMsResponse",symbol,userPWD,transactionKey);//产生应答信息 return element; }catch(Exception e){ e.printStackTrace(); throw new XMLStreamException(); } } /** * 说明:此方法无返回值,用于初始化用户帐号信息 * * @param element * @throws XMLStreamException */ public void setHelloWorldMs(OMElement element)throws XMLStreamException{ try{ element.build(); element.detach(); String symbol=null; String userPWD=null; String transactionKey=null; ArrayList dataLi=new ArrayList(); for(Iterator iter=element.getChildElements();iter.hasNext();){ OMElement tmp=(OMElement)iter.next(); if(tmp.getLocalName().equalsIgnoreCase("symbol")){ symbol=tmp.getText(); } if(tmp.getLocalName().equalsIgnoreCase("userPWD")){ userPWD=tmp.getText(); } if(tmp.getLocalName().equalsIgnoreCase("transactionKey")){ transactionKey=tmp.getText(); } if(null!=userPWD)dataLi.add(userPWD); if(null!=transactionKey)dataLi.add(transactionKey); if(null!=symbol)dataLi.add(symbol); } if(!messages.containsKey(symbol)){ messages.put(symbol,dataLi); System.out.println("******** add user "+symbol+" ********"); }else{ System.out.println(" The userInfo already exist here ------->"+symbol); } }catch(Exception e){ e.printStackTrace(); throw new XMLStreamException(e); } } /** * 说明:用于判断是否下载成功,消息产生方式与方法: * getHelloWorldMs(OMElement element)throws XMLStreamException相同。 * @param element * @return * @throws XMLStreamException */ public OMElement getDownloadConfirm(OMElement element)throws XMLStreamException{ try{ element.build(); element.detach(); String symbol=null; String userPWD=null; String transactionKey=null; OMElement myel=element.getFirstElement(); symbol=myel.getText(); OMElement myel1=(OMElement)myel.getNextOMSibling(); userPWD=myel1.getText(); OMElement myel2=(OMElement)myel1.getNextOMSibling(); transactionKey=myel2.getText(); element=responseMessage("getDownloadConfirmResponse",symbol,userPWD,transactionKey);//产生应答信息 System.out.println("**********************************************************"); System.out.println(" DOWNLOAD INFORMATION "); System.out.println(" the message have been sended to the Client !"); System.out.println("**********************************************************"); return element; }catch(Exception e){ e.printStackTrace(); throw new XMLStreamException(e); } } /** * 说明:产生客户端请求后的应答信息,其信息为一个OMElement对象OMElement element ,其结果送给上层调用者 * getHelloWorldMs(OMElement element)throws XMLStreamException; * getDownloadConfirm(OMElement element)throws XMLStreamException * @param eleName * @param userName * @param userPWD * @param transactionKey * @return */ private OMElement responseMessage(String eleName,String userName,String userPWD,String transactionKey){ OMElement element=fac.createOMElement(eleName,omNs); if(cheAuthrized(userName,userPWD)){ element=createRespElement(element,"0","Success");//产生授权成功的应答信息 }else{ //生成一个1~11以内的随机数,如果随机数为 0 ,则强制指定为 10 ,防止与正确的应答 code重复 int rand=(int)(Math.random()*10); if(rand+Math.random()>9)rand=11; if(rand==0)rand=10; System.out.println("There are some errors occured here with the random number : "+rand); element=getErrorElement(rand,element); } return element; } /** * 说明:根据不同的错误码,获取错误信息结点,并把结点信息送到上层调用者 * responseMessage(String eleName,String userName,String userPWD,String transactionKey); * @param errorCode * @param element * @return */ private OMElement getErrorElement(int errorCode,OMElement element){ switch(errorCode){ case 1: element=createRespElement(element,"REQUEST_ERROR","Error on the request (parameter format)"); break; case 2: element=createRespElement(element,"CONTEXT_ERROR","Context errors (in this case, can be user disabled)"); break; case 3: element=createRespElement(element,"SECURITY_ERROR","Wrong Credentials or Permission Denied on this API"); break; case 4: element=createRespElement(element,"SECURITY_ERROR","Invalid credentials"); break; case 5: element=createRespElement(element,"REQUEST_ERROR","transactionKey is required"); break; case 6: element=createRespElement(element,"REQUEST_ERROR","Invalid transactionKey format"); break; case 7: element=createRespElement(element,"REQUEST_ERROR","Invalid transactionKey"); break; case 8: element=createRespElement(element,"CONTEXT_ERROR","transactionKey already confirmed"); break; case 9: element=createRespElement(element,"CONTEXT_ERROR","transactionKey not found"); break; case 10: element=createRespElement(element,"CONTEXT_ERROR","Not enough credits "); break; default: element=createRespElement(element,"APPLICATION_ERROR","Undetected error on Web Service"); break; } return element; } /** * 说明:当服务器收到请求后做出应答响应,并将应答信息返回给客户端,该应答信息是一个xml结点,如下: * * the response code * detail information * * 此方法仅仅用于生成如上结构的结点,并将处理后的结果转交给上层调用者 * responseMessage(String eleName,String userName,String userPWD,String transactionKey); * 来处理 * @param eleName * @param arg0 * @param arg1 * @return */ private OMElement createRespElement(OMElement element,String arg0,String arg1){ OMElement value1 = fac.createOMElement("Code", omNs); value1.addChild(fac.createOMText(value1, arg0)); element.addChild(value1); OMElement value2 = fac.createOMElement("Description", omNs); value2.addChild(fac.createOMText(value2, arg1)); element.addChild(value2); return element; } /** * 说明:判断当前用户的账户信息是否正确,只有在用户名和密码都正确的情况下才返回true,并把结点信息送到上层调用者 * responseMessage(String eleName,String userName,String userPWD,String transactionKey); * @param userName 用户名 * @param userPWD 密码 * @return */ private boolean cheAuthrized(String userName,String userPWD){ // System.out.println("********"+userName+" | "+userPWD+"********"); if(messages.containsKey(userName)&&null!=userPWD){ ArrayList myLi=(ArrayList)messages.get(userName); String userPWD_chk=(String)myLi.get(1); if(userPWD.equals(userPWD_chk))return true; } return false; } }
执行如下命令:
java2wsdl -cp . -cn samples.helloworld.service.axiom.HelloWorldService -of HelloWorldService.wsdl
打开生成的wsdl文件进行修改,删除文件中的下面代码:
<xs:element name="getHelloWorldMsFault"><soap:body use="literal" namespace="&lt;a href=" axiom.service.helloworld.samples=" _fcksavedurl="><soap:body use="literal" namespace="&lt;a href=" axiom.service.helloworld.samples=" _fcksavedurl="><soap12:body use="literal" namespace="&lt;a href=" axiom.service.helloworld.samples=" _fcksavedurl="><soap12:body use="literal" namespace="&lt;a href=" axiom.service.helloworld.samples=" _fcksavedurl="><soap12:body use="literal" namespace="&lt;a href=" axiom.service.helloworld.samples=" _fcksavedurl=">
xml 代码
- <xs:element name="getDownloadConfirmFault">
- <xs:complexType>
- <xs:sequence>
- <xs:element name="getDownloadConfirmFault" type="xs:anyType" />
- xs:sequence>
- xs:complexType>
- xs:element>
- <xs:element