webService开发

一、WebService的开发手段

    1、 使用Java  JDK开发(1.6及以上版本)

    2、使用CXF框架开发(工作中)

             3、使用Xfire框架开发

视频学习参见:https://ke.qq.com/course/28875  视频连接

================================================================

1.利用Java  JDK开发----主要是 javax.jws.* 包中的利用

参考案例:

优先看案例1:JDK开发webService

                       案例2

以上是根据网络访问wsdl生成客户端请求代码,也可以根据本地的wsdl文件,生成客户端请求代码。

参照请求案例:根据本地wsdl文件生成client客户端


2、使用CXF框架开发(工作中)

(利用JDk发布的wsdl文档   与  cxf发布的wsdl文档    有区别!!

了解概念--cxf发布的  wsdl文档的结构:


与JDK发布webService类似,cxf发布需要在项目中加入apache-cxf-**.jar中的解压文件夹中lib内的所有jar.

我使用的jdk6.0---只能使用apache-cxf-2.7.7.jar.版本以下的。否则需要更高版本的jdk支持。

发布服务端webService:写法与jdk版本一致,

编写客户端调用webService:

1.在cmd终端中,

首先进入客户端工程的src文件夹路径,(cd  D:\WorkSpaces\MyCode\CXFWebService_client\src ), 在该路径下执行以下部分第2步:

再执行apache-cxf-**.jar中的解压文件夹中  bin  文件夹内:wsdl2java.bat指令自动编写客户端方法。

(cmd要想执行wsdl2java.bat指令,需要现在系统环境变量里配置path,值为:apache-cxf-2.7.7\bin的安装bin路径!)



2.终端中执行:

wsdl2java      http://192.168.1.8:8888/CXFWebService_service/hello?wsdl

【指令】      【服务端发布的wsdl路径url  或者:本地保存的来自服务端的wsdl文档】

-------------------------------------------------------------------------------------------------

注意:出现过的异常:The constructor Service(URL, QName, WebServiceFeature[]) is undefined

原因:CXF自带的javax.xml.service 版本高过 jdk的javax.xml.service。

            一个解决办法是: 在使用wsdl2java时,加入参数-frontend jaxws21

wsdl2java     -frontend jaxws21      http://192.168.1.8:8888/CXFWebService_service/hello?wsdl

【指令】          【可省略  】            【服务端发布的wsdl路径  或者:本地保存的来自服务端的wsdl文档】

==============================================================

2、使用XFire框架开发(工作中)

案例参考:

xfire开发webservice案例1

案例2

二、WebService 详解

-------------------------------------------------------------------------------------------------

Jdk——webService :支持通信的数据类型:除了Map不支持,其他支持如cxf。

cxf——webService :支持通信的数据类型:

            1.int,float,boolean等

            2.引用类型:String,集合:List,Set,Map

            3.自定义类型:User(自定义pojo等.......)

-------------------------------------------------------------------------------------------------

一次webservice请求相当于http(通信协议)+xml(通信方式)+schame(xml编写格式)的请求

1.一次webservice请求响应流程:

            client (请求)  —— 根据server服务端发布的wsdl+schame 转化成:xml  ——> server 服务器

                                  < —— 依据server服务端发布的wsdl+schame 转化成:xml  ——(响应)


2.面试题:

2.1webService是http+?+?请求?:http+  xml  + schema

2.2什么是wsdl:

是webService的定义语言,对应wsdl文档。一个webService对应唯一一个wsdl文档,是客户端与服务端的请求响应的数据格式跟过程。

2.3如何发布一个webService?

定义一个接口:@webserve,@webMethod,跟其实现类AImpl

发布:利用JDK、CXF,Endpoint.publish( 服务器wsdl的url , new 一个AImpl对象 );

2.4如何请求一个webService?

根据wsdl文档生成客户端代码(JDK、cxf)

根据生成的代码调用webService


3.CXF拦截器:

            分为:客户端拦截器  ,    服务端拦截器

            客户端拦截器又分为:拦截器   +   拦截器

            服务端拦截器又分为:拦截器   +   拦截器

            按定义者分:系统拦截器    、   自定义拦截器

        3.1给服务端发布webservice加:  入,出拦截器+日志拦截打印代码:

(服务端是先入,后出,所以日志打印Inbound Message入日志,后打印Outbound Message出日志)

package faBu;

import java.util.List;
import interfacer.impl.HelloImpl;
import javax.xml.ws.Endpoint;
import org.apache.cxf.interceptor.Interceptor;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxws.EndpointImpl;
import org.apache.cxf.message.Message;

public class MyService {

	public static void main(String[] args) {
		String address = "http://192.168.1.8:8888/CXFWebService_service/hello";
		/** 
		 * Endpoint.publish(address, implementor)方法:
		 * 参数1:服务的发布地址(即:被客户端访问的地址) 
		 * 参数2:服务的实现者 
		 */  
		Endpoint endpoint = Endpoint.publish(address, new HelloImpl());
		System.out.println(endpoint);
		//强转成impl实现类,endpointImpl才有很多方法得到    入拦截器   * 出拦截器
		EndpointImpl endpointImpl = (EndpointImpl) endpoint;
		
		//服务武器端的*入*拦截器-日志打印
		List<Interceptor<? extends Message>> inInterceptors = endpointImpl.getInInterceptors();
		inInterceptors.add(new LoggingInInterceptor());//LoggingInInterceptor-入日志拦截器
		
		//服务武器端的*出*拦截器-日志打印
		List<Interceptor<? extends Message>> outInterceptors = endpointImpl.getOutInterceptors();
		outInterceptors.add(new LoggingOutInterceptor());//LoggingOutInterceptor-出日志拦截器
		
		System.out.println("webservice服务(端)发布成功!");
	}
	
} 

注意核心代码://强转成impl实现类,endpointImpl才有很多方法得到    入拦截器   * 出拦截器

                EndpointImpl endpointImpl = (EndpointImpl) endpoint;


       3.2给客户端请求webservice服务加:  入,出拦截器+日志拦截打印代码:

(客户端是先出,后入,所以日志打印Outbound Message出日志,后打印Inbound Message入日志)

package client;

import java.util.List;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.interceptor.Interceptor;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.message.Message;

import interfacer.IHello;
import interfacer.impl.HelloImplService;

public class MyCxfClient {

	public static void main(String[] args) {
		HelloImplService hellofactory = new HelloImplService();
		
		IHello helloImpl = hellofactory.getHelloImplPort();
		
		//通过helloImpl实现类---得到客户端client:
		Client client = ClientProxy.getClient(helloImpl);

		//服务武器端的*入*拦截器-日志打印
		List<Interceptor<? extends Message>> inInterceptors = client.getInInterceptors();
		inInterceptors.add(new LoggingInInterceptor());//LoggingInInterceptor-入日志拦截器
		
		//服务武器端的*出*拦截器-日志打印
		List<Interceptor<? extends Message>> outInterceptors = client.getOutInterceptors();
		outInterceptors.add(new LoggingOutInterceptor());//LoggingOutInterceptor-出日志拦截器
		
		String serviceReturn = helloImpl.sayHello("TOM");
		
		System.out.println("服务端返回:"+serviceReturn);
	}
	
}
注意核心代码://通过helloImpl实现类---得到客户端client:
        Client client = ClientProxy.getClient(helloImpl);

三、CXF+Spring整合开发WebService:

代码:看自己MyCode代码。

1.服务器端:

1、新建web工程,然后lib导入cxf的jar包。

2、java代码中写接口service与其实现类:

代码结构:


并且配置:beans.xml,内容:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:jaxws="http://cxf.apache.org/jaxws"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    	http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
    	http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"
    xmlns="http://www.springframework.org/schema/beans">
   
   	<!-- 引入cxf的核心配置
   	(cxf3.0之后,去掉cxf-extension-soap.xml,或者三个xml都去掉都可以) 
   	-->
 	<import resource="classpath:META-INF/cxf/cxf.xml" /> 
	<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
	<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />

    <jaxws:endpoint 
	    	id="userService" 
	        implementor="service.UserServiceImpl"
			address="/user">
        <!-- 
	        <jaxws:serviceFactory>
	            <ref bean="jaxWsServiceFactoryBean" />
	        </jaxws:serviceFactory>
         -->
         
        <!-- 服务器端的  *入*拦截器-日志打印 -->
        <jaxws:inInterceptors> 
	        <bean class="org.apache.cxf.interceptor.LoggingInInterceptor"/>  
	    </jaxws:inInterceptors>
	   	<!-- 服务器端的  *出*拦截器-日志打印 -->
	    <jaxws:outInterceptors>
	        <bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"/>  
	    </jaxws:outInterceptors>
	    
    </jaxws:endpoint>
    <!--
	    <bean id="jaxWsServiceFactoryBean" 
	    	class="org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean">
	        <property name="wrapped" value="true" />
	    </bean>
     -->
     
</beans>


web.xml中配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>CxfPlusSpring_webService_service</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
    <display-name>cxfTest</display-name>  
    <!-- 配置cxf里的userBeans.xml ,  classpath:指根路径下 -->
    <context-param>  
        <param-name>contextConfigLocation</param-name>  
        <param-value>classpath:userBeans.xml</param-value>  
    </context-param>  
    <!-- 配置一个spring的监听 -->
    <listener>  
        <listener-class>  
            org.springframework.web.context.ContextLoaderListener     
        </listener-class>  
    </listener>  
    
    <!-- 配置CXFServlet -->
    <servlet>  
        <servlet-name>CXFServlet</servlet-name>  
        <servlet-class>  
            org.apache.cxf.transport.servlet.CXFServlet     
        </servlet-class>  
        <load-on-startup>1</load-on-startup>  
    </servlet>  
    <servlet-mapping>  
        <servlet-name>CXFServlet</servlet-name>  
        <url-pattern>/*</url-pattern>  <!-- 所有请求都会走cxf框架 -->
    </servlet-mapping>
    
</web-app>

服务器启动,加载启动顺序:

web.xml--->classpath:beans.xml(该配置中,配置了webservic服务的实现类、服务wsdl的url,l入出拦截器等......)webservice服务发布成功--->等待客户端请求,进入指定实现类进行业务。

2.客户端

1、新建工程,在cmd终端中,使用wsdl2ava  -frontend jaxws21 【服务端wsdl的url】生成客户端代码

2、代码结构:


3、配置client-beans.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:jaxws="http://cxf.apache.org/jaxws"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    	http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
    	http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"
    xmlns="http://www.springframework.org/schema/beans">
   
     <jaxws:client
	     id="userClient" 
	     serviceClass="service.UserService"
	     address="http://localhost:8080/CxfPlusSpring_webService_service/user">
     	<!-- address:就是服务端发布的wsdl地址(除去?wsdl) -->
     
	    <!-- 客户端的  *入*拦截器-日志打印 -->
        <jaxws:inInterceptors>  
	        <bean class="org.apache.cxf.interceptor.LoggingInInterceptor"/>  
	    </jaxws:inInterceptors>  
	   	<!-- 客户端的  *出*拦截器-日志打印 -->
	    <jaxws:outInterceptors>  
	        <bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"/>  
	    </jaxws:outInterceptors>  
	    
     </jaxws:client>
    
    
</beans>
4、客户端client -调用->服务端server代码:
package client;

import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import service.User;
import service.UserService;

public class myClient {
	
	public static void main(String[] args) {
		
		/**client-调用-  server 写法一:
		 * 利用ClassPathXmlApplicationContext,必须:
		 * 配置client-userBeans.xml:
		 * <jaxws:client
			     id="userClient" 
			     serviceClass="service.UserService"
			     address="http://localhost:8080/CxfPlusSpring_webService_service/user">
		     </jaxws:client>
		 */
		
		ClassPathXmlApplicationContext context = 
				new ClassPathXmlApplicationContext(new String("client-userBeans.xml"));
		
		UserService userService = (UserService) context.getBean("userClient");
		
		User user = userService.getUserById("24");
		
		System.out.println("来自服务端的返回User对象:"+user.toString());
		
		System.out.println("=====================================================================");
		
		/**client-调用-  server 写法二:
		 * 利用JaxWsProxyFactoryBean,无需配置文件!!!
		 * */
		JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
        factory.setServiceClass(UserService.class);
        factory.setAddress("http://localhost:8080/CxfPlusSpring_webService_service/user");
        
        UserService userService2 = (UserService)factory.create();

        User user2 = userService2.getUserById("001");
		
		System.out.println("来自服务端的返回User对象:"+user2.toString());

		
	}

}

================>

在java中使用spring整合cxf实现webservice案例参考:

案例1

案例2

案例3

============================================================================

作为客户端还可以——1、ajax     2、Jquery       3、HttpUrlConnection ——> 请求服务端

1、ajax     2、Jquery这两种是在前台请求服务端,会出现“跨域请求”问题。

以上两种参考:视屏学习(第17、18、19节)

1、ajax:(利用xmlHttp )

2、Jquery:

3、HttpUrlConnection:





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值