笔记:CXF与spring整合

来源:互联网 发布:c语言初始化顺序表 编辑:程序博客网 时间:2024/05/29 14:22

webService服务地址:http://www.webxml.com.cn

一:接收服务

步骤:得到服务地址----wsimport代理-------打jar包------放到项目中-------通过wsdl元素调用相关的方法得到数据

wsdl描述图:


- wsimport 命令的位置: 
  C:\Program Files\Java\jdk1.7.0_04\bin
- 要求:
 1. jdk的 版本要在 jdk 1.6.21及以上 
 2. 操作系统安装的jdk版本 与 MyEclispe 及 默认指定的版本要一致
- wsimport使用: 
 记得设置jdk\bin  环境变量  指定path 
           语法  wsimport [opations] <wsdl_uri>
    - wsdl_uri:wsdl 的统一资源标识符
    - d  :指定要输出的文件的位置
    - s  :表示要解析java的源码 ,默认解析出的是class字节码 
    - p  : 指定输出的包名

打jar包 
      命令行: jar  cvf jobService.jar ./cn

例子:接收天气服务
①打开http://ws.webxml.com.cn/WebServices/WeatherWS.asmx网页,点击服务说明,得到http://ws.webxml.com.cn/WebServices/WeatherWS.asmx?WSDL地址

②打开cmd命令,输入wsimport http://ws.webxml.com.cn/WebServices/WeatherWS.asmx?WSDL

如果显示找不到类,那么就是你的环境变量配错了,也或者是你JDK和JRE装在了同一个目录下导致找不到tools.jar

如果显示如下:

那么需要打开网页http://ws.webxml.com.cn/WebServices/WeatherWS.asmx?WSDL,如何把网页内容右键保存为xml文件,例如保存为s.xml,然后把提示的15行、61行、101行去掉保存,然后打开cmd命令,输入wsimport -s ./ -p cn.it.ws /s.xml,如下:

然后再打jar包: jar  cvf myWeather.jar ./cn,打完后把jar复制到醒目的lib目录下,下面就可以利用这个jar包开发得到想要的数据了

写WeatherServlet类:

package cn.it.ws.weather;import java.io.IOException;import java.io.PrintWriter;import java.util.List;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import cn.com.webxml.ArrayOfString;import cn.com.webxml.WeatherWS;import cn.com.webxml.WeatherWSSoap;public class WeatherServlet extends HttpServlet {private WeatherWS ws;public WeatherServlet() {super();}public void destroy() {super.destroy(); // Just puts "destroy" string in log// Put your code here}public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {this.doPost(request, response);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {request.setCharacterEncoding("UTF-8");String cityCode=request.getParameter("city");System.out.println("获取城市的id"+cityCode);//通过webservice获取远程的天气预报信息WeatherWSSoap weatherWSSoap = ws.getWeatherWSSoap();List<String> weathers = weatherWSSoap.getWeather(cityCode, "").getString();String weather=weathers.get(8);//取得温度信息//把结果回显给页面response.setContentType("text/html;charset=UTF-8");PrintWriter printWriter=response.getWriter();printWriter.write(weather);printWriter.flush();printWriter.close();}public void init() throws ServletException {// Put your code herews=new WeatherWS();}}
jsp:index.jsp,这里用到jquery,需要把jquery-1.8.2.js引入

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>  <script type="text/javascript" src="jquery-1.8.2.js"></script>  </head>    <body>   <select id="province">   <option value="31124">广东省</option>   </select>   <select id="city">   <option value="2350">广州</option>   <option value="2419">深圳</option>   <option value="2351">东莞</option>   </select>   <hr/>   <span>XXXX</span>   <script type="text/javascript">     $("#city").change(function(){       var city=$("#city option:selected").val();       $.post("weatherServlet",{"city":city},function(backdata){         $("span").text(backdata).css("color","blue");       });     });   </script>  </body></html>




二:发布服务

使用WebService注解来修改WSDL文件

WSDL文件的内容,一般由服务默认生成,但为了更好的向开发人员提供使用说明书,一般应做一些简单的修改。至少不应该暴露我们的包结构。targetNamespace默认情况下为倒置的包名,这已经暴露了我们的包结构。通过在类文件上添加以下注解,可以修改wsdl生成的各元素,而不是直接去修改wsdl文件,直接去修改wsdl文件是无效的。

WebService的注解包括:

1. @WebService-定义服务   --类上

2. @WebMethod-定义方法   - 方法

3. @WebResult-定义返回值 – 返回值

4. @WebParam-定义参数 – 参数

 

WebService注解的使用

1. 通过WebService的注解,可以更加形像的描述Web服务。从而生成WSDL文档。

2. 当修改了WebService注解之后,同时会影响客户端生成的代码。

3. 调用的方法名和参数名也发生了变化。

4. 即使是没有修改源代码,只修改了注解,客户端的代码也必须要重新生成(注意是生成而不是下载)。否则调用将会失败。

5. 生成本地调用代码,依然使用wsimport工具

 

@WebService注解:

1. @WebService 标注要暴露为Web Services的类或接口 ,用于修饰类或接口,包含的属性有:

2. targetNamespace属性:定义命名空间,默认为”http://”+”包名倒排

3. name属性Web Service 的名称,默认为发布服务的类名。

4. serviceName: ws服务的名词,默认在类名后面添加了service 

5. endpointInterface属性定义服务抽象 Web Service协定的服务端点接口的完整名称,接口也必须声明WebService注解,包括方法的注解必须也要添加到接口中,否则会无效,而且WS在没有注解的情况下.生成WS的时候会自动生成一个注解.所以可以不用指定接口

 

@WebMethod

1. 此注解用在方法上,用于修改对外暴露的方法

2. operationName属性与此方法匹配的 wsdl:operation的名称

3. exclude属性标注此方法是否被暴露,默认为false

 

注意:如果所有方法上都没有指定@WebMethod,则默认是所有的方法都是对外暴露的方法。如果有任一方法指定了@WebMethod,则只有指定这个注解的才是对外暴露的方法。

 

@WebResult

@WebResult 定义返回值,返回值类型不能为接口类或抽象类,而且必须有个不带参的构造函数,包含属性

name属性返回值的名称

 

一个添加注解的案例:

// 修改web服务的名称,和命名空间@WebService(name="Hello",targetNamespace="http://icast.cn")public class HelloWorld {@WebMethod(operationName="aaa")// 修改webResult 和 webParam会影响到JS的调用模式public @WebResult(name="returnName") String sayHi(@WebParam(name="yourname") String name){return "Hello" + name;}public static void main(String[] args){// 发布一个web服务,指定IP和实现者Endpoint end=Endpoint.publish("http://127.0.0.1:4567/hello",new HelloWorld());}}


CXF特点:

    1. 与Spring、Servlet做了无缝对接,cxf框架里面集成了Servlet容器Jetty 
    2. 支持注解的方式来发布webservice
    3. 能够显示一个webservice的服务列表
    4. 能够添加拦截器:输入拦截器、输出拦截器 :

         输入日志信息拦截器、输出日志拦截器、用户权限认证的拦截器

实现步骤:
      1. 添加cxf.jar 包(集成了Spring.jar、servlet.jar ),spring.jar包 ,servlet.jar 包
      2. 编写业务类,通过CXF来发布webservice
      3. 添加一个CXF请求的 Servlet,用来处理webservice的请求 
      4. 配置Spring的配置文件: applicationContext.xml ,把cxf的bean在spring配置
      5. 在web.xml中配置 CXF的 Servlet , 添加spring的监听 
      6. 通过wsimport生成本地代理 ,访问webservice 


例子:

1.导入依赖

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  <modelVersion>4.0.0</modelVersion>  <groupId>cn.it.cxf</groupId>  <artifactId>spring-cxf</artifactId>  <version>0.0.1-SNAPSHOT</version>  <packaging>war</packaging>    <dependencies>    <dependency>      <groupId>junit</groupId>      <artifactId>junit</artifactId>      <version>4.10</version>      <scope>test</scope>    </dependency>        <!-- 添加Spring支持 --><dependency>    <groupId>org.springframework</groupId>    <artifactId>spring-core</artifactId>    <version>4.1.7.RELEASE</version></dependency><dependency>    <groupId>org.springframework</groupId>    <artifactId>spring-beans</artifactId>    <version>4.1.7.RELEASE</version></dependency><dependency>     <groupId>org.springframework</groupId>     <artifactId>spring-tx</artifactId>     <version>4.1.7.RELEASE</version>    </dependency><dependency>    <groupId>org.springframework</groupId>    <artifactId>spring-context</artifactId>    <version>4.1.7.RELEASE</version></dependency><dependency>    <groupId>org.springframework</groupId>    <artifactId>spring-context-support</artifactId>    <version>4.1.7.RELEASE</version></dependency> <dependency>    <groupId>org.springframework</groupId>    <artifactId>spring-web</artifactId>    <version>4.1.7.RELEASE</version></dependency> <dependency>    <groupId>org.springframework</groupId>    <artifactId>spring-webmvc</artifactId>    <version>4.1.7.RELEASE</version></dependency> <dependency>    <groupId>org.springframework</groupId>    <artifactId>spring-aop</artifactId>    <version>4.1.7.RELEASE</version></dependency>  <dependency>    <groupId>org.springframework</groupId>    <artifactId>spring-aspects</artifactId>    <version>4.1.7.RELEASE</version></dependency> <dependency>    <groupId>org.springframework</groupId>    <artifactId>spring-jdbc</artifactId>    <version>4.1.7.RELEASE</version></dependency><!-- 添加cxf支持  --><dependency>    <groupId>org.apache.cxf</groupId>    <artifactId>cxf-core</artifactId>    <version>3.1.5</version></dependency> <dependency>    <groupId>org.apache.cxf</groupId>    <artifactId>cxf-rt-frontend-jaxws</artifactId>    <version>3.1.5</version></dependency> <dependency>    <groupId>org.apache.cxf</groupId>    <artifactId>cxf-rt-transports-http</artifactId>    <version>3.1.5</version></dependency>  </dependencies></project>


2.整合文件applicationContext-cxf.xml

<?xml version="1.0" encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xmlns:jaxws="http://cxf.apache.org/jaxws"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd  http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">      <bean id="employeeManagerImpl" class="cn.it.ws.cxf.b.EmployeeManagerImpl"></bean>  <!-- 配置cxf        地址:      http://192.168.114.10:8080/CXF_Server/ws/employeeManager     组成 :  http://192.168.114.10:8080 +CXF_Server( 项目名)+ws(过滤的路径)+/employeeManager(自定义部分)     服务类 :     服务的实现类:     拦截器        -->  <jaxws:server address="/employeeManager" serviceClass="cn.it.ws.cxf.b.EmployeeManager">   <jaxws:serviceBean>    <ref bean="employeeManagerImpl"/>   </jaxws:serviceBean>   <!-- 配置输入显示日志信息的拦截器   -->   <jaxws:inInterceptors>    <bean class="org.apache.cxf.interceptor.LoggingInInterceptor"></bean>   </jaxws:inInterceptors>   <jaxws:outInterceptors>    <bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"></bean>   </jaxws:outInterceptors>  </jaxws:server> </beans>
3.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_3_0.xsd" version="3.0">  <display-name>CXF_Server</display-name>  <!-- 添加  CXF 的Servlet ,处理 webservice的请求 -->  <servlet>  <servlet-name>cxf</servlet-name>  <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>  <load-on-startup>0</load-on-startup>  </servlet>  <servlet-mapping>   <servlet-name>cxf</servlet-name>   <url-pattern>/ws/*</url-pattern>  </servlet-mapping>  <!-- Spring 监听添加 -->  <listener>    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  </listener>  <context-param>    <param-name>contextConfigLocation</param-name>    <param-value>classpath:applicationContext.xml</param-value>  </context-param></web-app>
4.EmployeeManager:

package cn.it.ws.cxf.b;import java.util.List;import javax.jws.WebParam;import javax.jws.WebResult;import javax.jws.WebService;import cn.it.ws.cxf.bean.Employee;@WebService(serviceName="EmployeeService")public interface EmployeeManager {public abstract void add(@WebParam(name="employee")Employee employee);public abstract @WebResult(name="employees")List<Employee> query();}
5.EmployeeManagerImpl:
package cn.it.ws.cxf.b;import java.util.ArrayList;import java.util.List;import cn.it.ws.cxf.bean.Employee;/**员工管理的业务实现类 *  */public class EmployeeManagerImpl implements EmployeeManager {private List<Employee> employees=new ArrayList<>();@Overridepublic void add(Employee employee){//添加到集合中employees.add(employee);}@Overridepublic List<Employee> query(){return employees;}}
6.Employee:

package cn.it.ws.cxf.bean;public class Employee {private Integer  id;private String name;private Integer age;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}}

7.通过web service exprlorer测试
     http://127.0.0.1:8080/spring-cxf/ws/employeeManager?wsdl





二:发布服务
0 0