笔记: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 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容器Jetty2. 支持注解的方式来发布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
- 笔记:CXF与spring整合
- cxf 与 spring整合
- CXF与Spring整合
- Spring与CXF整合
- Spring与CXF整合
- cxf与spring整合
- WebService学习笔记(六)Spring与CXF整合服务端
- WebService学习笔记(八)Spring与CXF整合客户端
- spring与cxf的整合
- CXF与Spring的整合
- cxf与spring的整合
- webservice-cxf-与spring整合
- spring与cxf的整合
- WebService -Spring与CXF整合
- WS之cxf与spring整合1
- WS之cxf与spring整合2
- cxf与spring的整合使用
- WebService之CXF与Spring的整合
- 【剑指offer】面试题7:用两个栈实现队列
- 《Java源码分析》:BlockingQueue之PriorityBlockingQueue
- Java中错误记录
- 【Linux网络编程】UDP编程
- 搭建storm集群
- 笔记:CXF与spring整合
- 面试前的思考
- UVA 11361 - Investigating Div-Sum Property-数位DP
- 基于verilog的EEPROM读写
- 唯品会订单分库分表的实践总结以及关键步骤
- 程序员-前行-001-c++程序
- X86 内存布局分析(Memory map)
- jap 复合查询
- oracle存储过程和存储函数(1)