简单的WebService实现- cxf
2015-05-29 10:47
471 查看
1 简介
2 普通实现
2.1 定义WebService类
2.2 创建服务端
2.3 创建客户端
3 基于Spring的实现
3.1 定义WebService类
3.2 创建服务端
3.3 创建客户端
Service:它是对应WebService服务类及其操作的抽象代表,包括数据绑定类型、正在使用的拦截器等其他信息。
Endpoint:它可以接收消息,其主要功能是持有拦截器,并且可以监听出现的错误,客户端和服务端都需要使用到Endpoint。
Server:服务端的代表。提供可以开始/结束Server、访问Endpoint的钩子。
Client:客户端的代表,可以管理客户端的消息。
Cxf还有四个主要的帮忙创建服务端和客户端的工厂类:
AbstractServiceFactoryBean:它主要负责从一个WSDL文件或者class文件创建对应的Service,同时也可以设置一些数据绑定、拦截器等信息。它通常是藏在Server/ClientFactoryBean后面工作的,我们不会直接去使用它。常用的类有ReflectionServiceFactoryBean、JaxWsServiceFactoryBean。
ServerFactoryBean:创建Server端,常用的类有ServerFactoryBean、JaxWsServerFactoryBean。
ClientFactoryBean:创建Client端,常用的类有ClientFactoryBean、JaxWsClientFactoryBean。
ClientProxyFactoryBean:根据Client创建一个代理类,常用的类有ClientProxyFactoryBean、JaxWsProxyFactoryBean。
Java代码
public interface HelloWorld {
public String sayHi(String who);
}
Java代码
public class HelloWorldImpl implements HelloWorld {
@Override
public String sayHi(String who) {
return "Hi, " + who;
}
}
Java代码
public class Server {
private final static String ADDRESS = "http://localhost:8080/test/services/HelloWorld";
public static void main(String args[]) {
HelloWorld hw = new HelloWorldImpl();
ServerFactoryBean sfb = new ServerFactoryBean();
sfb.setAddress(ADDRESS);//webService对应的访问地址
sfb.setServiceClass(HelloWorld.class);//指定webService服务类型
sfb.setServiceBean(hw);//webService对应的bean对象
sfb.create();//这样就创建了一个webService的服务端
}
}
这样我们就把HelloWorldImpl发布为一个WebService了,地址为http://localhot:8080/test/services/HelloWorld。接下来我们在浏览器里面输入http://localhost:8080/test/services/HelloWorld?wsdl就可以查看该服务对应的WSDL文件了。通过http://localhost:8080/test/services/HelloWorld我们可以在客户端访问到其对应的Service及其操作。接下来我们来看看客户端如何创建。
Java代码
public class Client {
private final static String ADDRESS = "http://localhost:8080/test/services/HelloWorld";
public static void main(String args[]) {
ClientProxyFactoryBean cfb = new ClientProxyFactoryBean();
cfb.setAddress(ADDRESS);//指定发送请求的webService地址
cfb.setServiceClass(HelloWorld.class);//指定webService对应的接口
HelloWorld hw = (HelloWorld)cfb.create();//创建一个针对WebService对应接口的代理类
String response = hw.sayHi("world");//调用代理类的对应方法,发送相关请求到对应Server
System.out.println(response);
}
}
有了针对于WebService的代理类后,我们就可以通过该代理类访问WebService公布的对应方法进行相关操作了。客户端代理类在对WebService进行相关操作时并不是直接的对该WebService进行了操作,而是把请求操作封装为对应的信息发送给WebService发布的地址。WebService服务端在接收到对应的消息后把它解析为对应的参数和操作,之后在服务端对WebService进行操作,之后再将返回值封装为对应信息返回给客户端。客户端解析后返回给代理类。整个过程就是这样进行的。
Java代码
public interface HelloWorld {
public String sayHi(String who);
}
Java代码
public class HelloWorldImpl implements HelloWorld {
@Override
public String sayHi(String who) {
return "Hi, " + who;
}
}
Xml代码
<web-app version="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"> <display-name>Archetype Created Web Application</display-name>
<servlet>
<display-name>cxf</display-name>
<servlet-name>cxf</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
<load-on-startup>1</load-on-startup>
<init-param>
<param-name>config-location</param-name>
<param-value>WEB-INF/cxf-servlet.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>cxf</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
</web-app>
在web.xml文件中定义了CXFServlet之后,在Web容器启动的时候,CXFServlet默认会到WEB-INF目录下寻找名叫cxf-servlet.xml的配置文件中定义的WebService进行发布。如果不想CXFServlet在默认位置寻找默认配置文件,我们可以通过CXFServlet的init-param指定参数config-location的值为配置文件的位置。
配置好CXFServlet之后,我们来定义我们的cxf-servlet.xml。cxf-servlet.xml文件的写法是基于Spring的bean配置文件来的。这里我们定义如下:
Xml代码
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:simple="http://cxf.apache.org/simple"
xmlns:soap="http://cxf.apache.org/bindings/soap"
xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://cxf.apache.org/bindings/soap http://cxf.apache.org/schemas/configuration/soap.xsd http://cxf.apache.org/simple http://cxf.apache.org/schemas/simple.xsd">
<simple:server id="helloWorld" serviceClass="com.tiantian.cxftest.sample.simple.HelloWorld" address="/HelloWorld">
<simple:serviceBean>
<bean class="com.tiantian.cxftest.sample.simple.HelloWorldImpl" />
</simple:serviceBean>
</simple:server>
</beans>
在上述文件中我们引入了简单WebService的simple命名空间。该命名空间下主要有两个元素,simple:server和simple:client。Server用于服务端,client用于客户端。上述的address是基于CXFServlet的url-pattern来的。
第一种:
先在配置文件中加上simple的命名空间,之后通过simple:client来定义一个WebService的客户端。这里我们在类路径的根目录下定义一个cxf-client.xml文件,其内容如下所示:
Xml代码
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:simple="http://cxf.apache.org/simple"
xmlns:soap="http://cxf.apache.org/bindings/soap"
xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://cxf.apache.org/bindings/soap http://cxf.apache.org/schemas/configuration/soap.xsd http://cxf.apache.org/simple http://cxf.apache.org/schemas/simple.xsd">
<simple:client id="helloWorld"
serviceClass="com.tiantian.cxftest.sample.simple.HelloWorld" address="http://localhost:8080/test/services/HelloWorld" />
</beans>
第二种:
Xml代码
<!-- ClientProxyFactoryBean -->
<bean id="factoryBean" class="org.apache.cxf.frontend.ClientProxyFactoryBean">
<property name="address" value="http://localhost:8080/test/services/HelloWorld"/>
<property name="serviceClass" value="com.tiantian.cxftest.sample.simple.HelloWorld"/>
</bean>
<bean id="hw" factory-bean="factoryBean" factory-method="create"/>
之后我们就可以把它当做一个普通的Spring bean对象来使用了。如:
Java代码
public class SpringClient {
public static void main(String args[]) {
ApplicationContext context = new ClassPathXmlApplicationContext("cxf-client.xml");
HelloWorld hw = context.getBean("helloWorld", HelloWorld.class);
String response = hw.sayHi("world");
System.out.println(response);
System.out.println(context.getBean("hw", HelloWorld.class).sayHi("HelloWorld"));
}
}
2 普通实现
2.1 定义WebService类
2.2 创建服务端
2.3 创建客户端
3 基于Spring的实现
3.1 定义WebService类
3.2 创建服务端
3.3 创建客户端
1 简介
Cxf有四个主要的类:Service:它是对应WebService服务类及其操作的抽象代表,包括数据绑定类型、正在使用的拦截器等其他信息。
Endpoint:它可以接收消息,其主要功能是持有拦截器,并且可以监听出现的错误,客户端和服务端都需要使用到Endpoint。
Server:服务端的代表。提供可以开始/结束Server、访问Endpoint的钩子。
Client:客户端的代表,可以管理客户端的消息。
Cxf还有四个主要的帮忙创建服务端和客户端的工厂类:
AbstractServiceFactoryBean:它主要负责从一个WSDL文件或者class文件创建对应的Service,同时也可以设置一些数据绑定、拦截器等信息。它通常是藏在Server/ClientFactoryBean后面工作的,我们不会直接去使用它。常用的类有ReflectionServiceFactoryBean、JaxWsServiceFactoryBean。
ServerFactoryBean:创建Server端,常用的类有ServerFactoryBean、JaxWsServerFactoryBean。
ClientFactoryBean:创建Client端,常用的类有ClientFactoryBean、JaxWsClientFactoryBean。
ClientProxyFactoryBean:根据Client创建一个代理类,常用的类有ClientProxyFactoryBean、JaxWsProxyFactoryBean。
2 普通实现
2.1 定义WebService类
对于服务端而言,我们首先要准备一个我们需要发布为WebService的类,而这个类通常是基于某个接口的。所以首先我们先在服务端定义一个接口及其实现类。Java代码
public interface HelloWorld {
public String sayHi(String who);
}
Java代码
public class HelloWorldImpl implements HelloWorld {
@Override
public String sayHi(String who) {
return "Hi, " + who;
}
}
2.2 创建服务端
上面我们已经定义好了需要发布为WebService的接口HelloWorld及其实现类HelloWorldImpl。接下来我们需要把它发布为一个WebService。Java代码
public class Server {
private final static String ADDRESS = "http://localhost:8080/test/services/HelloWorld";
public static void main(String args[]) {
HelloWorld hw = new HelloWorldImpl();
ServerFactoryBean sfb = new ServerFactoryBean();
sfb.setAddress(ADDRESS);//webService对应的访问地址
sfb.setServiceClass(HelloWorld.class);//指定webService服务类型
sfb.setServiceBean(hw);//webService对应的bean对象
sfb.create();//这样就创建了一个webService的服务端
}
}
这样我们就把HelloWorldImpl发布为一个WebService了,地址为http://localhot:8080/test/services/HelloWorld。接下来我们在浏览器里面输入http://localhost:8080/test/services/HelloWorld?wsdl就可以查看该服务对应的WSDL文件了。通过http://localhost:8080/test/services/HelloWorld我们可以在客户端访问到其对应的Service及其操作。接下来我们来看看客户端如何创建。
2.3 创建客户端
客户端我们是通过ClientProxyFactoryBean针对于WebService发布的地址及其接口生成一个代理类。Java代码
public class Client {
private final static String ADDRESS = "http://localhost:8080/test/services/HelloWorld";
public static void main(String args[]) {
ClientProxyFactoryBean cfb = new ClientProxyFactoryBean();
cfb.setAddress(ADDRESS);//指定发送请求的webService地址
cfb.setServiceClass(HelloWorld.class);//指定webService对应的接口
HelloWorld hw = (HelloWorld)cfb.create();//创建一个针对WebService对应接口的代理类
String response = hw.sayHi("world");//调用代理类的对应方法,发送相关请求到对应Server
System.out.println(response);
}
}
有了针对于WebService的代理类后,我们就可以通过该代理类访问WebService公布的对应方法进行相关操作了。客户端代理类在对WebService进行相关操作时并不是直接的对该WebService进行了操作,而是把请求操作封装为对应的信息发送给WebService发布的地址。WebService服务端在接收到对应的消息后把它解析为对应的参数和操作,之后在服务端对WebService进行操作,之后再将返回值封装为对应信息返回给客户端。客户端解析后返回给代理类。整个过程就是这样进行的。
3 基于Spring的实现
3.1 定义WebService类
基于Spring的简单WebService实现也需要我们定义需要发布为WebService的类。这里跟上面一样,我们定义如下:Java代码
public interface HelloWorld {
public String sayHi(String who);
}
Java代码
public class HelloWorldImpl implements HelloWorld {
@Override
public String sayHi(String who) {
return "Hi, " + who;
}
}
3.2 创建服务端
基于Spring的服务端是通过配置文件来进行的。首先我们需要在web.xml文件中定义一个CXFServlet,用于拦截WebService请求。Xml代码
<web-app version="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"> <display-name>Archetype Created Web Application</display-name>
<servlet>
<display-name>cxf</display-name>
<servlet-name>cxf</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
<load-on-startup>1</load-on-startup>
<init-param>
<param-name>config-location</param-name>
<param-value>WEB-INF/cxf-servlet.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>cxf</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
</web-app>
在web.xml文件中定义了CXFServlet之后,在Web容器启动的时候,CXFServlet默认会到WEB-INF目录下寻找名叫cxf-servlet.xml的配置文件中定义的WebService进行发布。如果不想CXFServlet在默认位置寻找默认配置文件,我们可以通过CXFServlet的init-param指定参数config-location的值为配置文件的位置。
配置好CXFServlet之后,我们来定义我们的cxf-servlet.xml。cxf-servlet.xml文件的写法是基于Spring的bean配置文件来的。这里我们定义如下:
Xml代码
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:simple="http://cxf.apache.org/simple"
xmlns:soap="http://cxf.apache.org/bindings/soap"
xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://cxf.apache.org/bindings/soap http://cxf.apache.org/schemas/configuration/soap.xsd http://cxf.apache.org/simple http://cxf.apache.org/schemas/simple.xsd">
<simple:server id="helloWorld" serviceClass="com.tiantian.cxftest.sample.simple.HelloWorld" address="/HelloWorld">
<simple:serviceBean>
<bean class="com.tiantian.cxftest.sample.simple.HelloWorldImpl" />
</simple:serviceBean>
</simple:server>
</beans>
在上述文件中我们引入了简单WebService的simple命名空间。该命名空间下主要有两个元素,simple:server和simple:client。Server用于服务端,client用于客户端。上述的address是基于CXFServlet的url-pattern来的。
3.3 创建客户端
基于Spring的客户端的写法也是定义一个配置文件,类似于Spring的配置文件,然后把我们的WebService定义成一个普通的Spring bean对象。这主要有两种方式:第一种是通过simple命名空间来定义,第二种是通过ClientProxyFactoryBean来定义。第一种:
先在配置文件中加上simple的命名空间,之后通过simple:client来定义一个WebService的客户端。这里我们在类路径的根目录下定义一个cxf-client.xml文件,其内容如下所示:
Xml代码
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:simple="http://cxf.apache.org/simple"
xmlns:soap="http://cxf.apache.org/bindings/soap"
xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://cxf.apache.org/bindings/soap http://cxf.apache.org/schemas/configuration/soap.xsd http://cxf.apache.org/simple http://cxf.apache.org/schemas/simple.xsd">
<simple:client id="helloWorld"
serviceClass="com.tiantian.cxftest.sample.simple.HelloWorld" address="http://localhost:8080/test/services/HelloWorld" />
</beans>
第二种:
Xml代码
<!-- ClientProxyFactoryBean -->
<bean id="factoryBean" class="org.apache.cxf.frontend.ClientProxyFactoryBean">
<property name="address" value="http://localhost:8080/test/services/HelloWorld"/>
<property name="serviceClass" value="com.tiantian.cxftest.sample.simple.HelloWorld"/>
</bean>
<bean id="hw" factory-bean="factoryBean" factory-method="create"/>
之后我们就可以把它当做一个普通的Spring bean对象来使用了。如:
Java代码
public class SpringClient {
public static void main(String args[]) {
ApplicationContext context = new ClassPathXmlApplicationContext("cxf-client.xml");
HelloWorld hw = context.getBean("helloWorld", HelloWorld.class);
String response = hw.sayHi("world");
System.out.println(response);
System.out.println(context.getBean("hw", HelloWorld.class).sayHi("HelloWorld"));
}
}
相关文章推荐
- P124.40
- C#unix时间戳转换
- Android 开发工具类 18_NetWorkUtil
- Windows下Python科学计算开发环境搭建
- 19_利用android提供的HanziToPinyin工具类实现汉字与拼接的转换
- windows 下使用jetty-distribution-9.2.9.v2
- android判断网络是否可用
- Spring注解@Component、@Repository、@Service、@Controller区别
- 使用python在wordpress博客网站添加新文章示例
- .net 发布mvc报错:403.14-Forbidden Web 服务器被配置为不列出此目录的内容
- 静态路由配置2
- MySQL slave_net_timeout参数解决的一个集群问题案例
- HTML5中meta属性的使用详解
- JAVA的StringBuffer类
- 堆、堆栈与数据结构中的堆
- HDOJ 2081 手机短号
- VMware虚拟机上网络连接(network type)的三种模式--bridged、host-only、NAT
- IOS学习之蓝牙4.0
- 第四章 栈与队列
- 详解JavaScript中的this