实现接口的webservice

服务端


import javax.jws.WebService; /**面向接口的webservice发布方式
*
*
*/
@WebService
public interface JobService {
public String getJob();
}


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 进行无缝集成。

  1. 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
  2. CXF特点

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

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开发。非常好用…由于在网上见到的教程非常多,我就贴几个我认为比较好的教程:

http://www.biliyu.com/article/986.html

http://blog.csdn.net/u010323023/article/details/52926051

http://blog.csdn.net/dreamfly88/article/details/52350370

获取天气预报

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

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

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


webservice第三篇【接口开发webservice、CXF框架使用、IDEA下使用webservice、小例子】的更多相关文章

  1. WebService学习--(三)使用JDK开发WebService

    一.WebService的开发手段 使用Java开发WebService时可以使用以下两种开发手段 1. 使用JDK开发(1.6及以上版本) 2.使用CXF框架开发(工作中) 二.使用JDK开发Web ...

  2. WebService系列二:使用JDK和CXF框架开发WebService

    一.使用JDK开发WebService 服务端程序创建: 1.新建一个JDK开发webservice的服务端maven项目JDKWebServiceServer 2. 定义一个接口,使用@WebSer ...

  3. python之接口开发基础知识

    一.开发接口的作用 1.mock 服务:在别的接口没有开发完成的时候可以模拟一些接口以便测试已经开发完成的接口,例如假的支付接口,模拟支付成功.支付失败. 2.了解接口是如何实现的:数据交互.数据返回 ...

  4. Dcloud课程4 如何进行APP接口开发

    Dcloud课程4 如何进行APP接口开发 一.总结 一句话总结:通过json或者xml. 1.APP如何进行通信? 通过在地址上接参数指明传递的数据的类型.而数据传递的类型一般是XML和json. ...

  5. FastAPI(六十七)实战开发《在线课程学习系统》接口开发--用户登陆接口开发

    接上一篇文章FastAPI(六十六)实战开发<在线课程学习系统>接口开发--用户注册接口开发.这次我们分享实际开发--用户登陆接口开发. 我们先来梳理下逻辑 1.查询用户是否存在2.校验密 ...

  6. Python(七) —— mock接口开发

    mock接口开发 接口开发有很多框架,诸如 Django,flask,相比较而言,flask 是轻量级web开发框架,用来开发 mock 接口的不二之选.那你可能会问,什么叫 mock 接口呢?moc ...

  7. jeecg接口开发及权限实现原理

    接口开发使用的框架 jeecg本身是基于 Spring MVC 框架搭建的,因此,使用 Spring MVC 框架的 RESTful API 功能来进行接口开发就是顺理成章的事了. 接口的拦截与鉴权 ...

  8. 第三篇-用Flutter手撸一个抖音国内版,看看有多炫

    前言 前一篇已经开发了大部分框架,包含视频上下滑动播放,这次将上次未完成的数据显示友好显示,以及底部音乐走马灯特效,另外优化了加载数据的bug,在dart语言里 & 会自动变成&  另 ...

  9. webService学习之路(三):springMVC集成CXF后调用已知的wsdl接口

    webService学习之路一:讲解了通过传统方式怎么发布及调用webservice webService学习之路二:讲解了SpringMVC和CXF的集成及快速发布webservice 本篇文章将讲 ...

随机推荐

  1. IPV6与IPV4的区别

    IPv4协议的地址长度是32位,IPv6协议的地址长度是128位. 1.表示方式 IPv4地址表示为点分十进制格式,32位的地址分成4个8位分组,每个8位以十进制数显式,中间用点号分隔. 而IPv6采 ...

  2. 【学习笔记】深入理解超时调用(setTimeout)和间歇调用(setInterval)

    超时调用(setTimeout):在指定的毫秒数后调用函数或计算表达式. setTimeout(func, 1000); // func执行的函数,1000毫秒 间歇调用(setInterval):按 ...

  3. cxf整合spring错误为:cvc-complex-type.2.4.c

    cxf整合spring,报错信息如下: Multiple annotations found at this line:- cvc-complex-type.2.4.c: The matching w ...

  4. tomcat-users.xml配置Manager登陆用户

    添加用来登陆tomcat-manager的用户 <tomcat-users> <!-- NOTE: By default, no user is included in the &q ...

  5. CSS float 属性

    Float定义: float 属性定义元素在哪个方向浮动.以往这个属性总应用于图像,使文本围绕在图像周围,不过在 CSS 中,任何元素都可以浮动. 浮动元素会生成一个块级框,而不论它本身是何种元素.如 ...

  6. Windbg查看调用堆栈(k*)

            无论是分析程序崩溃原因,还是解决程序hang问题,我们最常查看的就是程序调用堆栈.学会windbg调用堆栈命令,以及理解堆栈中的各个参数的意义就显得至关重要. 上图就是一个典型的Win ...

  7. MySql按每日、每周、每月分组统计数据

    select DATE_FORMAT(create_time,'%Y%u') weeks,count(caseid) count from tc_case group by weeks; select ...

  8. Javascript中的浅拷贝和深拷贝

    很多开发语言中都有浅拷贝和深拷贝的说法,这里简单区分一下它们在Javascript中的区别,以及jQuery中深拷贝的实现. 在谈浅拷贝和深拷贝之前,先要屡清楚Javascript中的按值访问和按引用 ...

  9. Unix硬链接和符号链接(转)

    首先要弄清楚,在Linux系统中,内核为每一个新创建的文件分配一个Inode(索引结点),每个文件都有一个惟一的inode号.文件属性保存在索引结点里,在访问文件时,索引结点被复制到内存在,从而实现文 ...

  10. KVM+Qemu+Libvirt实战

    上一篇的文章是为了给这一篇文件提供理论的基础,在这篇文章中我将带大家一起来实现在linux中虚拟出ubuntu的server版来 我们需要用KVM+Qemu+Libvirt来进行kvm全虚拟化,创建虚 ...