WebService的使用

来源:互联网 发布:配置ubuntu镜像站 编辑:程序博客网 时间:2024/06/08 18:04

一、WebService的概念:

webservice就是能使运行在不同机器上的不同应用无需借助附加的、专门的第三方软件或硬件,就可以相互交换数据。无论他们所使用的语言、平台或内部协议是什么,都可以相互交换数据。

可以说其就是一个部署在web服务器上的一个应用程序,它通过向外界暴露出一个能够通过web进行调用的api,供使用者进行调用。在这里api的使用者称为客户端,而发布者则为服务端。在webservice中不存在严格意义上的客户端和服务端,任何人都可能是客户端和服务端。


二、常见的webservice业务服务:

1.   手机淘宝、京东

2.   天气预报

3.   手机号归属地

4.   股票查询

5.   发手机短消息

6.   手机充值功能

7.   中英文翻译

8.   银行转账业务

三、WebService专业名称介绍:

a) XML: ExtensibleMarkup Language -扩展性标记语言

XML,用于传输格式化的数据,是Web服务的基础。

•    namespace-命名空间。

•   xmlns=“http://itcast.cn” 使用默认命名空间。

•   xmlns:itcast=“http://itcast.cn”使用指定名称的命名空间。

b)  WSDL: WebService Description Language – Web服务描述语言。调用该webservice api 的接口描述

•    通过XML形式说明服务在什么地方-地址。

•    通过XML形式说明服务提供什么样的方法 – 如何调用。

c)  SOAP:Simple Object Access Protocol(简单对象访问协议) 

•    SOAP作为一个基于XML语言的协议用于有网上传输数据。

•    SOAP= 在HTTP的基础上+XML数据。

•    SOAP是基于HTTP的。

•    SOAP的组成如下:

1.  Envelope – 必须的部分。以XML的根元素出现。

2.  Headers – 可选的。

3.  Body – 必须的。在body部分,包含要执行的服务器的方法。和发送到服务器的数据。


四、发布一个WebService

(1)不实现接口进行发布:

实体类:

package com.xusheng;public class Phone {private String osName;private String owner;private int market;public String getOsName() {return osName;}public void setOsName(String osName) {this.osName = osName;}public String getOwner() {return owner;}public void setOwner(String owner) {this.owner = owner;}public int getMarket() {return market;}public void setMarket(int market) {this.market = market;}@Overridepublic String toString() {return "Phone [osName=" + osName + ", owner=" + owner + ", market=" + market + "]";}}

业务类:

package com.xusheng;import javax.jws.WebMethod;import javax.jws.WebParam;import javax.jws.WebResult;import javax.jws.WebService;import javax.xml.ws.Endpoint;@WebService(serviceName = "PhoneManager" , targetNamespace="http://cn.itcast")public class PhoneProxy {public @WebResult(name = "phone")Phone getPhone(@WebParam(name = "osName")String osName){Phone p = new Phone();if("android".equals(osName)){p.setOsName("android");p.setOwner("google");p.setMarket(80);}else if("ios".equals(osName)){p.setOsName("ios");p.setOwner("apple");p.setMarket(10);}else{p.setOsName("windos");p.setOwner("microsoft");p.setMarket(10);}return p;}@WebMethod(exclude = true)public void sayHi(){System.out.println("hello world");}public static void main(String[] args) {String address = "http://127.0.0.2:8888/ws/PhoneProxy";Endpoint.publish(address, new PhoneProxy());System.out.println("地址是:"+address+"?WSDL");}}

首先,我们在需要发布的业务类上 加上@WebService()注解,可以为其设置参数:

serviceName:可以指定发布服务的名称

 targetNamespace:设置其名称空间

@WebResult(name = "phone"):加在返回参数前,为其设置名称

@WebParam(name = "osName":设置参数的名称

@WebMethod(exclude = true):此注解是指定该方法不被发布,默认会将public方法进行发布,若此类不存在public方法,则启动会失败

最后,我们在主方法中使用Endpoint中的publish方法将该类进行发布,此方法有两个参数,一个是地址(String类型),另一个是要发布的类的一个对象

(2)实现接口情况下发布:

接口:

package cn.itcast;import javax.jws.WebService;@WebService(name = "JobService")public interface JobService {public String getJob();}

实现类:

package cn.itcast;import javax.jws.WebService;@WebService(name = "JobServiceImpl",endpointInterface = "cn.itcast.JobService")public class JobServiceImpl implements JobService {@Overridepublic String getJob() {return "jee开发|android开发|数据库开发";}public void sayHi(){System.out.println("hello world");}}


我们需要在接口和实现类上分别加上WebService注解,并且在实现类的注解上设置参数endpointInterface指定实现的接口

(3)使用CXF框架实现WebService

接口:

package com.xusheng;import javax.jws.WebParam;import javax.jws.WebResult;import javax.jws.WebService;@WebService(serviceName = "LanguageManager")public interface LanguageService {public @WebResult(name = "language1")String getLanguage(@WebParam(name = "index1")int index);}

实现类:

package com.xusheng;import org.apache.cxf.interceptor.LoggingInInterceptor;import org.apache.cxf.interceptor.LoggingOutInterceptor;import org.apache.cxf.jaxws.JaxWsServerFactoryBean;public class LanguageServiceImpl implements LanguageService {public String getLanguage(int index) {String language = null;switch (index) {case 1:language = "java";break;case 2:language = "c";break;default:language = "php";break;}return language;}public static void main(String[] args) {LanguageService ls = new LanguageServiceImpl();JaxWsServerFactoryBean bean = new JaxWsServerFactoryBean();bean.setAddress("http://127.0.0.1:8888/ws/language");bean.setServiceClass(LanguageService.class);bean.setServiceBean(ls);bean.getInInterceptors().add(new LoggingInInterceptor());bean.getOutInterceptors().add(new LoggingOutInterceptor());bean.create();System.out.println("http://127.0.0.1:8888/ws/language?WSDL");}}
首先我们在接口上加入@WebService注解,并且在发布项目时,还需要配置输入输出日志拦截器

(4)CXF与Spring集成发布WebService

在web.xml文件中配置cxf的核心servlet,CXFServlet

<?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" id="WebApp_ID" version="3.0">  <display-name>CXF_Server1</display-name>  <welcome-file-list>    <welcome-file>index.html</welcome-file>    <welcome-file>index.htm</welcome-file>    <welcome-file>index.jsp</welcome-file>    <welcome-file>default.html</welcome-file>    <welcome-file>default.htm</welcome-file>    <welcome-file>default.jsp</welcome-file>  </welcome-file-list>    <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>  </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>

实体类:

package com.xusheng.entity;public class Emp {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 com.xusheng.service;import java.util.List;import javax.jws.WebParam;import javax.jws.WebResult;import javax.jws.WebService;import com.xusheng.entity.Emp;@WebService(name = "EmpManager1")public interface EmpManager {<span style="white-space:pre"></span>public void add(@WebParam(name="employee")Emp emp);<span style="white-space:pre"></span>public @WebResult(name="employees")List<Emp> query();}}

实现类:

package com.xusheng.service;import java.util.ArrayList;import java.util.List;import com.xusheng.entity.Emp;public class EmpManagerImpl implements EmpManager {private List<Emp> emps = new ArrayList<Emp>();public void add(Emp emp) {emps.add(emp);}public List<Emp> query() {return this.emps;}}

配置Spring的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>
在配置完成后,我们可以将tomcat容器启动后,在浏览器地址栏中输入地址就可以看到WSDL文件

五、调用已发布WebService

我们可以通过http://www.webxml.com.cn上的已经发布的进行调用或者通过我们自己发布的地址进行访问,找到我们所需api的WSDL地址,

然后我们在命令提示符下通过wsimport命令(参数设置可以通过此命令进行查询)+WSDL地址可将文件导入到本地或者通过jar cvf test.jar将其整合成jar包,然后我们通过其WSDL文件中

的说明进行调用。






0 0
原创粉丝点击