一、WebService的开发手段
1、 使用Java JDK开发(1.6及以上版本)
2、使用CXF框架开发(工作中)
3、使用Xfire框架开发
视频学习参见:https://ke.qq.com/course/28875 视频连接
================================================================
1.利用Java JDK开发----主要是 javax.jws.* 包中的利用
参考案例:
以上是根据网络访问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框架开发(工作中)
案例参考:
二、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
============================================================================
作为客户端还可以——1、ajax 2、Jquery 3、HttpUrlConnection ——> 请求服务端
1、ajax 2、Jquery这两种是在前台请求服务端,会出现“跨域请求”问题。
以上两种参考:视屏学习(第17、18、19节)
1、ajax:(利用xmlHttp )
2、Jquery:
3、HttpUrlConnection: