webservice学习二之(1)axis2服务器端方式开发总结(附件含有项目)

一、首先建一个webservice_portal的web工程
    1、工程目录
        webservice学习二之(1)axis2服务器端方式开发总结(附件含有项目)
    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客户端代码。

你可能感兴趣的:(apache,xml,Web,jboss,webservice)