[置顶] webservice系列2---javabeanhandler
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最新版本。
这里测试客户端和服务端放在同一个工程的不同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的处理过程可以表示如下:
图中多个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客户端调用,查看返回结果
客户端后台日志:
服务端后台日志:
转载于:https://blog.51cto.com/3001448/1205847
相关文章:

AI教育公司物灵科技完成战略融资,商汤科技投资
1月2日消息,从相关媒体报道,AI教育公司物灵科技近日完成了商汤的战略融资,本轮融资将用于产品迭代和扩大市场。 此前投资界曾报道,物灵科技已经获得1.5亿元Pre-A轮融资,当时具体资方未透露。 公开资料显示࿰…

Python之父发文,将重构现有核心解析器
原题 | PEG Parsers作者 | Guido van Rossum译者 | 豌豆花下猫转载自 Python猫(ID: python_cat) 导语:Guido van Rossum 是 Python 的创造者,虽然他现在放弃了“终身仁慈独裁者”的职位,但却成为了指导委员会的五位成员…

全面支持三大主流环境 |百度PaddlePaddle新增Windows环境支持
2019独角兽企业重金招聘Python工程师标准>>> PaddlePaddle作为国内首个深度学习框架,最近发布了更加强大的Fluid1.2版本, 增加了对windows环境的支持,全面支持了Linux、Mac、 windows三大环境。 PaddlePaddle在功能完备的基础上,也…
设计模式之原型模式(Prototype)摘录
23种GOF设计模式一般分为三大类:创建型模式、结构型模式、行为模式。 创建型模式包括:1、FactoryMethod(工厂方法模式);2、Abstract Factory(抽象工厂模式);3、Singleton(单例模式);4、Builder(建造者模式、生成器模式…

NFS共享服务挂载时出现“access denied by server while mounting”的解决方法
笔者用的Linuxf发行版本为Centos6.4,以下方法理论上讲对于Fedora, Red Hat均有效: 搭建好NFS服务后,如果用以下的命令进行挂载: # mount -t nfs 172.16.12.140:/home/liangwode/test /mnt 出现如下错误提示: mount.nf…
设计模式之桥接模式(Bridge)摘录
23种GOF设计模式一般分为三大类:创建型模式、结构型模式、行为模式。 创建型模式包括:1、FactoryMethod(工厂方法模式);2、Abstract Factory(抽象工厂模式);3、Singleton(单例模式);4、Builder(建造者模式、生成器模式…

原360首席科学家颜水成正式加入依图科技,任首席技术官
7 月 29 日,依图科技宣布原 360 首席科学家颜水成正式加入,担任依图科技首席技术官(CTO)一职。依图方面称,颜水成加入后将带领团队进一步夯实依图在人工智能基础理论和原创算法方面的技术优势,为依图在商业…

分布式存储fastdfs安装使用
1.下载地址https://github.com/happyfish100/fastdfshttps://github.com/happyfish100/fastdfs/wiki安装辅助说明文档2.安装编译环境yum install git gcc gcc-c make automake autoconf libtool pcre pcre-devel zlib zlib-devel openssl-devel wget vim -y三台主机:…

Hibernate学习(九)———— 二级缓存和事务级别详讲
序言 这算是hibernate的最后一篇文章了,下一系列会讲解Struts2的东西,然后说完Struts2,在到Spring,然后在写一个SSH如何整合的案例。之后就会在去讲SSM,在之后我自己的个人博客应该也差不多可以做出来了。基本上先这样…

超详细中文预训练模型ERNIE使用指南
作者 | 高开远,上海交通大学,自然语言处理研究方向最近在工作上处理的都是中文语料,也尝试了一些最近放出来的预训练模型(ERNIE,BERT-CHINESE,WWM-BERT-CHINESE),比对之后还是觉得百…
linux内核SMP负载均衡浅析
需求 在《linux进程调度浅析》一文中提到,在SMP(对称多处理器)环境下,每个CPU对应一个run_queue(可执行队列)。如果一个进程处于TASK_RUNNING状态(可执行状态),则它…

结构体中最后一个成员为[0]或[1]长度数组(柔性数组成员)的用法
结构体中最后一个成员为[0]长度数组的用法:这是个广泛使用的常见技巧,常用来构成缓冲区。比起指针,用空数组有这样的优势:(1)、不需要初始化,数组名直接就是所在的偏移;(2)、不占任何空间,指针需…

超全!深度学习在计算机视觉领域的应用一览
作者 | 黄浴,奇点汽车美研中心首席科学家兼总裁转载自知乎简单回顾的话,2006年Geoffrey Hinton的论文点燃了“这把火”,现在已经有不少人开始泼“冷水”了,主要是AI泡沫太大,而且深度学习不是包治百病的药方。计算机视…

SHAREPOINT2010数据库升级2013
在作TEST-SPCONTENT命令时,会提示认证方式不一样。 The [SharePoint - 80] web application is configured with claims authentication mode however the content database you are trying to attach is intended to be used against a windows classic authentic…
设计模式之简单工厂模式(Simply Factory)摘录
从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的…

别得意,你只是假装收藏了而已
今天分享我在看罗振宇的《2018 时间的朋友》演讲视频记下的一些思考。跨年演讲中有过这样的一个来自印象笔记的片段,列举了几组对比来说明: 『你在朋友圈里又佛又丧,你在收藏夹里偷偷地积极向上。』 扎心了,这不就是说我吗&#x…

Exchange2003-2010迁移系列之四,配置第一台Exchange CAS/HUB服务器
配置第一台CAS/HUB关于Cas/hub的配置请大家详见前面关于Ex2010的部署(两个配置基本相同在这里就不做详细的解说了)下面关于Cas的配置在前面已经提到了但是下面是另一种新的方法大家就看看吧生产环境中部署Exchange2010服务器时,是需要按照一定…
设计模式之适配器模式(Adapter)摘录
23种GOF设计模式一般分为三大类:创建型模式、结构型模式、行为模式。 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建、组合和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给…

JAVA方法中的参数用final来修饰的效果
很多人都说在JAVA中用final来修饰方法参数的原因是防止方法参数在调用时被篡改,其实也就是这个原因,但理解起来可能会有歧义,我们需要注意的是,在final修饰的方法参数中,如果修饰的是基本类型,那么在这个方…

2019世界机器人大赛圆满落幕,荆州中学等15支队伍获「全能奖」
7月28日,2019世界机器人大赛总决赛在河北保定圆满落下帷幕。保定市市委常委罗德强、中国电子学会副秘书长梁靓、保定市政府秘书长王保辉、保定市政府副秘书长安利文、保定市徐水区区长李志永、保定市莲池区政府党组副书记赵建军、世界机器人大赛组委会秘书长李洋、长…

在任何设备上都完美呈现的30个华丽的响应式网站
如今,一个网站只在桌面屏幕上好看是远远不够的,同时也要在平板电脑和智能手机中能够良好呈现。响应式的网站是指它能够适应客户端的屏幕尺寸,自动响应客户端尺寸变化。在这篇文章中,我将向您展示在任何设备上都完美的30个华丽的响…
设计模式之装饰模式(Decorator)摘录
23种GOF设计模式一般分为三大类:创建型模式、结构型模式、行为模式。 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建、组合和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给…

解决流程自动化“最后一公里问题”,达观数据发布智能 RPA
2019 年7月 26 日,业界领先的人工智能企业达观数据在北京召开“达道至简”为主题的产品发布会,正式推出国内首款自主研发集OCR(光学字符识别)与 NLP(自然语言处理)于一体的达观智能RPA。达观数据创始人兼CEO陈运文、副总裁金克、贾学锋和联合创始人高翔携…

利用脚本生成GUID
实际上,可以使用一种非常简单的方法来生成 GUID,但这种方法近乎像是作弊。(您可听清楚了,我们说的可是“近乎”。)“Scriptlet.TypeLib”对象的设计用途是帮助您创建“Windows 脚本组件”(实质上࿰…
设计模式之组合模式(Composite)摘录
23种GOF设计模式一般分为三大类:创建型模式、结构型模式、行为模式。 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建、组合和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给…

快速开发生命周期支持工具
去年有幸研究公司管理产品的软件平台,当时考虑的产品是基于业务模型之上的一个系统平台,从建模到运行、部署、维护全生命周期管理.当时就提出两个希望先实践解决的就是可复用原型的设计和使用工作流和规则引擎的协作处理询标产品.前一阵子在公司研究成本产品的成本分析和算法,一…

华人学者解开计算机领域30年难题:布尔函数敏感度猜想
整理 | 郭芮来源 | CSDN(ID:CSDNnews)1992年,布尔函数敏感度猜想(Boolean Sensitivity)被提出,这成为了理论计算机科学近三十年来最重要、最令人困惑的开放性问题之一。而近日,来自E…

从1.5K到18K 一个程序员的5年成长之路(二)
这一切都来自于心态CSDN:从开始学习,到学有所成和找工作,再到工作中遇到各种困难,然后获得突破,在整个过程中,能总结下你心态都有哪些变化?是用运用什么方法或方式进行调整?雷果国&a…
设计模式之享元模式(Flyweight)摘录
23种GOF设计模式一般分为三大类:创建型模式、结构型模式、行为模式。 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建、组合和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给…

你想见的大神都来AI ProCon 2019了,优惠票限时抢购开启!
如今 AI 的发展真实地面临着诸多瓶颈、尽管很多智能助手已经可以执行很多任务,但距离真正的人机自然交互还需要很长时间;强人工智能也迟迟未出现,不知何时才能出现;现有的 AI 只能做好一件事,Alpha Go 只会下棋&#x…