Web Service开篇

1、第一个实例

建立一个Java Web Service需要三个步骤:1、创建接口;2、创建实现类;3、开启服务

 

1.1、创建接口 IMyService

    在Eclipse中新建一个Java Project,添加一个包org.decarl.service

JAX-WS  Web Service_System

 

在包中添加接口IMyService

在接口上添加Annotation @WebService,在接口里定义两个方法

 

package org.decarl.service;
 
import javax.jws.WebService;
 
@WebService
publicinterface IMyservice {
publicintintint b);
publicintintint b);
}

 

1.2 创建实现类 MyServiceImpl

重点注意在类定义上面加上Annotation

 

@WebService(endpointInterface = "org.decarl.service.IMyservice")

 

其中endpointInterface指的是对外提供服务的接口

 

 

代码实现如下:

 

 

package org.decarl.service;
 
import javax.jws.WebService;
 
@WebService(endpointInterface = "org.decarl.service.IMyservice")
publicclass MyServiceImpl implements IMyservice {
 
@Override
publicintintint b) {
out.println(a + "+" + (a + b) );
return a + b;
    }
 
@Override
publicintintint b) {
out.println(a + "-" + (a - b) );
return a - b;
    }
}

 

1.3 创建服务(开启服务)

核心是 Endpoint.publish函数

 

代码如下:

 

package org.decarl.service;
import javax.xml.ws.Endpoint;
publicclass MyService {
publicstatic void main(String[] args) {
address = ;
        
//第二个参数:要发布这个接口的哪一个实现类
        Endpoint.publish(address, new MyServiceImpl());
        
//SEI Service Endpoint Interface 服务提供的接口:IMyService
//SIB Service Implements Bean 服务实现的Bean:MyServiceImpl
    }
}

1.4、建立一个TestClient进行测试

package org.decarl.service;
 
import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
 
publicclass TestClient {
publicstatic void main(String[] args) {    
try {
//创建访问wsdl服务地址的URL
new"http://localhost:8888/ns?wsdl");
//通过QName指明服务的具体信息
new"http://service.decarl.org/", "MyServiceImplService");
//创建服务
            Service service = Service.create(url, sName);
//实现接口
class);
out.println(ms.add(12, 13));
            
//以上服务有问题,依然依赖于IMyservice接口
            
 catch (MalformedURLException e) {
            e.printStackTrace();
        }    
    }
}

这个类中的QName、Service 之后介绍

 

1.5、启动测试

1.5.1 、启动MyService类(启动服务)

 

右键->Run as->Java Application

 

JAX-WS  Web Service_System_02

 

控制台输出如下:

 

JAX-WS  Web Service_java_03

 

 

之后在浏览器中输入地址:http://localhost:8888/ns?wsdl

页面显示如下:

JAX-WS  Web Service_System_04

 

 

其中TestClient类中的QName构造方法的参数对应着上图中红框中的tagetNameSpace和name

 

QName sName = new"http://service.decarl.org/", "MyServiceImplService");

 

1.5.2、调用这个服务

在TestClient类中右键->Run as->Java Application

 

控制台输出如下:

 

JAX-WS  Web Service_User_05

 

但是此时还是依赖IMyservice, 服务的调用是通过WSDL即可完成

WSDL可能是Java或者.NET开发生成的

 

 

2、第一个实例改进

2.1、wsimport 命令 (通过WSDL生成本地的服务class文件)

wsimport -d D:/wsimport/ -keep -verbose http://localhost:8888/ns?wsdl

wsimport -d D:/wsimport -keep -verbose http://localhost:8888/ns?wsdl

wsimport -d D:\wsimport -keep -verbose http://localhost:8888/ns?wsdl

 

注意:如果被指定的目录D: /wsimport 在D盘,则应该先将命令提示符切换到D盘再执行上述命令

 

-keep参数会在生成class文件的同时也生成java文件

-verbose 生成详细信息

 

2.2、新建一个项目来测试生成的class

2.2.1、新建一个Java 项目,将刚刚生成的包拷贝到源代码的目录

JAX-WS  Web Service_java_06

 

复制org,然后在src文件夹上右键粘贴

JAX-WS  Web Service_User_07

 

JAX-WS  Web Service_System_08

 

 

2.2.2、将原来的TestClient直接复制到这个项目中就可以直接运行了

 

2.2.3、创建另一种访问方式

 

新建一个类 TestClient2

 

代码如下:

package org.decarl.service;
 
publicclass TestClient2 {
 
publicstatic void main(String[] args) {
//MyServiceImplService通过WSDL生成的用于做访问的类
new MyServiceImplService();
        IMyservice ms = msis.getMyServiceImplPort();
out.println(ms.minus(29, 11));
    }
}

 

其中MyServiceImplService这个类是wsimport生成的用于提供服务接口访问的类

 

 

2.3、wsimport命令的其他参数

-p 指定包名 不加-keep (-keep生成java文件)

wsimport -d D:/wsimport/ -p test -verbose http://localhost:8888/ns?wsdl

 

JAX-WS  Web Service_java_09

 

-d 指定生成的目录

-keep 指定是否生成.java源文件

-verbose 显示生成的详细过程及信息

http://localhost:8888/ns?wsdl 网络中的WSDL文件

 

 

 

3、WSDL分析

3.1、WSDL五大部分

3.1.1、 types:用来定义访问的类型

3.1.2、message:SOAP

3.1.3、portType:指明服务器的接口,并且通过operation绑定相应的in和out的消息:其中in表示参数,out表示返回值

3.1.4、binding:指定传递消息所使用的格式

3.1.5、service:指定服务所发布的名称

 

 

 

4、使用系统提供的丰富的Annotation

 

修改第一个项目中IMyService

 

package org.decarl.service;
 
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
 
@WebService
publicinterface IMyservice {
      
    
@WebResult(name = "addResult")
publicint@WebParam(name="a")int@WebParam(name="b")int b);
    
@WebResult(name = "minusResult")
publicint@WebParam(name="a")int@WebParam(name="b")int b);
}

 

 

于是对应生成的WSDL type会相应的改变

 

JAX-WS  Web Service_System_10

 

打了红框的部分已经随着Annotation改变了

 

原来的代码和WSDL,注意打红框的部分

package org.decarl.service;
importjavax.jws.WebParam;
importjavax.jws.WebResult;
import javax.jws.WebService;
 
@WebService
publicinterface IMyservice {
publicintintint b);
publicintintint b);
}

JAX-WS  Web Service_User_11

 

再加一个比较明显的例子

package org.decarl.service;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
 
@WebService
publicinterface IMyservice {
    
@WebResult(name = "addResult111111111111")
publicint@WebParam(name="a111111111111")int a, 
@WebParam(name="b111111111111")int b);
    
@WebResult(name = "minusResult222222222222")
publicint@WebParam(name="a222222222222")int a, 
@WebParam(name="b222222222222")int b);
}

 

JAX-WS  Web Service_User_12

 

 

5、传递类类型的数据(传递对象数据)

5.1 在第一项目中添加一个User类(实体类)

 

package org.decarl.service;
 
publicclass User {
privateint;
privateusername;
privatepassword;
publicint getId() {
returnid;
    }
publicvoidint id) {
this.id = id;
    }
public String getUsername() {
returnusername;
    }
publicvoid setUsername(String username) {
this.username = username;
    }
public String getPassword() {
returnpassword;
    }
publicvoid setPassword(String password) {
this.password = password;
    }
}

 

5.2、在IMyservice接口中添加一个和User有关的方法Login

 

package org.decarl.service;
 
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
 
@WebService
publicinterface IMyservice {
      
    
@WebResult(name = "addResult")
publicint@WebParam(name="a")int a, 
@WebParam(name="b")int b);
    
@WebResult(name = "minusResult")
publicint@WebParam(name="a")int a, 
@WebParam(name="b")int b);
    
@WebResult(name = "loginUser")
public@WebParam(name = "username")String username, 
@WebParam(name = )String password);
    
}

 

5.3、在实现类MyServiceImpl中添加login方法的实现

package org.decarl.service;
 
import javax.jws.WebService;
 
@WebService(endpointInterface = "org.decarl.service.IMyservice")
publicclassimplements IMyservice {
 
@Override
publicintintint b) {
out.println(a + "+" + (a + b) );
return a + b;
    }
 
@Override
publicintintint b) {
out.println(a + "-" + (a - b) );
return a - b;
    }
 
@Override
public User login(String username, String password) {
out.println(username + "is logining");
new User();
        user.setId(1);
        user.setUsername(username);
        user.setPassword(password);
return user;
    }
}

 

下面来看WSDL是怎么生成对象的

 

 

JAX-WS  Web Service_System_13

 

上面红框中的文字:

loginResponse类型在下面定义(沿着蓝色箭头),而loginResponse中又定义了user类型;user类型是一个包含了一个xs:int类型和两个xs:string类型的类型