import javax. jws . WebService ; @WebService (endpointInterface= "cn.it.ws.e.JobService" ) //设置服务端点接口 ,指定对外提供服务的接口 public class JobServiceImpl implements JobService { @Override public String getJob ( ) { return "JEE研发工程师|Android研发工程师|数据库工程师|前端工程师|测试工程师|运维工程师" ; public void say ( ){ System . out . println ( "早上好!" ); 复制代码

客户端

import javax. xml . ws . Endpoint ; public class Test { public static void main ( String [] args ) { JobService jobService= new JobServiceImpl (); String address= "http://192.168.114.10:9999/ws/jobservice" ; Endpoint . publish (address, jobService); System . out . println ( "wsdl地址:" +address+ "?WSDL" ); 复制代码

CXF框架

Apache CXF 是一个开源的 Services 框架,CXF 帮助您来构建和开发 Services 这些 Services 可以支持多种协议,比如:SOAP、POST/HTTP、RESTful HTTP CXF 大大简化了 Service可以天然地和 Spring 进行无缝集成。

CXF介绍 :soa的框架

* cxf 是 Celtrix (ESB框架)和 XFire(webserivice) 合并而成,并且捐给了apache  
* CxF的核心是org.apache.cxf.Bus(总线),类似于Spring的 ApplicationContext
* CXF默认是依赖于Spring的
* Apache CXF 发行包中的jar,如果全部放到lib中,需要 JDK1.6 及以上,否则会报JAX-WS版本不一致的问题
* CXF 内置了Jetty服务器 ,它是servlet容器,好比tomcat

CXF特点

  • 与Spring、Servlet做了无缝对接,cxf框架里面集成了Servlet容器Jetty
  • 支持注解的方式来发布webservice
  • 能够显示一个webservice的服务列表
  • 能够添加拦截器:输入拦截器、输出拦截器 :
  • 输入日志信息拦截器、输出日志拦截器、用户权限认证的拦截器
  • CXF开发

    要想使用CXF框架,那么就先导入jar包

  • asm-3.3.jar
  • commons-logging-1.1.1.jar
  • cxf-2.4.2.jar
  • jetty-continuation-7.4.5.v20110725.jar
  • jetty-http-7.4.5.v20110725.jar
  • jetty-io-7.4.5.v20110725.jar
  • jetty-security-7.4.5.v20110725.jar
  • jetty-server-7.4.5.v20110725.jar
  • jetty-util-7.4.5.v20110725.jar
  • neethi-3.0.1.jar
  • wsdl4j-1.6.2.jar
  • xmlschema-core-2.0.jar
  • import javax.jws.WebParam; import javax.jws.WebResult; import javax.jws.WebService; @WebService(serviceName="languageManager") public interface LanguageService { public @WebResult(name="language")String getLanguage(@WebParam(name="position")int position); 复制代码

    实现:

    package cn.it.ws.cxf.a; import org.apache.cxf.frontend.ServerFactoryBean; import org.apache.cxf.interceptor.LoggingInInterceptor; import org.apache.cxf.interceptor.LoggingOutInterceptor; import org.apache.cxf.jaxws.JaxWsServerFactoryBean; /**开发语言排行描述服务 * @author 李俊 2015年5月17日 public class LanguageServiceImpl implements LanguageService { /* (non-Javadoc) * @see cn.it.ws.cxf.a.LanguageService#getLanguage(int) @Override public String getLanguage(int position){ String language=null; switch (position) { case 1: language="java"; break; case 2: language="C"; break; case 3: language="Objective-C"; break; case 4: language="C#"; break; default: break; return language; /**通过cxf框架发布webservice * 1. ServerFactoryBean * - 不设置注解也可以发布webservice服务, 不支持注解 * - 不支持拦截器的添加 * 2. JaxWsServerFactoryBean * - 支持注解 * - 可以添加拦截器 * 3. webservice 访问流程: * 1. 检测本地代理描述的wsdl是否与服务端的wsdl一致 ,俗称为握手 * 2. 通过soap协议实现通信 ,采用的是post请求 , 数据封装在满足soap规约的xml中 * 3. 返回数据 同样采用的是soap通信, 数据封装在满足soap规约的xml中 * @param args public static void main(String[] args) { LanguageService languageService=new LanguageServiceImpl(); ServerFactoryBean bean=new ServerFactoryBean(); //Endpoint :地址 , 实现对象 bean.setAddress("http://192.168.114.10:9999/ws/cxf/languangeService"); bean.setServiceClass(LanguageService.class);//对外提供webservcie的业务类或者接口 bean.setServiceBean(languageService);//服务的实现bean bean.create();//创建,发布webservice System.out.println("wsdl地址:http://192.168.114.10:9999/ws/cxf/languangeService?WSDL"); public static void main(String[] args) { LanguageService languageService=new LanguageServiceImpl(); JaxWsServerFactoryBean bean=new JaxWsServerFactoryBean(); //Endpoint :地址 , 实现对象 bean.setAddress("http://192.168.114.10:9999/ws/cxf/languangeService"); bean.setServiceClass(LanguageService.class);//对外提供webservcie的业务类或者接口 bean.setServiceBean(languageService);//服务的实现bean //添加输入拦截器 :输入显示日志信息的拦截器 bean.getInInterceptors().add(new LoggingInInterceptor()); //添加输出拦截器 :输出显示日志信息的拦截器 bean.getOutInterceptors().add(new LoggingOutInterceptor()); bean.create();//创建,发布webservice System.out.println("wsdl地址:http://192.168.114.10:9999/ws/cxf/languangeService?WSDL");

    CXF与Spring集成

  • 建立一个web项目
  • 准备所有jar包,将CXF_HOME\lib项目下的所有jar包,全部都拷贝新项目的lib目录下.其中里面已经包含了Sring3.0的jar包 其中jetty 服务器的包可以不要.因为我们要部署的tomcat服务器中了
  • 在web.xml中配置cxf的核心servlet,CXFServlet
  • 此配置文件的作用类 拦截/ws/*的所有请求 类似Struts2的过滤器
  • 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> 复制代码

    实体:

    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; 复制代码

    接口:

    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 { void add(@WebParam(name="employee")Employee employee); @WebResult(name="employees")List<Employee> query(); 复制代码

    接口实现:

    package cn.it.ws.cxf.b; import java.util.ArrayList; import java.util.List; import cn.it.ws.cxf.bean.Employee; /**员工管理的业务实现类 * @author 李俊 2015年5月17日 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; 复制代码

    Spring配置信息:

    <?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 > 复制代码

    IDEA下使用webservice

    我们的Intellij idea是一个非常好用的java ide,当然了,它也支持webservice开发。非常好用...由于在网上见到的教程非常多,我就贴几个我认为比较好的教程:

    www.biliyu.com/article/986…

    blog.csdn.net/u010323023/…

    blog.csdn.net/dreamfly88/…

    获取天气预报

    我们现在webservice就基本入门了,现在我想要做的就是自己写的网站能够拿到天气预报的信息,于是我去 www.webxml.com.cn/zh_cn/index… 找到了天气预报的服务

    这个是天气预报的WSDL地址: ws.webxml.com.cn/WebServices… ,那么我们只要解析该WSDL服务即可

    如果不想得到所有的信息,那么我们可以在服务上找到我们想要对应的数据,也就是说:

  • 实现接口的webservice只是在类上对其的一种抽象而已,没什么大不了的。
  • CXF框架可以与spring无缝连接,就不用我们自己Endpoint了。它还能记录日志之类的。
  • 我们还可以使用Idea下的webservice,能够使用图形画面的方式获取本地代理和生成WSDL文件。
  • 如果您觉得这篇文章帮助到了您,可以给作者一点鼓励

    ZhongFuCheng3y
    私信