Web Service之Chain的使用

2024-06-08 10:08
文章标签 使用 web service chain

本文主要是介绍Web Service之Chain的使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Web Service之Chain的使用

chain是若干个handler的集合(handler串)

       一个用户需要3个handler,另一个需要2个handler,它们共有1个相同的handler,如果分别都给予,就太浪费资源了,所以可以用chain来实现。

       service-----handler:解决方法是编写chain

 

先编写服务端程序:

 

publicclassHelloWorld {

   privateintrequestCount = 0 ;

   public String hello(Stringname){

     requestCount++ ;

     System.out.println("RequestCount="+ requestCount);

     System.out.println("you recevice name :"+ name);

     return"Hello "+ name ;

   }

}    

 

HelloWorldHandler.java

 

import org.apache.axis.AxisFault;

import org.apache.axis.MessageContext;

import org.apache.axis.handlers.BasicHandler;

 

publicclassHelloWorldHandler extends BasicHandler {

 

   publicvoid invoke(MessageContextmsgContext) throwsAxisFault {

     Stringstate = (String) this.getOption("state");

     System.out.println("此时调用的是第一个handler程序,获取的初始化参数是" + state);

   }

  

}

 

修改server-config.wsdd配置信息

<handlername="HelloWorldHandler"type="java:com.webservice.anni.HelloWorldHandler">

              <parametername="state" value="123" />

       </handler>

       <servicename="HelloWorld" provider="java:RPC">

              <parametername="className" value="com.webservice.anni.HelloWorld"/>

              <parametername="allowedMethods" value="*" />

              <requestFlow>

                     <handlertype="HelloWorldHandler" />

              </requestFlow>

              <responseFlow>

                     <handlertype="HelloWorldHandler" />

              </responseFlow>

       </service>

 

客户端程序为:

 

import javax.xml.namespace.QName;

import org.apache.axis.client.Call;

import org.apache.axis.client.Service;

 

publicclassTestClient {

 

   publicstaticvoid main(String[] args) throws Exception {

     //指定获取web服务的位置

     Stringurl = "http://localhost:8089/axis/services/HelloWorld" ;

     Serviceservice = newService() ;

     Callcall = (Call) service.createCall() ;

     call.setTargetEndpointAddress(new java.net.URL(url)) ;

     call.setOperationName(new QName(url,"hello"));

     StringreturnValue = (String) call.invoke(new Object[]{"Xin"}) ;

     System.out.println(returnValue);

   }

}

 

此时,会有如下结果:

 

此时调用的是第一个handler程序,获取的初始化参数是123

RequestCount=1

you recevice name :Xin

此时调用的是第一个handler程序,获取的初始化参数是123

 

再回到服务器端:编写:

import org.apache.axis.AxisFault;

import org.apache.axis.MessageContext;

import org.apache.axis.handlers.BasicHandler;

 

publicclassHelloWorldHandler2 extends BasicHandler {

 

   publicvoid invoke(MessageContextmsgContext) throwsAxisFault {

     Stringstate = (String) this.getOption("state");

     System.out.println("此时调用的是第二个handler2程序,获取的初始化参数是" + state);

   }

}

 

配置信息:

<handler name="HelloWorldHandler"type="java:com.webservice.anni.HelloWorldHandler">

              <parametername="state" value="123" />

       </handler>

       <handler name="HelloWorldHandler2"type="java:com.webservice.anni.HelloWorldHandler2">

              <parameter name="state"value="123" />

       </handler>

       <servicename="HelloWorld" provider="java:RPC">

              <parametername="className" value="com.webservice.anni.HelloWorld"/>

              <parametername="allowedMethods" value="*" />

              <requestFlow>

                     <handlertype="HelloWorldHandler" />

                     <handler type="HelloWorldHandler2" />

              </requestFlow>

              <responseFlow>

                     <handlertype="HelloWorldHandler" />

                     <handler type="HelloWorldHandler2" />

              </responseFlow>

</service>

 

运行客户端程序,显示的信息为:

 

此时调用的是第一个handler程序,获取的初始化参数是123

此时调用的是第二个handler2程序,获取的初始化参数是123

RequestCount=1

you recevice name :Xin

此时调用的是第一个handler程序,获取的初始化参数是123

此时调用的是第二个handler2程序,获取的初始化参数是123

 

 

现在把这两个过滤器组合在一起!

在服务端编写程序HelloWorldChain.java

 

import org.apache.axis.SimpleChain;

 

publicclassHelloWorldChain extends SimpleChain {

   //自定义handler

   public HelloWorldChain(){

     //调用需要使用的handler

     HelloWorldHandlerhandler1 = newHelloWorldHandler() ;

     HelloWorldHandler2handler2 = newHelloWorldHandler2() ;

     //将使用的handler放入chain

     this.addHandler(handler1) ;

     this.addHandler(handler2) ;

   }

}

 

配置信息为:

<handler name="HelloWorldHandler"type="java:com.webservice.anni.HelloWorldHandler">

              <parametername="state" value="123" />

       </handler>

       <handlername="HelloWorldHandler2"type="java:com.webservice.anni.HelloWorldHandler2">

              <parametername="state" value="123" />

       </handler>

 

       <chainname="HelloWorldChain">

              <handlertype="java:com.webservice.anni.HelloWorldHandler"/>

              <handlertype="HelloWorldHandler2"/>

       </chain>

 

       <servicename="HelloWorld" provider="java:RPC">

              <parametername="className" value="com.webservice.anni.HelloWorld"/>

              <parametername="allowedMethods" value="*" />

             

              <requestFlow>

                     <chaintype="HelloWorldChain" />

              </requestFlow>

              <responseFlow>

                     <chaintype="HelloWorldChain" />

              </responseFlow>

</service>

 

控制台显示的信息为:

 

此时调用的是第一个handler程序,获取的初始化参数是null

此时调用的是第二个handler2程序,获取的初始化参数是123

RequestCount=1

you recevice name :Xin

此时调用的是第一个handler程序,获取的初始化参数是null

此时调用的是第二个handler2程序,获取的初始化参数是123

 

这后面有点混乱,我自己都不是很明白。HelloWorldChain.java显得有点多余。配置信息的HelloWorldHandler参数也没能用上。

这篇关于Web Service之Chain的使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1041884

相关文章

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

在 Spring Boot 中使用 @Autowired和 @Bean注解的示例详解

《在SpringBoot中使用@Autowired和@Bean注解的示例详解》本文通过一个示例演示了如何在SpringBoot中使用@Autowired和@Bean注解进行依赖注入和Bean... 目录在 Spring Boot 中使用 @Autowired 和 @Bean 注解示例背景1. 定义 Stud

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

使用Python快速实现链接转word文档

《使用Python快速实现链接转word文档》这篇文章主要为大家详细介绍了如何使用Python快速实现链接转word文档功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 演示代码展示from newspaper import Articlefrom docx import

oracle DBMS_SQL.PARSE的使用方法和示例

《oracleDBMS_SQL.PARSE的使用方法和示例》DBMS_SQL是Oracle数据库中的一个强大包,用于动态构建和执行SQL语句,DBMS_SQL.PARSE过程解析SQL语句或PL/S... 目录语法示例注意事项DBMS_SQL 是 oracle 数据库中的一个强大包,它允许动态地构建和执行

SpringBoot中使用 ThreadLocal 进行多线程上下文管理及注意事项小结

《SpringBoot中使用ThreadLocal进行多线程上下文管理及注意事项小结》本文详细介绍了ThreadLocal的原理、使用场景和示例代码,并在SpringBoot中使用ThreadLo... 目录前言技术积累1.什么是 ThreadLocal2. ThreadLocal 的原理2.1 线程隔离2

Python itertools中accumulate函数用法及使用运用详细讲解

《Pythonitertools中accumulate函数用法及使用运用详细讲解》:本文主要介绍Python的itertools库中的accumulate函数,该函数可以计算累积和或通过指定函数... 目录1.1前言:1.2定义:1.3衍生用法:1.3Leetcode的实际运用:总结 1.1前言:本文将详