欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

初学webservices二 博客分类: ws wsdlwebservicesaxisjavahandler 

程序员文章站 2024-02-28 21:10:40
...
  前面我介绍了我使用webServices的一个过程,接下来更多了解一下。
  
  WSDL:web service Description Language, 基于xml的web服务描述语言,就是将自己所要发布的服务描述出来,如功能,参数,路径等。这是一套标准的方法,外界可以根据它,清楚的指导它所提供的服务。
  SOAP:simple object access protocol,简单对象访问协议,一种标准化得传输消息的xml消息格式,通过此协议来调用web服务。
  UDDI:Universal Description,Discovery and Integration,通用描述,发现和集成服务,简单的来说就是一个服务的公共网址,大家把web服务在这里注册发布,给外界的人查找并使用。这个可有可无,直接把wsdl发给需要的人就可以了。

  有时大家觉得wsdl文件难得写,不如直接生成。
  1,编写你要发布的服务,如我前面提到的功能类。
  2,生成wsdl文件
  3,编写deploy.wsdd文件
  4,发布服务,生成server-config文件
  5,和前面一样

  第一步:这里就把功能类作为了服务给发布出去了。前面是使用到的自动生成的服务框架代码。这里也不用担心你经常改变方法类容导致wsdl文件变化,wsdl只是提供一个服务接口,所以你也只要把方法名,参数定义好就可以了,这些不变,你的wsdl内容也不变
  第二步:
 
java org.apache.axis.wsdl.Java2WSDL -o hello.wsdl -l http://localhost:8080/axis/services/HelloServicePortType -n HelloServicePortType com.localFunction.LocalFunction.HelloHelp  

  后面步骤就和前面一样了,只是这里要自己去些deploy.wsdd

  我总觉的还是使用服务框架好,让功能类脱离出去,作为本地类,而不是发布服务。其实得到wsdl后,就可以按前面的步骤去做,这样就好了。

   在webservice应用过程中,还有一个需要自己编写,那就是handler类了。handler作用如同filter一样。

   Handler是接口,我们一般都是继承它的抽象类BasicHandler。
   如:
  
	public void invoke(MessageContext messagecontext) throws AxisFault {
	System.out.println("call hanlder");	
	}
   

Handler要起作用,必须在server-config里面配置。这里又二种配法,意思就和全局变量和局部变量。
   局部如:
	<service name="HelloServiceHttpPort" provider="java:RPC" style="document" use="literal">
         ...
         <requestFlow>
<handler name="a" type="java:com.webService.handler.TestHandler" />
</requestFlow>
         </service>

局部就是把handler配置在你的service里面,其它service就不能引用你的handler,只能这个service用。
   全局如:
</globalConfiguration>
<handler name="a" type="java:com.webService.handler.TestHandler" />
<service name="HelloServiceHttpPort" provider="java:RPC" style="document" use="literal">
         ...
  <requestFlow>
<handler name="a" />
</requestFlow>
         </service>
  

全局就是配置在service外面,注意也不是在globalConfiguration里面。

handler如filter一样,可以处理请求前,请求后,requestFlow代表的就是请求前,responseFlow自然是请求后,具体看你在server-config里面怎么配置。axis的handler中的involve方法并没管你是请求前,请求后,具体看你是怎么配置。如果我想在一个handler里面既有请求前和请求后怎么做了?那就直接实现java自带jax-rpc的hanlder,可以看到handleRequest,handleResponse二个方法。但是你使用的axis发布的,它只支持axis的handler,所以你直接配置在server-config里面就会报错,所以需要引用到axis的AXRPCHandler,它会处理好

<requestFlow>
<handler  type="java:org.apache.axis.handlers.JAXRPCHandler">
				<parameter name="className" value="com.webService.handler.HelloHandler" />
			</handler>
		</requestFlow>

		<responseFlow>
			<handler  type="java:org.apache.axis.handlers.JAXRPCHandler">
				<parameter name="className" value="com.webService.handler.HelloHandler" />
			</handler>
		</responseFlow>


服务端通过server-config可以配置好handler,可是客户端没有配置文件,该怎么做?axis的Call中有call.setClientHandlers(reqHandler, respHandler);方法,可以很好的处理好客户端方面的handler操作。

说了这么多Handler有什么用了?参考别人的:
•对客户端进行认证、授权;
•把用户的访问写入系统日志;
•对请求的SOAP消息进行加密,解密;
•为Web Services对象做缓存。
这上面将的很详细http://www.ibm.com/developerworks/cn/webservices/ws-handler/index.html

  上面附带了工程,还是使用的原来的工程。