Java Web Service
2015年7月16日
1 目标:提供方法共享,由网络进行交互。
其它的网站或应用在线调用。
网站或应用可以专注于核心功能,而其它功能使用web服务。
2 原理:服务器提供WEB服务与客户端使用SOAP协议交互,HTTP通信。
SOAP协议交互:AXIS、CXF提供。
WEB服务:Java实现。
HTTP通信:Tomcat。
为了解耦web服务与传输方法,AXIS、CXF与HTTP是独立设计的。
WSDL提供xml格式的使用说明。
3 方法:SOAP+CXF+Tomcat。
参考:http://www.widecodes.com/0SxeqjPWqj/cxf-vs-axis-big-xml-over-soap.html
http://5148737.blog.51cto.com/5138737/1604472
3.1 SOAP协议:Simple Object Acess Protocal,简单对象访问协议。
目标:以XML为基础进行数据交换。
方法:CXF(推荐),AXIS。
3.2 方法:CXF(推荐),功能最强大,使用简单,开发效率高,直接与Spring结合。
目标:将HTTP协议与SOAP协议互换,提供Servlet进行服务,生成soap响应。
原理:CXF生成框架(提供将标准POJO转换为servlet,以及SOAP协议转换功能),只需提供POJO服务。
方法:CXF+Spring+Tomcat
3.2.1方法:CXF框架,将CXF框架需要的库(cxf的lib)copy到目标应用lib中。
3.2.2生成POJO服务类
由于使用spring,提供服务的接口和实现类。将class文件copy到web应用的class中。
HelloWorld.java
package cxf.test;
import javax.jws.WebService;
@WebService
public interface HelloWorld
{
// 一个简单的方法,返回一个字符串
String say(String hello);
}
HelloWorldImpl.java
package cxf.test;
importjavax.jws.WebService;
// WebService实现类.
// 使用@WebService指向Interface定义类即可.
@WebService(endpointInterface= "cxf.test.HelloWorld")
public class HelloWorldImplimplements HelloWorld
{
@Override
public String say(String hello)
{
return "hello " + hello;
}
}
3.2.3方法:发布WEB服务:配置 Spring+Tomcat。
参考:http://blog.csdn.net/yuvmen/article/details/4790854
3.2.3.1 配置spring:beans.xml。
<?xmlversion="1.0" encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="
http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/jaxwshttp://cxf.apache.org/schemas/jaxws.xsd">
<importresource="classpath:META-INF/cxf/cxf.xml" />
<importresource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
<importresource="classpath:META-INF/cxf/cxf-servlet.xml" />
<jaxws:endpoint id="webServiceHelloWorld"
address="/HelloWorld"
implementor="cxf.test.HelloWorldImpl"/>
</beans>
3.2.3.2 配置servlet:web.xml。
<?xmlversion="1.0" encoding="UTF-8"?>
<web-appversion="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/beans.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<servlet>
<servlet-name>CXFServlet</servlet-name>
<servlet-class>
org.apache.cxf.transport.servlet.CXFServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CXFServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
</web-app>
3.2.4发送WEB请求:weburl?wsdl
3.2.5客户端调用web服务:
目标:使用web服务的共享方法。
原理:从WEB服务的WSDL中获取接口信息,并以此接口创建本地类,类的实现从web服务中获取结果。客户端直接使用本地类POJO。
参考:http://blog.csdn.net/yuvmen/article/details/4790854
方法:创建本地接口,生成web服务本地类,客户端正常调用。
3.2.5.1 创建本地接口:由WSDL生成。使用wsdl2java(位于cxf的bin目录)生成java接口。将生成多个java文件,只需copy接口java到客户端。
格式:
-p 指定其wsdl的命名空间,也就是要生成代码的包名
-d 指定要产生代码所在目录
-client 生成客户端测试web service的代码
-server 生成服务器启动web service的代码
-impl 生成web service的实现代码
-ant 生成build.xml文件
-compile 生成代码后编译
-quient 静默模式,不输出警告与错误信息
-all 生成所有开始端点代码:types,service proxy,serviceinterface, server mainline, client mainline, implementation object, and an Antbuild.xml file.
3.2.5.2 配置Spring Beans:
<?xmlversion="1.0" encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="
http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/jaxwshttp://cxf.apache.org/schema/jaxws.xsd">
<bean id="client" class="cxf.test.HelloWorld"
factory-bean="clientFactory"factory-method="create"/>
<bean id="clientFactory"class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
<property name="serviceClass"value="cxf.test.HelloWorld"/>
<propertyname="address"value="http://localhost:8080/cxf2/services/HelloWorld"/>
</bean>
</beans>
3.2.5.3 生成web服务本地类供客户端调用:
package cxf.test;
importorg.springframework.context.support.ClassPathXmlApplicationContext;
import cxf.test.HelloWorld;// necessary
public final class Client {
private Client() { }
public static void main(String args[])throws Exception {
ClassPathXmlApplicationContext context = newClassPathXmlApplicationContext(new String[]{"cxf/test/client-beans.xml"});
HelloWorld client =(HelloWorld)context.getBean("client");
String response =client.say("Joe");
System.out.println("Response:" + response);
System.exit(0);
}
}
3.3 AXIS:配置复杂
AXIS1,AXIS2:比较早的web服务实现,AXIS1功能简单,使用也较简单,但06年之后不再更新。Axis2虽然功能有加强,但操作太过复杂,文档也比较乱(CXF的一项特性就是:容易使用)。
目标:进行web服务的SOAP规范实现。
3.3.1方法:AXIS1的使用方法。
发布WEB服务:将axis文档copy到tomcat。将服务.java文件更名为.jws(不要使用包,使用包的配置更麻烦)放到axis下。
发送WEB请求:http://localhost:8080/axis/HelloService.jws?method=sayHello¶meter=xx
处理WEB响应:axis应用下的jws类。