webservice_axis1_Handler和HandlerChain——可认为是axis1中的过滤器

来源:互联网 发布:python绝技 pdf 编辑:程序博客网 时间:2024/06/05 07:23

1、前言

axis1提供了这样的基本类,继承这个类后可以对服务的请求和回应过程进行监听和其他处理;

在使用上和servlet的过滤器非常相似,都是继承基本类,然后是提供服务,设置被拦截的方法,只不过在axis1中Filter被叫做Handler;

多个Handler可以单个存在,也可以被一个特别的Handler集中调用,这就是HandlerChain,这个意思也容易理解,chain的意思就是链嘛。


简单来说,Handler和HandlerChain的区别在于,二者继承的类是不同的

Handler继承BasicHandler

HandlerChain继承SimpleChain


再一个是,HandlerChain调用Handler,即Handler是HandlerChain存在的基础

最后是,Handler可以获取WSDD方式发布服务时设置的默认值,但是HandlerChain则不可以。


2、前期准备

我们运行Handler一般是用于基本服务的监控的,所以需要先有一个基本类,由于之前已经有介绍如何编写和发布此类服务,这里不再赘述

请参考

 axis1-myeclipse/eclipse-入门级别-资源、流程、常见问题

axis1.4 wsdd 方式发布webservice 服务配置文件以及常用的DOS执行语句

axis1.4发布返回复杂类型的webservice服务+代码访问+客户端访问

总之,提供一个可对外发布的服务即可。


3、Handler的编写、发布、调用配置和运行效果

TheHandler.java

其继承了 BasicHandler,用于统计服务被访问的次数,当然后面会说到如何设置,这个invoke方法是继承自父类。

package com.demo.action;import org.apache.axis.AxisFault;import org.apache.axis.MessageContext;import org.apache.axis.handlers.BasicHandler;public class TheHandler extends BasicHandler {/** * 继承axis1的BasicHandler,设置全局变量,该类类似于web中的lister类,自动运行 */private static final long serialVersionUID = 3423234116214630747L;private static int SUM_COUNT = 0;public void invoke(MessageContext arg0) throws AxisFault {// TODO Auto-generated method stubSUM_COUNT++;//更新服务的总访问次数System.out.print("TheHandler-服务被访问的次数为:"+SUM_COUNT+"   ");//还可以在wsdd配置文件中设置全局变量 String param0 = (String) this.getOption("param0"); System.out.println("配置文件的参数为:"+param0);}}

由于我们下面还有一个HandlerChain的实验,所以这里再写一个类,TheHandler2.java,功能实现是一样一样的~

package com.demo.action;import org.apache.axis.AxisFault;import org.apache.axis.MessageContext;import org.apache.axis.handlers.BasicHandler;public class TheHandler2 extends BasicHandler {/** * 继承axis1的BasicHandler,设置全局变量,该类类似于web中的lister类,自动运行 */private static final long serialVersionUID = 3423234116214630747L;private static int SUM_COUNT = 0;public void invoke(MessageContext arg0) throws AxisFault {// TODO Auto-generated method stubSUM_COUNT++;//更新服务的总访问次数System.out.print("TheHandler2-服务被访问的次数为:"+SUM_COUNT+"  ");//还可以在wsdd配置文件中设置全局变量 String param0 = (String) this.getOption("param0"); System.out.println("配置文件的参数为:"+param0);}}


编写wsdd发布文件,和一般服务不同的是,Handler的声明比较简单

<handler name="自定义" type="类路径">,可以有常量设置,<paramter name="" value="">

而调用的方法分为<requestFlow>即服务被请求,<responseFlow>即响应外部请求


<?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">        <!-- 定义handler和常量 -->    <handler name="TheHandler" type="java:com.demo.action.TheHandler">        <parameter name="param0" value="testParam" />    </handler>    <handler name="TheHandler2" type="java:com2.demo.action.TheHandler">        <parameter name="param0" value="testParam" />    </handler>            <service name="TheUserWsddAction" provider="java:RPC">        <requestFlow>     <!-- 外部请求时调用handler-其他服务会自动触发这个 -->            <handler type="TheHandler"/>        </requestFlow>                <parameter name="className" value="com.demo.action.TheUserWsddAction" />        <!-- * 代表所有的方法都暴露 -->        <parameter name="allowedMethods" value="*" />        <parameter name="scope" value="request" />         <!-- 这里的urn:TheUser和new QName("urn:TheUser", "TheUser")这里是对应的 -->        <beanMapping qname="myNSD:TheUser" xmlns:myNSD="urn:TheUser" languageSpecificType="java:com.demo.model.TheUser"/>            <!-- 响应外部请求时调用handler-其他服务会自动触发这个 -->         <responseFlow>            <handler type="TheHandler"/>        </responseFlow>    </service>             </deployment>

(    

       使用wsdd发布命令,在wsdd文件目录下运行下面的命令。

发布的命令:java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient -l http://localhost:8080/webserviceAxis1/services/HelloWSDD  deployfz.wsdd

        去除服务的命令:java org.apache.axis.client.AdminClient undeploy.wsdd -l http://localhost:8080/webserviceAxis1/servlet/AxisServlet undeploy.wsdd


       undeploy.wsdd的内容请看文章最后的终极版


发布后调用 service名字为TheUserWsddAction的方法


控制台打印


再运行一次


访问次数累加,

过程是,第一次:进1,出2

第二次,进3,出4

累加


然后运行undeploy.wsdd把服务去除,因为要运行handlerChain,避免混乱


4、HandlerChain的编写、发布、调用配置和运行效果

TheHandlerChain.java,继承了 SimpleChain.java

package com.demo.action;import org.apache.axis.SimpleChain;public class TheHandlerChain extends SimpleChain {/** *  */private static final long serialVersionUID = 195605837725263130L;public TheHandlerChain() {TheHandler theHandler =new TheHandler();TheHandler2 theHandler2 =new TheHandler2();this.addHandler(theHandler);this.addHandler(theHandler2);}}



发布文件

发布handlerChain有两个思路,1:a是handler,a是chain,2:a是handlerchain

在调用上则没有差异,声明式chain调用即可

<?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">         <!-- 声明handlerChain的两个思路,1:a是handler,a是chain,2:a是handlerchain-->    <!-- 1 -->    <!--<handler name="HandlerChainF" type="java:com.demo.action.TheHandlerChain"/>        <chain name="HandlerChain">        <handler type="HandlerChainF"/>    </chain>            --><!-- 2 -->    <chain name="HandlerChain">    <parameter name="param0" value="testParam" />        <handler type="java:com.demo.action.TheHandlerChain"/>    </chain>        <service name="TheUserWsddAction" provider="java:RPC">     <requestFlow>     <!-- 外部请求时调用handler-其他服务会自动触发这个 -->            <chain  type="HandlerChain"/>        </requestFlow>                <parameter name="className" value="com.demo.action.TheUserWsddAction" />        <!-- * 代表所有的方法都暴露 -->        <parameter name="allowedMethods" value="*" />        <parameter name="scope" value="request" />         <!-- 这里的urn:TheUser和new QName("urn:TheUser", "TheUser")这里是对应的 -->        <beanMapping qname="myNSD:TheUser" xmlns:myNSD="urn:TheUser" languageSpecificType="java:com.demo.model.TheUser"/>            <!-- 响应外部请求时调用handler-其他服务会自动触发这个 -->         <responseFlow>            <chain  type="HandlerChain"/>        </responseFlow>    </service>             </deployment>


发布:java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient -l http://localhost:8080/webserviceAxis1/services/HelloWSDD deployHandlerChain.wsdd


运行调用:(服务器重启)



进:1和1,出2和2





5、undeploy.wsdd终极版

<undeployment xmlns="http://xml.apache.org/axis/wsdd/"><!-- 去除service -->    <service name="HelloWorldWSDD"/>    <service name="TheUserWsddAction"/>     <!-- 去除handler-不要发布不存在的handler一单被使用只能到server-config.wsdd修改文件了 -->     <handler name="TheHandler2"></handler>     <handler name="TheHandler"></handler>     <!--去除handlerChain-->     <chain name="HandlerChain"></chain></undeployment>




0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 如果死者托梦说自己过的不好怎么办 吵架了老婆跑回娘家不回家了怎么办 和老婆吵架她跑回娘家了怎么办 鞋子里面的皮穿的都是泥怎么办 绝地求生手游模拟器键位不灵怎么办 我更新目录的时候目录不存在怎么办 如果别人欠我钱不还 我该怎么办 老婆欠信用卡的钱我该怎么办 我欠了很多钱我该怎么办 一个人欠我钱跑了我该怎么办 买房子时间长了成危楼了怎么办 别人欠我钱人找不到了怎么办 欠银行信用卡钱人失踪了怎么办 欧洲卡车模拟2没油了怎么办 蓝牙安装包里没有微信怎么办 腾讯手游模拟器玩全军出击卡怎么办 手游cf用模拟器画面很抖怎么办 腾讯手游助手模拟器游戏卡死怎么办 腾讯手游模拟器提示注册以满怎么办 手游绝地求生被检测成模拟器怎么办 腾讯手游助手模拟器内存不够怎么办 微信视频对方听不到我的声音怎么办 学生考试传纸条作弊老师应怎么办 苹果手机微信小游戏没有声音怎么办 红米手机游戏下好了安装不了怎么办 小米手机sd卡存储已满怎么办 英雄联盟峡谷之巅资格被收回怎么办 人进监狱之前信用卡没还怎么办 荒野行动资源文件下载卡住了怎么办 荒野行动绑定的手机号停机了怎么办 不小心误点了爱奇艺扣款了怎么办 和别人吵架别人先骂你怎么办 自己人被带到了缅甸黑社会了怎么办 绝地求生忘记复制钥匙激活码怎么办 绝地求生买的钥匙激活码丢了怎么办 蓝河奶粉宝宝吃了不长肉怎么办 苹果ios版本太低激活不了怎么办 脸上被油烫伤了 起了水泡怎么办 皮肤被油烫伤起来个水泡怎么办 去泰国旅游没来得及兑换泰铢怎么办 游戏和安卓 不和 出现黑屏怎么办