一、webservice概念
webservice用于异构平台之间的交互,我用Java写的程序,可以用php、.net、pythod等其它语言的程序来访问我的接口.webservice有很多框架帮我们实现如CXF、Axis、Netro等,Java也提供了webservice的实现JAX-WS.
二、快速创建一个基于JWS的webservice项目
1、服务器的建立
//SEI(service Endpoint interface) @WebService //@WebService注解可以指定wsdl文件definitions标签的targetNamespace等内容 public interface IMyService { //@WebResult和@WebParam指定生成的wsdl属性名 @WebResult(name="addResult") public int add(@WebParam(name="a")int a,@WebParam(name="b")int b); @WebResult(name="minusResult") public int minus(@WebParam(name="a")int a,@WebParam(name="b")int b); @WebResult(name="loginUser") public User login(@WebParam(name="username")String username,@WebParam(name="password")String password); }
//SIB(service Implemention Bean),endpointInterface指定实现的接口 @WebService(endpointInterface="org.zttc.service.IMyService") public class MyServiceImpl implements IMyService { public int add(int a, int b) { System.out.println(a+"+"+b+"="+(a+b)); return a+b; } public int minus(int a, int b) { System.out.println(a+"-"+b+"="+(a-b)); return a-b; } public User login(String username, String password) { System.out.println(username+" is logining"); User user = new User(); user.setId(1); user.setUsername(username); user.setPassword(password); return user; } }
//启动服务器,发布客户端访问地址 public class MyServer { public static void main(String[] args) { String address = "http://localhost:8888/ns"; Endpoint.publish(address, new MyServiceImpl()); } }
2、客户端的建立
public class TestClient { public static void main(String[] args) { //创建访问wsdl服务地址的url //wsdl网络服务描述语言是Web Service的描述语言 URL url = new URL("http://localhost:8888/ns?wsdl"); //通过Qname指明服务的具体信息 //"http://service.zttc.org/"是wsdl文件definitions标签的的targetNamespace //"MyServiceImplService""是wsdl文件definitions标签的的name QName sname = new QName("http://service.zttc.org/", "MyServiceImplService"); //创建服务 Service service = Service.create(url,sname); //实现接口,这个ms的获取有问题,依然依赖于IMyServie接口,实际开发不能向服务提供者要这个接口,wsimport优化 IMyService ms = service.getPort(IMyService.class); System.out.println(ms.add(12,33)); } }
3、测试
运行客户端,客户端打印出45,服务器打印a+b=45.
4、使用wsimport,解除客户端程序依赖IMyService接口的问题,cmd下执行如下命令:
之后将生成的Java文件拷贝到项目中:
编写客户端程序(已经解除了对接口的依赖,但感觉很麻烦):
public class TestClient2 { public static void main(String[] args) throws MalformedURLException { URL url = new URL("http://localhost:8888/ns?wsdl"); QName sname = new QName("http://service.zttc.org/", "MyServiceImplService"); MyServiceImplService msis = new MyServiceImplService(url,sname); IMyService ms = msis.getMyServiceImplPort(); System.out.println(ms.minus(29,11)); } }
5、wsdl简单理解(wsdl是Web Service的描述语言)
启动服务器,浏览器中输入:http://localhost:8888/ns?wsdl,查看内容,下个是文件内容各个标签含义:
definition:最外层标签,指定wsdl的targetNamespace和name.
types:定义访问的类型,通过http://localhost:8888/ns?xsd=1查看
message就是soap消息,webservice就是通过soap协议来完成客户端和服务端的通信,soap是webservice的核心.
portType指定服务器的接口,并且通过operation绑定相应的in和out消息:in表示参数,out表示返回值
binging指定传递消息所使用的格式
service指定服务所发布的名称
6、TCPmon工具的使用,截获客户端发的消息再转给服务端,可查看请求和相应的内容,类似查看http请求和相应一样,略.
7、编写webservice的时候是先写代码(代码优先),自动生成wsdl的xml文件,还是直接先写xml文件(契约优先).
三、使用JAXB完成对象和xml的转换
JAXB可以实现java对象转xml、json,以及xml和json转java对象.
public class TestJaxb { @Test public void test01() { try { JAXBContext ctx = JAXBContext.newInstance(Student.class);//Student类上加@XmlRootElement Marshaller marshaller = ctx.createMarshaller(); Student stu = new Student(1,"张三",21,new Classroom(1,"10计算机应用技术",2010)); marshaller.marshal(stu, System.out); } catch (JAXBException e) { e.printStackTrace(); } } @Test public void test02() { try { String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><student><age>21</age>.. JAXBContext ctx = JAXBContext.newInstance(Student.class); Unmarshaller um = ctx.createUnmarshaller(); Student stu = (Student)um.unmarshal(new StringReader(xml)); System.out.println(stu.getName()+","+stu.getClassroom().getName()); } catch (JAXBException e) { e.printStackTrace(); } } }
四、使用java自带的Stax处理xml,就是一套解析xml以及写xml的api.略.
五、soap协议(简单对象访问协议)
1、webservice通过soap协议来完成客户端和服务端的通信,soap是webservice的核心,soap协议是交换数据的一种协议规范,是一种轻量的、简单的、基于XML的协议,客户端和服务器通信的每一条 SOAP 消息就是一个普通的 XML 文档.
2、入门程序中,编写的客户端访问webservice是顶层的编写,其实底层是通过发送soap消息来通信的,这玩意和客户端访问web服务器一样,我们可以使用urlConnetion的应用层编程来实现,其实底层就是socket编程来实现的,再底层就是通过发送和相应http消息来通信.
3、使用soap协议来和webservice通信,非常底层,感觉平常不会用.就和发送http消息来和tomcat通信一样.
六、webservice开发的框架
在讲Web Service开发服务时,需要介绍一个目前开发Web Service的几个框架,分别为Axis,axis2,Xfire,CXF以及JWS(也就是前面所述的JAX-WS,这是Java6发布所提供的对Web Service服务的一种实现.
参考http://blog.csdn.net/apicescn/article/details/42965785
七、客户端调用WebService的方式:
1.通过wximport生成代码
2.通过客户端编程方式
3.通过ajax调用方式
4.通过 URL Connection 方式调用(HttpClient)
附:RMI、RPC、SOAP比较(他们都是SOA的实现):