一、首先建一个webservice_portal的web工程
1、工程目录
2、把axis2相关包放到工程lib目录下
二、开发webservice_portal工程
1、开发服务器端代码,如下:
com.smartdot.webservice.service.impl.OMElementUtils.java
/**
*
* This is a part of the smartdot cpms system.
* Copyright (C) 2008-2009 Smartdot Corporation
* All rights reserved.
*
* Licensed under the Smartdot private License.
* Created on 2009-4-22
* @author YangLin
**/
package com.smartdot.webservice.service.impl;
import java.util.Iterator;
import javax.xml.namespace.QName;
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 com.smartdot.util.OMElementUtils;
/**
* 功能:跨平台登录系统。
* webservice服务器端。主要是接收客户端发送的信息,并进行判断用户是否存在,进而返回succee和failed
* @author YangLin
*
*/
public class APIWebService{
/**
* 接收客户端的信息,并根据其信息返回是否登录。
* @param userEle
* <Y><Z><A>a</A><B>b</B></Z></Y>客户端提交的内容。Y的第一个节点是<Z><A>a</A><B>b</B></Z>
* <A>a</A><B>b</B>是Z的子节点。对象的子节点中必须有值。
* 关于服务器解析的内容是根据客户端提交的内容进行解析的。而且其他客户端想要调用服务器端的方法,
* 其提交的内容格式必须要相同。
* 假设数据库中存在用户yanglin,密码smartdot.
* @return
*/
public OMElement receiveUser(OMElement userEle){
String xmlInfo = "<state>SUCCESS</state>";
String name="";
String password="";
System.out.println("webservice start ............");
/************开始对客户端传递的内容进行解析。***********/
try{
/**
* 此方法提取对象的第一个节点,经过对象.getFirstElement()方法解析后,
* 其内容是:<Z><A>a</A><B>b</B></Z>。
* paramElem必须是当前对象只包括子节点对象,否则继续解析。直到只存在子节点对象。
*/
OMElement paramElem = userEle.getFirstElement();
//分两种方式解析OMElement对象
//第一种方式遍历子节点对象,集合存放的内容是<A>a</A><B>b</B>
Iterator it=paramElem.getChildren();
while(it.hasNext()){
//此对象存放的是<A>a</A>、<B>b</B>内容
OMElement childs=(OMElement)it.next();
if(childs.getLocalName().equals("name")){
name=childs.getText();//得到用户名
}
if(childs.getLocalName().equals("password")){
password=childs.getText();//得到用户密码
}
}
//第二种方式直接查找匹配子节点name属性
OMElement nameElem = paramElem.getFirstChildWithName(new QName("name"));
name=nameElem.getText();//得到用户名
OMElement passwordElem = paramElem.getFirstChildWithName(new QName("password"));
password=passwordElem.getText();//得到用户密码
if(!name.equals("yanglin") || !password.equals("smartdot")){
xmlInfo = "<state>FAILED</state>";
}
}catch(Exception e){
xmlInfo = "<state>FAILED</state>";
}
/***************到目前为止已经对客户端传递的内容进行解析。****************/
/************先创建OMElement对象,并将其对象返回客户端*************/
//这个用中文我也不好说 就算是创造了一个工厂吧。
OMFactory fac=OMAbstractFactory.getOMFactory();
//这个是命名空间,实际情况需要看对方给你的wsdl这个值是什么.这是服务器端随便你定义.客户端需要照这个样子传才行。后面那个参数可为空也可以有值。这个东西也好理解调试的时候打印下OMElement 就知道这东西怎么用了。
OMNamespace omNs=fac.createOMNamespace("", "");
//创建元素sayHello,并指定其在omNs指代的名称空间中。
OMElement soapMain=fac.createOMElement("sendClient",omNs);
OMElement content=fac.createOMElement("people",omNs);
OMElement valueElem=new OMElementUtils().toOMElement(xmlInfo,"UTF-8");//将字符串值转换成OMElement对象
//把一个对象放入另一个对象,valueElem就是content的子结点。
content.addChild(valueElem);
soapMain.addChild(content);
System.out.println("webservice end ............");
/********************创建OMElement对象完毕,并将其对象返回客户端*******************/
return soapMain;
}
}
2、开发字符串类型转换成OMElement对象的公共类,如下
com.smartdot.util.OMElementUtils
/**
*
* This is a part of the smartdot cpms system.
* Copyright (C) 2008-2009 Smartdot Corporation
* All rights reserved.
*
* Licensed under the Smartdot private License.
* Created on 2009-4-22
* @author YangLin
**/
package com.smartdot.util;
import java.io.ByteArrayInputStream;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.impl.builder.StAXOMBuilder;
public class OMElementUtils {
// 将xml字符创解析成OMElement对象。
public OMElement toOMElement(String xmlStr, String encoding) {
OMElement xmlValue;
try {
xmlValue = new StAXOMBuilder(new ByteArrayInputStream(xmlStr
.getBytes(encoding))).getDocumentElement();
return xmlValue;
} catch (Exception e) {
return null;
}
}
}
3、开发配置文件,如下:
com.smartdot.webservice.service.META-INF.services.xml
<serviceGroup>
<!--下面定义服务名,当在url访问时用到此服务名-->
<service name="APIWebService" scope="soapsession">
<description></description>
<!--ServiceClass指定Java Class的位置,即实现服务的类。 -->
<parameter name="ServiceClass" locked="xsd:false">
com.smartdot.webservice.service.impl.APIWebService
</parameter>
<!--operation 与Java Class中方法名对应 -->
<operation name="receiveUser">
<messageReceiver
class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver" />
<actionMapping>urn:receiveUser</actionMapping>
</operation>
</service>
</serviceGroup>
3、开发build进行部署,如下:
<?xml version="1.0" encoding="UTF-8"?>
<project default="compile" basedir="." name="webservice_portal">
<description>
一段描述信息,没有实际作用。
</description>
<property name="build.debug" value="on" />
<property name="build.debuglevel" value="lines,vars,source" />
<property name="build.optimize" value="off" />
<property name="build.deprecation" value="off" />
<property name="build.source" value="1.4" />
<property name="src" value="src" />
<property name="dest" value="build"/>
<property name="dist" value="dist"/>
<property name="lib.dir" location="lib" />
<property name="testant_jar" value="testant.jar" />
<property name="product.jar.name" value="${project.name}.jar" />
<property name="product.war.name" value="${project.name}.war" />
<target name="init" description="在元素中指定描述信息">
<echo message="这里的信息将被输出到控制台!"/>
<mkdir dir="${dest}"/>
<mkdir dir="${dist}"/>
<mkdir dir="${dest}/src" />
<mkdir dir="${dest}/webdocs" />
</target>
<target name="clean">
<delete dir="${dest}" />
<delete dir="${dist}" />
</target>
<path id="compile.path">
<fileset dir="${lib.dir}">
<include name="**/*jar" />
</fileset>
</path>
<target name="compile" depends="init">
<javac srcdir="${src}" destdir="${dest}/src" debug="${build.debug}" debuglevel="${build.debuglevel}" optimize="${build.optimize}" deprecation="${build.deprecation}" source="${build.source}">
<!--classpath:表示编译类所需的jar包的位置-->
<classpath>
<path refid="compile.path" />
</classpath>
</javac>
<copy todir="build/src" overwrite="true">
<fileset dir="${src}">
<include name="**/*.xml" />
</fileset>
</copy>
<copy todir="${dest}/webdocs" overwrite="true">
<fileset dir="WebContent">
<include name="**/*" />
</fileset>
</copy>
</target>
<!--将项目源文件打jar包-->
<target name="create-jar" depends="compile">
<echo message="将项目源文件打包jar!"/>
<jar jarfile="${dist}/${product.jar.name}">
<fileset dir="${dest}/src">
<include name="**/*" />
</fileset>
</jar>
<jar destfile="${dist}/APIWebService.aar">
<metainf dir="${dest}/src/com/smartdot/webservice/service/META-INF">
<include name="services.xml" />
</metainf>
</jar>
</target>
<!--将项目源文件打war包-->
<target name="dist-war" depends="clean,init,compile,create-jar">
<war destfile="${dist}/${product.war.name}">
<fileset dir="${dest}/webdocs">
</fileset>
</war>
</target>
<!--将jar,war包导入到jboss制定路径-->
<target name="copy-war-to-jboss" depends="clean,init,compile,create-jar,dist-war">
<echo message="将编译的和导入的jar包导入到jboss下的server/default/lib目录下"/>
<copy todir="${jboss.home}/server/default/lib" overwrite="true">
<fileset dir="${dist}" includes="*.jar" />
<fileset dir="${lib.dir}" includes="*.jar" />
</copy>
<echo message="删除历史的war包"/>
<delete dir="${jboss.home}/server/default/deploy/${product.war.name}" />
<echo message="将打成的war包拷贝到server/default/deploy目录下"/>
<copy todir="${jboss.home}/server/default/deploy" overwrite="true">
<fileset dir="${dist}" includes="${product.war.name}" />
</copy>
</target>
<!--将jar、war包导入到jboss制定目录,但是和上面的方式不同,不同之处是上面的方法是将war包拷贝到jboss制定目录,
而现在先创建一个文件夹(*.war),再将${dest}/webdocs下的内容拷贝到这个文件夹下-->
<target name="copy-dir-to-jboss" depends="clean,init,compile,create-jar">
<echo message="将编译的和导入的jar包导入到jboss下的server/default/lib目录下"/>
<copy todir="${jboss.home}/server/default/lib" overwrite="true">
<fileset dir="${dist}" includes="*.jar" />
<fileset dir="${lib.dir}" includes="*.jar" />
<fileset dir="${lib.dir}/axis" includes="*.jar" />
</copy>
<echo message="删除历史的war包"/>
<delete dir="${jboss.home}/server/default/deploy/${product.war.name}" />
<echo message="再将${dest}/webdocs下的内容拷贝到server/default/deploy/${product.war.name}目录下"/>
<copy todir="${jboss.home}/server/default/deploy/${product.war.name}" overwrite="true">
<fileset dir="${dest}/webdocs" includes="**/*" />
</copy>
<copy todir="${jboss.home}/server/default/deploy/${product.war.name}/WEB-INF/services" overwrite="true">
<fileset dir="${dist}" includes="*.aar" />
</copy>
</target>
</project>
其中build参数为:
-Das.type=jboss
-Djboss.home=D:\jboss-4.0.2_webservice_portal
-Dproject.name=webservice_portal
4、修改web.xml文件,添加如下代码:
<servlet>
<servlet-name>AxisServlet</servlet-name>
<servlet-class>
org.apache.axis2.transport.http.AxisServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/servlet/AxisServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>*.jws</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
到目前为止webservice服务器端已经完成,并客户通过上述build进行编辑部署,以上代码注释均是自己查找资料并在开发中自己理解的,如果有不对的地方,请指教。谢谢。
关于webservice客户端编写请看
webservice学习二之2webservice客户端开发
关于附件的说明,由于所需jar包已经超过了10M,所以要分批进行上传,并且还要上传工程,当下载后,将axis1.rar和axis2.rar包中的jar包合并,并且放置文件夹为axis中,再将axis文件夹拷贝到工程lib目录下。webservice_portal.rar为webservice服务器端代码,webservice_client.rar为webservice客户端代码。