转载请出自出处: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"}