摘要:本节主要介绍以下两点,1.带javabean的webservice的开发和调用 2.handler的简单介绍及使用

1.引言
在之前的一篇博客

webservice系列1---基于web工程上写一个基本数据类型的webservice

中介绍了如何采用axis1.4来完成一个简单的webservice的开发流程(入参和出参都是基本类型),但是在实际的开发中,方法的入参和出参基本类型已经无法满足我们日常的需求,如果方法的入参和出参中有对象的时候,我们要怎么处理呢?通过本节的介绍我会一一道来。

同时,我会引入对handler的介绍以及简单的使用,写了一个统计webservice调用次数的handler。



2.项目环境
system:win7

myeclipse:6.5


tomcat:5.0

JDK:开发环境采用JDK1.5;编译环境采用JDK1.4

axis:仍然采用1.4的版本。采用版本1是axis1比axis2稳定,实际项目中我们项目中也只用axis1,axis1.4是目前axis1最新版本。

[置顶]          webservice系列2---javabean&handler_Web服务

这里测试客户端和服务端放在同一个工程的不同package中;

web.xml---web项目的配置文件;这里我们只用来配置了webservice的处理类AxisServlet;

server-config.wsdd---axis1.4定制发布的配置文件,这里不再需要用AdminClient来生成,直接拷贝之前工程的配置文件然后修改;

WebServiceClientUtil.java---调用webservice服务的客户端,采用动态调用,并且这里的客户端更加灵活;

IGroupInfoService.java和IGroupInfoServiceImpl.java---一个入参和出参包含对象的webservice服务对应的接口和实现类;

GroupInfo.java和UserInfo.java---服务需要用的两个标准的javabean;

GroupServiceHandler.java---一个handler处理类(什么是handler?请见下面的介绍),用来统计webservice的调用次数;



3.Handler介绍
什么是handler?J2EE Web 服务中的Handler技术特点非常像Servlet技术中的Filter。我们知道,在Servlet中,当一个HTTP到达服务端时,往往要经过多个Filter对请求进行过滤,然后才到达提供服务的Servlet,这些Filter的功能往往是对请求进行统一编码,对用户进行认证,把用户的访问写入系统日志等。在我的理解看来,handler就是为了在不污染原有的代码的前提下,通过配置文件,我们可以增加我们需要的功能,相应的,Web服务中的Handler通常也提供一下的功能:比如:

(1)可以记录某一个webservice的访问次数和访问时间(本节有这个小例子来简单介绍handler)

(2)调用webservice之前根据我们的需求做检验(关于使用handler做IP和用户的校验后面会有介绍);

(3)对请求的SOAP消息进行加密,解密

(4)为webservice对象做缓存

handler的处理过程可以表示如下:

[置顶]          webservice系列2---javabean&handler_webservice_02

图中多个handler在一起,其实这就组成了chain,后面我会对这个做个简单的介绍;

图中有handler有request和response;

那么,到底我们要怎么实现一个handler?

(1)新建一个classs,并且使该类继承BasicHandler类

(2)实现invoke方法

(3)在wsdd文件配置handler处理类,采用<handler></handler>标签

(4)在需要使用handler的webservice中引入handler类,采用<requestFlow><requestFlow/>或者<responseFlow></responseFlow>

以上是实现一个handler的步骤,具体的看下面的实例。



4.项目代码
先看看jar包吧

[置顶]          webservice系列2---javabean&handler_Java_03

配置文件

web.xml

 <?xml version="1.0" encoding="UTF-8"?>  <web-app version="2.4"       xmlns="http://java.sun.com/xml/ns/j2ee"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee       http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">           <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>    </web-app>
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="adminPassword" value="admin" />          <parameter name="attachments.Directory"              value="D:\tomcat5\webapps\WebService\WEB-INF\attachments" />          <parameter name="dotNetSoapEncFix" value="true" />          <parameter name="enableNamespacePrefixOptimization"              value="false" />          <parameter name="sendXMLDeclaration" value="true" />          <parameter name="sendXsiTypes" value="true" />          <parameter name="attachments.implementation"              value="org.apache.axis.attachments.AttachmentsImpl" />          <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 name="LocalResponder"          type="java:org.apache.axis.transport.local.LocalResponder" />      <handler name="URLMapper"          type="java:org.apache.axis.handlers.http.URLMapper" />      <handler name="Authenticate"          type="java:org.apache.axis.handlers.SimpleAuthenticationHandler" />      <service name="AdminService" provider="java:MSG">          <parameter name="allowedMethods" value="AdminService" />          <parameter name="enableRemoteAdmin" value="false" />          <parameter name="className" value="org.apache.axis.utils.Admin" />          <namespace>http://xml.apache.org/axis/wsdd/</namespace>      </service>      <service name="Version" provider="java:RPC">          <parameter name="allowedMethods" value="getVersion" />          <parameter name="className" value="org.apache.axis.Version" />      </service>        <transport name="http">          <requestFlow>              <handler type="URLMapper" />              <handler                  type="java:org.apache.axis.handlers.http.HTTPAuthHandler" />          </requestFlow>          <parameter name="qs:list"              value="org.apache.axis.transport.http.QSListHandler" />          <parameter name="qs:wsdl"              value="org.apache.axis.transport.http.QSWSDLHandler" />          <parameter name="qs.list"              value="org.apache.axis.transport.http.QSListHandler" />          <parameter name="qs.method"              value="org.apache.axis.transport.http.QSMethodHandler" />          <parameter name="qs:method"              value="org.apache.axis.transport.http.QSMethodHandler" />          <parameter name="qs.wsdl"              value="org.apache.axis.transport.http.QSWSDLHandler" />      </transport>      <transport name="local">          <responseFlow>              <handler type="LocalResponder" />          </responseFlow>      </transport>        <!-- 配置一个handler,用来统计webservice的访问次数 -->      <handler name="GroupServiceHandler1"          type="java:com.server.wsddhandler.GroupServiceHandler">          <parameter name="status" value="success" />      </handler>        <!-- 配置自己的服务 -->      <service name="GroupService" provider="java:RPC">          <parameter name="allowedMethods" value="*" />          <parameter name="className"              value="com.server.impl.IGroupInfoServiceImpl" />          <!-- 配置javabean  -->          <beanMapping              languageSpecificType="java:com.server.bean.GroupInfo"              qname="ns:GroupInfo" xmlns:ns="urn:BeanService">          </beanMapping>            <beanMapping              languageSpecificType="java:com.server.bean.UserInfo"              qname="ns:UserInfo" xmlns:ns="urn:BeanService">          </beanMapping>              <!-- 引入一个用来统计webservice的访问次数的handler -->          <responseFlow>              <handler type="GroupServiceHandler1" />          </responseFlow>        </service>  </deployment>

服务端代码

(1)javabean

GroupInfo.java

 package com.server.bean;    import java.util.List;    public class GroupInfo {        private List colNames = null; // 数据库表的列名组成的List        private String[] colValues; // 数据库表一条记录的各个列的值组成的数组,即一条数据库表记录值        private int colCount = 0; // 数据库表记录的列数        private UserInfo userInfo = null;        public List getColNames() {          return colNames;      }        public void setColNames(List colNames) {          this.colNames = colNames;      }        public String[] getColValues() {          return colValues;      }        public void setColValues(String[] colValues) {          this.colValues = colValues;      }        public int getColCount() {          return colCount;      }        public void setColCount(int colCount) {          this.colCount = colCount;      }        public UserInfo getUserInfo() {          return userInfo;      }        public void setUserInfo(UserInfo userInfo) {          this.userInfo = userInfo;      }    }
UserInfo.java

 package com.server.bean;    public class UserInfo {        private String serverIp = "";      private String localIp = "";      private long opId = 0;        public String getServerIp() {          return serverIp;      }        public void setServerIp(String serverIp) {          this.serverIp = serverIp;      }        public String getLocalIp() {          return localIp;      }        public void setLocalIp(String localIp) {          this.localIp = localIp;      }        public long getOpId() {          return opId;      }        public void setOpId(long opId) {          this.opId = opId;      }    }

(2)服务类

 IGroupInfoService.java

 package com.server.interfaces;    import com.server.bean.GroupInfo;  import com.server.bean.UserInfo;    /**   *    *Module:          IGroupInfoService.java   *Description:     带javabean的webservice的服务   *Company:          *Version:          1.0.0   *Author:           pantp   *Date:              Aug 21, 2012   */  public interface IGroupInfoService {            public abstract GroupInfo getGroupInfo(UserInfo userInfo,long groupId);        }

IGroupInfoServiceImpl.java

 package com.server.impl;    import java.util.ArrayList;  import java.util.List;    import com.server.bean.GroupInfo;  import com.server.bean.UserInfo;  import com.server.interfaces.IGroupInfoService;    public class IGroupInfoServiceImpl implements IGroupInfoService {        public GroupInfo getGroupInfo(UserInfo userInfo, long groupId) {          System.out.println("开始打印入参值...");          System.out.println("groupId:" + groupId);          System.out.println("serInfo.getOpId():" + userInfo.getOpId());          System.out.println("serInfo.getServerIp():" + userInfo.getServerIp());          System.out.println("serInfo.getLocalIp():" + userInfo.getLocalIp());          System.out.println("结束打印入参值...");            // 这里是为了学习webservice调用时带javabean,所以方法的返回值就直接手动的构造了          GroupInfo group = new GroupInfo();          group.setColCount(1);            List colNames = new ArrayList();          colNames.add("group_id");          colNames.add("group_name");          colNames.add("state");          group.setColNames(colNames);            String colValues[] = { "2100014", "中国移动通信", "1" };          group.setColValues(colValues);            group.setUserInfo(userInfo);          return group;      }    }

(3)handler处理类

GroupServiceHandler.java

 package com.server.wsddhandler;    import java.text.SimpleDateFormat;  import java.util.Date;    import org.apache.axis.AxisFault;  import org.apache.axis.MessageContext;  import org.apache.axis.handlers.BasicHandler;    /*   * 采用handler统计webservice的访问次数   */  public class GroupServiceHandler extends BasicHandler {        private static final long serialVersionUID = 1L;        private static long COUNT = 0L;        private int requestCount = 0;        public void invoke(MessageContext arg0) throws AxisFault {          requestCount++;          COUNT++;          //拿到配置文件中配置的属性名称status对应的属性值          String status = (String) this.getOption("status");          System.out.println("GroupServiceHandler's status is:" + status                  + ",COUNT=" + COUNT + ",HandlerRequestCount=" + requestCount);          Date date=new Date();          SimpleDateFormat df=new SimpleDateFormat("yyyy年MM月dd日 HH:mm:SS E");          System.out.println("access time:"+df.format(date));        }    };

5.运行效果
发布项目,启动tomcat服务器;

(1)在浏览器输入wsdl地址

http://localhost:8080/WebService02/services/GroupService?wsdl

[置顶]          webservice系列2---javabean&handler_String_04

(2)采用webservice客户端调用,查看返回结果

客户端后台日志:

[置顶]          webservice系列2---javabean&handler_Java_05

服务端后台日志:

[置顶]          webservice系列2---javabean&handler_Web服务_06