转载请出自出处:http://eksliang.iteye.com/blog/2265021
一、概述
WebService:WebService并不是一个软件,而是一个规范。这个规范与Jsp、Servlet、EJB规范类似。在实际应用中会使用很多WebService的具体实现,例如CXF、Axis2等等。webService规范使用了SOAP协议,对于一般开发人员来说,并不需要了解SOAP协议,SOAP消息的内容是标准的XML格式,SOAP消息一般通过HTTP协议进行传输,但是也可以通过其他协议,如:SMTP协议
Jax-Ws:就是Java标准的WebService,JDK1.6使用Jax-WS完全取代了Jax-RPC,成为Java的Web服务标准。
二、WebService的三要素
- SOAP:简单对象访问协议,基于XML的协议,用来描述传递信息的格式;同时也是交换数据的一种协议规范,它被设计成在WEB上交换结构化的和固化的信息。
- WSDL:用来描述如何访问具体的接口;
- UDDI:用来管理,分发,查询webService;
三、使用JAX-WS发布WebService
3.1.构造数据实体对象
import java.io.Serializable;
import java.util.Date;
import com.google.gson.Gson;
/**
* 在网络中传输的对象,必须序列化接口
* @author Ickes
*/
public class Users implements Serializable {
private static final long serialVersionUID = 123L;
private String userId;
private String userName;
private String userPwd;
private Integer sex;
private Float sal;
private Date birthday;
/* get set方法省略 */
public String toJson() {
Gson gson = new Gson();
return gson.toJson(this);
}
3.2、构造测试数据类
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* 获取构造数据进行测试
* @author Ickes
*/
public class UsersFactory {
public static Users getUser(){
Users u1 = new Users();
u1.setBirthday(new Date());
u1.setSal(20F);
u1.setSex(1);
u1.setUserId("A001");
u1.setUserName("admin1");
u1.setUserPwd("123456");
return u1;
}
public static List<Users> getUsers() {
Users u1 = new Users();
u1.setBirthday(new Date());
u1.setSal(20F);
u1.setSex(1);
u1.setUserId("A001");
u1.setUserName("admin1");
u1.setUserPwd("123456");
Users u2 = new Users();
u2.setBirthday(new Date());
u2.setSal(20F);
u2.setSex(0);
u2.setUserId("A002");
u2.setUserName("admin2");
u2.setUserPwd("123456");
Users u3 = new Users();
u3.setBirthday(new Date());
u3.setSal(60F);
u3.setSex(1);
u3.setUserId("A003");
u3.setUserName("admin3");
u3.setUserPwd("123456");
List<Users> users = new ArrayList<Users>();
users.add(u1);
users.add(u2);
users.add(u3);
return users;
}
}
3.3、UserService接口类,用于发布服务的接口
import java.util.List;
import com.gosun.jws.daomain.Users;
/**
* @author Ickes
*
*/
public interface UserService {
/**
* 测试返回list
*
* @return
*/
public List<Users> geAlltUsers();
/**
* 测试返回实体,以及传人普通参数
*
* @param id
* @return
*/
public Users getUser(String id);
/***
* 测试传入对象
*
* @param user
*/
public void save(Users user);
/**
* 测试传人集合
*
* @param users
*/
public void saves(List<Users> users);
}
3.4、UserService服务实现类
使用注解@WebService进行标识类,该类便是一个对外访问WebService,默认情况里面所有的public方法都是可以对外访问
import java.util.List;
import javax.jws.WebService;
import com.gosun.jws.daomain.Users;
import com.gosun.jws.daomain.UsersFactory;
@WebService()
public class UserServiceImpl implements UserService {
@Override
public List<Users> geAlltUsers() {
return UsersFactory.getUsers();
}
@Override
public Users getUser(String id) {
System.out.println(id);
return UsersFactory.getUser();
}
@Override
public void save(Users user) {
System.out.println(user.toJson());
}
@Override
public void saves(List<Users> users) {
for (Users u : users) {
System.out.println(u.toJson());
}
}
}
3.5、服务器端发布
import javax.xml.ws.Endpoint;
/**
* 默认发布的是soap1.0的服务
* @author Ickes
*/
public class ServiceDemo {
public static void main(String[] args) {
String address ="http://localhost:8080/webservice";
//指定端口进行发布,如果是web服务,不能与当前web服务器的端口冲突
Endpoint.publish(address,new UserServiceImpl());
}
}
4、客户端调用
使用jdk自带的wsimport命令进行生成客户端代码,语法如下
wsimport -p packageName -keep wsdl_address
例如执行如下代码,会在包com.gosun.jws.webservice.service.client目录下面生成调用http://localhost:8080/webservice?wsdl的源码跟java类
wsimport -p com.gosun.jws.webservice.service.client -keep http://localhost:8080/webservice?wsdl
客户端调用代码如下:
import java.util.List;
/**
* 客户端调用
* @author Ickes
*/
public class Main {
public static void main(String[] args) {
//在客户端示例化一个WebService
UserServiceImplService usi = new UserServiceImplService();
//获取服务类型,get、post、soap 使用jdk发布仅仅只支持soap
UserServiceImpl us = usi.getUserServiceImplPort();
Users user = us.getUser("a001");
System.out.println(user.getUserName());
System.out.println("----------------------------------------");
List<Users> users = us.geAlltUsers();
for (Users u : users) {
System.out.println(u.getUserName());
}
us.save(user);
us.saves(users);
}
}
客户端打印如下:
admin1
----------------------------------------
admin1
admin2
admin3
服务器端打印如下:
a001
{"userId":"A001","userName":"admin1","userPwd":"123456","sex":1,"sal":20.0,"birthday":"Dec 18, 2015 3:06:13 PM"}
{"userId":"A001","userName":"admin1","userPwd":"123456","sex":1,"sal":20.0,"birthday":"Dec 18, 2015 3:06:13 PM"}
{"userId":"A002","userName":"admin2","userPwd":"123456","sex":0,"sal":20.0,"birthday":"Dec 18, 2015 3:06:13 PM"}
{"userId":"A003","userName":"admin3","userPwd":"123456","sex":1,"sal":60.0,"birthday":"Dec 18, 2015 3:06:13 PM"}