笔记:CXF与spring整合

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 here
		ws=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"?>
<beans
	xmlns="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<>();
	@Override
	public void add(Employee employee){
		//添加到集合中
		employees.add(employee);
	}
	@Override
	public 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





二:发布服务
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值