[置顶] 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
[置顶] webservice系列2---javabeanhandler相关推荐
- [置顶]WebService学习总结(4)——第三方webService服务调用
互联网上面有很多的免费webService服务,我们可以调用这些免费的WebService服务,将一些其他网站的内容信息集成到我们的Web应用中显示,下面就以获取天气预报数据和查询国内手机号码归属地为 ...
- 精华文章置顶--CDC系列之一 :使用Dejournal Filter在InterSystems IRIS/Caché上通过Mirroring实现CDC功能...
InterSystems IRIS/Caché的CDC InterSystems IRIS/Caché未提供开箱即用的变更数据捕获(CDC)工具,而且由于其多模型建模能力和底层的多维存储模型,相对于关 ...
- 阅读目录(置顶)(长期科技领域知识)
第一期:适用于数据项目的7种强大的开源工具 第二期:四种正确的微服务部署方式 第三期:开源和赚钱何去何从 第四期:Web前端和Java开发哪个薪资更高,发展前景更好? 第五期:干货总结:中级前端工程师 ...
- 玩安卓从 0 到 1 之列表一键置顶
前言 系列文章 这篇文章是这个系列的第六篇文章了,下面是前五篇文章: 1.玩安卓从 0 到 1 之总体概览 2.玩安卓从 0 到 1 之项目首页 3.玩安卓从 0 到 1 之首页框架搭建. 4.玩安卓 ...
- 博主文章导航(分门别类,实时更新,永久置顶)
恒叨立码 :: 包括 理论恒叨 系列与 码上实战系列,一个算法,从理论到编码,博主悉心教学.恒叨立马,见功力也. :: 恒叨立码,是为大将军! :: 将军,请上码! 此博客的目的是做一个博文中转站.博 ...
- 什么软件可以将win窗口进行置顶_电脑极简指南,这5个方法可以帮你节约生命...
1.阅读本文预计需要 10 分钟,并提供了资源下载.2.本文是「电脑爱好者」专题C09篇的更新版本.3.第一时间获取更新,欢迎关注「奔跑中的奶酪」. 导读 北方的朋友可能不知道,在南方的菜市场,如果你 ...
- 推荐+1置顶+1(分享、讨论、实现) 通用软件注册功能之建立有效的软件保护机制
推荐+1置顶+1(分享.讨论.实现) 通用软件注册功能之建立有效的软件保护机制 众所周知,一些共享软件往往提供给使用者的是一个功能不受限制的限时使用版,在试用期内使用者可以无限制的使用软件的全部功能( ...
- 项目1在线交流平台-7.构建安全高效的企业服务-3. Security整合Kafka,ES,Thymeleaf实例-对帖子置顶、加精、删除
文章目录 功能需求 一.置顶.加精.删除帖子功能的实现 1. dao层处理数据 接口定义 sal语句定义 2. service层业务处理 3. Controller层处理按钮事件异步请求 异步请求及k ...
- 微信支持群消息置顶;博通洽购虚拟机巨头VMware;
微信支持群消息置顶 近日,微信iOS版更新了8.0.22版本,有用户发现,在该版本中,#微信新增群消息置顶功能#.群主或管理员长按需要置顶的消息,在菜单中点击置顶操作.之后消息就会置于群聊天界面的顶部 ...
最新文章
- Clever Answers in Codewar(Javascript 持续更新)
- Google Chrome 72 丢弃HPKP,不再支持TLS1.0和TLS1.1!
- mysql9索引实战_课程介绍目录索引
- python车辆管理系统_Python简易版停车管理系统
- 发布乐维Webgis平台1.0 Demo,欢迎加入参与制作前端
- java 反射 单列_轻松掌握Java单例模式
- MySQL中清空表和截断表的区别(新手入门.)
- 医学专业失业率最高 三类相关行业人才紧缺
- 字符指针变量和字符数组的对比
- c语言c99标准_C语言的三套标准:C89、C99和C11
- 23. PHP include and require 文件
- 利用VB.Net 通过Windows Sockets (Winsock)以及多线程编程进行桌面电脑与Pocket PC间的双向通信
- VScode+Latex:代码和pdf互相跳转
- 华为主题锁屏壁纸换不掉_华为手机的不明照片是哪来的?这几个设置得关闭,否则128G也不够...
- 计算机模拟病例考试试题,计算机模拟病例考试的效标—关联效度研究
- 嵌入式 - 瑞萨电子的并购交易
- [内存泄漏]pppd程序导致的内存泄漏
- ps修改图片中的图片尺寸
- @loj - 2478@「九省联考 2018」林克卡特树
- 全链路压测需要如何开展?