webservice第二篇【自定义webservice服务、soa、uddi概念、soap协议】


tags: webService


自定义webservice服务

我们在上一章节中已经使用wsimport生成本地代理来调用webservice的服务了,其实我们自己写的web应用程序也是可以发布webservice的

我们发布了webservice的话,那么其他人也是可以调用我们自己写的webservice!

那么我们怎么自定义webservice然后发布出去呢???

在jdk 1.6 版本以后 ,**通过jax-ws 包提供对webservice的支持 **

  • 该方式通过注解的方式来声明webservice
  • 通过 jdk EndPoint.publish()发布webserive服务

快速入门

写一个实体:


public class Phone {
	private String name;//操作系统名
	private String owner;//拥有者 
	private int total;//市场占有率
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getOwner() {
		return owner;
	}
	public void setOwner(String owner) {
		this.owner = owner;
	}
	public int getTotal() {
		return total;
	}
	public void setTotal(int total) {
		this.total = total;
	}

}

复制代码

发布service,通过注解来让WSDL文件更加可读...


package cn.it.ws.d;

import cn.it.ws.model.Phone;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.xml.ws.Endpoint;
/*
*手机的业务类,该业务类通过webservice 对外提供服务
 * 1. 声明: @webservice
 * 2. 发布 EndPoint
 */

@WebService (serviceName="PhoneManager",//修改服务名
   targetNamespace="http://dd.ws.it.cn") //修改命名空间 ,默认包名,取反
//声明该业务类 对外提供webservice服务   ,默认只是对public 修饰的方法对外以webservice形式发布
public class PhoneService {

/**@WebMethod(operationName="getMObileInfo"): 修改方法名
	 * @WebResult(name="phone"):修改返回参数名
	 * @WebParam(name="osName"):修改输入参数名
	 */

	@WebMethod(operationName="getMObileInfo")
	public @WebResult(name="phone") Phone getPhoneInfo(@WebParam(name="osName")String osName){
		Phone phone=new Phone();
		if(osName.endsWith("android")){
			phone.setName("android");phone.setOwner("google");phone.setTotal(80);
		}else if(osName.endsWith("ios")){
			phone.setName("ios");phone.setOwner("apple");phone.setTotal(15);
		}else{
			phone.setName("windows phone");phone.setOwner("microsoft");phone.setTotal(5);
		}
		return phone;
	}
	@WebMethod(exclude=true)//把该方法排除在外
	public void sayHello(String city){
		System.out.println("你好:"+city);
	}
	private void sayLuck(String city){
		System.out.println("好友:"+city);
	}
	 void sayGoodBye(String city){
		System.out.println("拜拜:"+city);
	}
	protected void saySayalala(String city){
		 System.out.println("再见!"+city);
	 }
	
	public static void main(String[] args) {
		String address1="http://127.0.0.1:8888/ws/phoneService";
//		String address2="http://127.0.0.1:8888/ws/phoneManager";
/**
		 * 发布webservice服务
		 * 1.address:服务的地址
		 * 2:implementor 服务的实现对象
		 */

		Endpoint.publish(address1, new PhoneService());
//		Endpoint.publish(address2, new PhoneService());
		System.out.println("wsdl地址 :"+address1+"?WSDL");
	}

}

复制代码
  1. 在类上添加@WebService注解,代表发布一个WebService服务
  2. 通过EndPoint(端点服务)发布一个webService。Endpoint也是jdk提供的一个专门用于发布服务的类,它的publish方法接收两个参数,一个是本地的服务地址,二是提供服务的类。它位于javax.xml.ws.*包中。
  3. Endpoint.publish(String address, Object implementor) 静态方法在给定地址处针对指定的实现者对象创建并发布端点
  4. 给类添加上@WebService注解后,类中所有的非静态方法都将会对外公布
  5. 如果希望某个方法不对外公开,可以在方法上添加@WebMethod(exclude=true),阻止对外公开。
  6. 如果一个类上,被添加了@WebService注解,则必须此类至少有一个可以公开的方法,否则将会启动失败。 protected、private、final、static方法不能对外公开

@WebService	// 添加了此注解,代表是一个WebService
public class HelloWorld {
	// 非 static final private 方法默认会发布
	public String sayHi(String name) {
		return "hello" + name;
	}
	@WebMethod(exclude=true)
	public void exclude(){
		// 被注解排除的方法
	}
	protected void protected1(){
		//受保护的方法默认不发布
	}
	private void private1(){
		// 私有方法默认不发布
	}
	public static void static1(){
		// static 方法默认不发布
	}
	public final void final1(){
		// final 方法默认不发布
	}
}
复制代码

生成的webservice能够在浏览器访问


SOAP协议

目前WebService的协议主要有SOAP1.1和1.2。

  • 两者的命名空间不同。
    • Soap1.1的命名空间:
      • xmlns:soap=“http://schemas.xmlsoap.org/soap/envelope/ “
    • Soap1.2 命名空间:
      • xmlns:soap="http://www.w3.org/2003/05/soap-envelope“ 
        复制代码
  • SOAP1.1版本与SOAP1.2版本在头信息上存在差异。
    • SOAP1.1存在SOAPAction的请求头。
    • SOAP1.2没有SOAPAction的请求头。
  • 基于SOAP1.1生成的WSDL和基于SOAP1.2生成的WSDL也不一样。 主要看命名空间。
  • 在CXF中两种协议请求的方式也不一样。
    • 1.1为content-Type:text/xm;charset=UTF-8
    • 1.2为content-Type:application/soap+xml;charset=UTF-8

SOA、UDDI概念

##SOA## Soa(Service-Oriented Architecture)面向服务的架构,它是一种思想,IBM大力倡导是即插即用的,IBM大力提倡,希望以组装电脑的方式来开发应用

组成:

  •       面向web的服务,面向web的组件  :WebService : 硬盘、cpu、内存条
    复制代码
  •       企业服务总线 (EnterPrise Service Bus :ESB)。主板
    复制代码

##uddi##

uddi (Universal Description, Discovery and Integration)统一描述、发现、集成

  • 它是目录服务,通过该服务可以注册和发布webservcie,以便第三方的调用者统一调用
  • 用得并不太多。

#总结#

  • 我们是可以自己写webService的。对服务类上加上注解。通过EndPoint(端点服务)就能够把我们webService服务类发布出去了。
    • 为了让WDSL文件更加读取,可以使用注解的方式来写好对应的参数名称。
    • 也可以控制某方法是否被发布出去
  • SOAP其实上就是使用XML进行传输的HTTP协议。
  • SOA:面向服务架构。即插即用。也就是耦合非常低,用的时候加上就行了。
  • UDDI (Universal Description, Discovery and Integration)统一描述、发现、集成,其实就是一个webservice的目录结构,不过我们很少把webservice发布到上面去

如果您觉得这篇文章帮助到了您,可以给作者一点鼓励

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值