自定义及发布一个webservice服务 - 声明 某个业务服务为webservice服务 通过@webservice 注解来声明 - 发布webservice服务 Endpoint.publish()发布 (默认对public修饰的方法进行发布) - 通过wsimport生成本地代理来访问自己发布的webservice wsimport
1.发布自定义webservice
phone.java
package ws.myWebService;
public class Phone {
private String phoneName;
private String owner;
private int total;
public String getPhoneName() {
return phoneName;
}
public void setPhoneName(String phoneName) {
this.phoneName = phoneName;
}
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;
}
}
PhoneService.java
编写以及发布webservcie
@WebService 声明Endpoint.publish(address2, new PhoneService()); 发布(同一个端口下面可以发布多个)
package ws.myWebService;
import javax.jws.WebService;
import javax.xml.ws.Endpoint;
/**
* 手机的业务类,该业务类通过webservice 对外提供服务 1. 声明: @webservice 2. 发布 EndPoint
*/
@WebService
public class PhoneService {
public Phone getPhoneInfo(String phoneName) {
Phone phone = new Phone();
if (phoneName != null && "android".equals(phoneName)) {
phone.setPhoneName("android");
phone.setOwner("google");
phone.setTotal(80);
} else if (phoneName != null && "ios".equals(phoneName)) {
phone.setPhoneName("ios");
phone.setOwner("apple");
phone.setTotal(15);
} else {
phone.setPhoneName("windows phone");
phone.setOwner("microsoft");
phone.setTotal(5);
}
return phone;
}
public static void main(String[] args) {
// 发布的两个地址
String address1 = "http://127.0.0.1/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");
}
}
注意:访问的时候后面要带WSDL
WSDL文档解释:
注意: 发布地址要加上http://,访问的时候后面要加上?WSDL。
发布的只有soap访问方式,现在的主流访问方式。
2.wsimport生成自己发布的webservice的本地代理
(1)生成本地代理C:\Users\liqiang\Desktop>wsimport -s ./ http://127.0.0.1:8888/ws/phoneManager?WSDL
(2)导入eclipse进行测试:
测试类: _Main.java
package ws.mywebservice;
public class _Main {
/**
* 测试自己发布的webservice
*
* @param args
*/
public static void main(String[] args) {
// 服务
PhoneServiceService phoneServiceService = new PhoneServiceService();
// 访问方式
PhoneService phoneService = phoneServiceService.getPhoneServicePort();
Phone phoneInfo = phoneService.getPhoneInfo("ios");
System.out.println(phoneInfo.getOwner());
System.out.println(phoneInfo.getPhoneName());
System.out.println(phoneInfo.getTotal());
}
}
结果:
------------------------修改默认配置的webservice注解配置(自定义服务名字与方法名字,参数名字)--------------------------------
增强可读性
通过注解配置修改wsdl文件, 让它具有更好的可读性 需求: 1. 想改方法的输入参数名、返回参数名 2. 想改服务名,方法名 3. 对该业务类的某些方法不想对外发布 - 默认只有public 修饰的方法会以webservice的形式对外发布 而 private 受保护的,缺省的,都不会发布 - 某些public 方法也不想对外发布 实现:注解配置修改wsdl文件
(1)发布及生成本地代理
可以修改方法名字与默认的包结构。也可以修改将哪些方法排除在外面,而且只能发布public修饰的方法。
package ws.it.WebService;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.xml.ws.Endpoint;
import ws.myWebService.Phone;
/**手机的业务类,该业务类通过webservice 对外提供服务
* 1. 声明: @webservice
* 2. 发布 EndPoint
*
*/
@WebService (serviceName="PhoneManager1",//修改服务名
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.setPhoneName("android");phone.setOwner("google");phone.setTotal(80);
}else if(osName.endsWith("ios")){
phone.setPhoneName("ios");phone.setOwner("apple");phone.setTotal(15);
}else{
phone.setPhoneName("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:8088/ws/phoneSer";
/**
* 发布webservice服务
* 1.address:服务的地址
* 2:implementor 服务的实现对象
*/
Endpoint.publish(address1, new PhoneService());
// Endpoint.publish(address2, new PhoneService());
System.out.println("wsdl地址 :"+address1+"?WSDL");
}
}
访问: http://127.0.0.1:8088/ws/phoneSer?WSDL
wsimport生成本地代理:
C:\Users\liqiang\Desktop>wsimport -s ./ http://127.0.0.1:8088/ws/phoneSer?WSDL
包结构改变:(服务类前面的声明改变)
(2)导进eclipse进行测试:
_Main.java
PhoneManager1 服务名字改变,上面配置导致的访问方式的方法名字也改变,也是上面配置导致的
package cn.it.ws.dd;
public class _Main {
/**
* 测试自己发布的webservice
*
* @param args
*/
public static void main(String[] args) {
// 服务
PhoneManager1 phoneServiceService = new PhoneManager1();
// 访问方式
PhoneService phoneService = phoneServiceService.getPhoneServicePort();
Phone phoneInfo = phoneService.getMObileInfo("ios");
System.out.println(phoneInfo.getOwner());
System.out.println(phoneInfo.getPhoneName());
System.out.println(phoneInfo.getTotal());
}
}
结果: