`

webservice系列2---javabean&handler

 
阅读更多
摘要:本节主要介绍以下两点,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最新版本。

project

这里测试客户端和服务端放在同一个工程的不同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的处理过程可以表示如下:

image

图中多个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包吧


配置文件

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



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

客户端后台日志:


服务端后台日志:


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics