webservice简介
服务端代码如下:
package com.xiao.demo; import java.util.ArrayList; import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebResult; import javax.jws.WebService; import javax.jws.WebParam.Mode; import javax.jws.soap.SOAPBinding; /* * 提供WebService服务的类 */ @WebService(name = "WSDemo", targetNamespace = "http://xiaochangwei.zicp.net/wstest", serviceName = "WSDemo") @SOAPBinding(style = SOAPBinding.Style.RPC) public class WSDemo { private ArrayList<Person> persons = new ArrayList<Person>();; /** * * 返回一个字符串 * * @param userName * @return */ @WebMethod(operationName = "toSayHello", action = "sayHello", exclude = false) @WebResult(name = "returnWord") // 自定义该方法返回值在WSDL中相关的描述 public String sayHello(@WebParam(name = "userName") String userName) { return "Hello:" + userName; } /** * web services 方法的返回值与参数的类型不能为接口 * * @param person * @return * @throws HelloException */ @WebMethod(operationName = "sayHello", action = "sayHello") @WebResult(partName = "personList") public Person[] sayHello(@WebParam(partName = "person", mode = Mode.IN) Person person, String userName) throws HelloException { if (person == null || person.getName() == null) { throw new HelloException("说hello出错,对像为空。。"); } persons.add(person); return persons.toArray(new Person[0]); } }
这样还不行,通过下面的代码发布:
package com.xiao.demo.jws.server; import java.util.LinkedList; import java.util.List; import javax.xml.ws.Binding; import javax.xml.ws.Endpoint; import javax.xml.ws.handler.Handler; import com.xiao.demo.WSDemo; /** * @author xiaochangwei * 启动web services服务 */ public class StartServer { /** * @param args */ public static void main(String[] args) { /* * 生成Example 服务实例 */ WSDemo serverBean = new WSDemo(); /* * 发布Web Service到http://localhost:8080/hello地址 */ Endpoint endpoint = Endpoint.publish("http://localhost:8080/hello", serverBean); Binding binding = endpoint.getBinding(); /* * 设置一个SOAP协议处理栈 这里就简单得打印SOAP的消息文本 */ @SuppressWarnings("rawtypes") List<Handler> handlerChain = new LinkedList<Handler>(); binding.setHandlerChain(handlerChain); System.out.println("服务已启动 http://localhost:8080/hello"); } }
执行成功后,浏览器地址输入 http://localhost:8080/hello?wsdl 回车,这就看到了全部的wdsl内容了
完善客户端
cmd后进入项目的根目录执行 wsimport -d ./bin -s ./src -p com.xiao.jws.client http://localhost:8080/hello?wsdl
看到下面信息表示成功了
然后刷新工程,看到了很多生成的java文件是不是,是就对了
客户端调用测试代码如下:
package com.xiao.demo.jws.client; public class RunClient { /** * @param args */ public static void main(String[] args) { //初始化服务框架类 Example_Service service = new Example_Service(); //或者本地服务借口的实例 Example server = (Example) service.getExamplePort(); try { //调用web service的toSayHello方法 System.out.println("---toSayHello---" + server.toSayHello("肖昌伟")); Person person = new Person(); person.setName("肖昌伟001"); person.setAge(28); //调用web service的sayHello方法,执行后会往list里面增加 server.sayHello(person, "肖哥哥"); person = new Person(); person.setName("肖昌伟002"); person.setAge(29); //调用web service的sayHello方法 PersonArray list = server.sayHello(person, "肖哥哥"); //输出返回值 System.out.println("----sayHello----"); for (Person p : list.getItem()) { System.out.println(p.getName() + ":" + p.getAge()); } } catch (HelloException_Exception e) { e.printStackTrace(); } } }
反复执行客户端的代码你会发现什么? 是不是列表打印出来的人重复了?
具体为啥 自己研究吧 这个so easy
测试任何代码一定要反复多次的执行,各种情况都要考虑到....
原文:http://www.cnblogs.com/xiaochangwei/p/4969448.html