一、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下执行如下命令:

webservice基础

之后将生成的Java文件拷贝到项目中:

webservice基础

编写客户端程序(已经解除了对接口的依赖,但感觉很麻烦):

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的实现):

webservice基础

 

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-10-11
  • 2021-08-17
  • 2021-11-11
  • 2021-08-17
  • 2021-12-01
  • 2021-06-26
猜你喜欢
  • 2021-11-01
  • 2021-12-01
  • 2021-12-27
  • 2021-08-02
  • 2021-05-26
相关资源
相似解决方案