您的位置:首页 > 编程语言 > Java开发

jdk1.6环境下开发web service的简单例子

2014-10-25 09:56 351 查看
在jdk1.6环境下开发web service是非常方便,因为jdk1.6已经集成了JAX-WS,大大减低了开发中的编码难度。

首先定义服务接口

package com.lovo;

import javax.jws.WebMethod;

import javax.jws.WebService;

import javax.jws.soap.SOAPBinding;

import javax.jws.soap.SOAPBinding.Style;

import javax.jws.soap.SOAPBinding.Use;

import com.lovo.po.Book;

import com.lovo.po.Person;

@WebService

@SOAPBinding(style = Style.DOCUMENT,use = Use.LITERAL)

public interface TestService {

    @WebMethod

    public Person say(Book s);

}

 

 

@SOAPBinding(style = Style.DOCUMENT,use = Use.LITERAL) 指明绑定方式为DOCUMENT。

按照WS-I指导原则,use属性的取值选择literal。

 

然后实现服务接口

package com.lovo;

import java.util.ArrayList;

import java.util.List;

import javax.jws.WebService;

import com.lovo.po.Book;

import com.lovo.po.Person;

@WebService(endpointInterface="com.lovo.TestService")

public class TestServiceImpl implements TestService{

    public Person say(Book s){

        Person p = new Person();

        p.setId(4);

        p.setName(s.getName() + "........");

        

        List<Book> list = new ArrayList<Book>();

        list.add(new Book(1,"w"));

        list.add(new Book(2,"s"));

        list.add(new Book(3,"t"));

        p.setBookList(list);

        

        Book b = new Book(4,"测试");

        p.setBook(s);

        return p;

    }

}

 

在实现接口时通过

@WebService(endpointInterface="com.lovo.TestService")指定服务接口的全类名。

 

在接口和实现类中出现的Peson和Book是2个pojo。

package com.lovo.po;

public class Book {    

    public Book(){

    }

    

    public Book(int i,String n){

        this.id = i;

        this.name = n;

    }

    public int getId() {

        return id;

    }

    public void setId(int id) {

        this.id = id;

    }

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

    private int id;

    private String name;

}

 

package com.lovo.po;

import java.util.List;

public class Person {

    public int getId() {

        return id;

    }

    public void setId(int id) {

        this.id = id;

    }

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

    public List<Book> getBookList() {

        return bookList;

    }

    public void setBookList(List<Book> bookList) {

        this.bookList = bookList;

    }

    public Book getBook() {

        return book;

    }

    public void setBook(Book book) {

        this.book = book;

    }

    private int id;

    private String name;

    private List<Book> bookList;

    private Book book;

    

}

 

在Person类中,持有Book类的一个引用和1个Book类的集合属性。

 

整个服务端的开发就完成了,可以用EndPoint发布后查看wsdl。也可以发布到web容器中,例如:Tomcat

如何将上述代码发布到Tomcat中?

web.xml中需要添加以下内容

<listener>

        <listener-class>

            com.sun.xml.ws.transport.http.servlet.WSServletContextListener

        </listener-class>

    </listener>

    

    <servlet>

        <servlet-name>TestService</servlet-name>

        <servlet-class>

            com.sun.xml.ws.transport.http.servlet.WSServlet

        </servlet-class>

    </servlet>

    

    <servlet-mapping>

        <servlet-name>TestService</servlet-name>

        <url-pattern>/lovo</url-pattern>

    </servlet-mapping>

 

我的url映射为/lovo

 

另外在web.xml的同级目录下(也就是WEB-INF)需要定义一个sun-specific的配置文件,因为WSServletContextListener这个监听器会读取这个配置文件。文件命名为sun-jaxws.xml,内容:

<?xml version="1.0" encoding="UTF-8"?>

<endpoints xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime" version="2.0">

    <endpoint name="TestService" implementation="com.lovo.TestServiceImpl" url-pattern="/lovo" />

</endpoints>

实际上就是定义了服务名和服务的实现以及url映射。

在这个文件中可以指定多个服务端点。

 

现在发布项目到Tomcat中完成服务端部署。

 

但是在Tomcat启动过程中会大量出现ClassNotFoundException,在Tomcat6.0环境下,需要导入一些jar包。

以下是我导入的jar包

jaxb-impl-2.1.12.jar

jaxws-rt-2.1.4.jar

stax-ex-1.2.jar

streambuffer-0.8.jar

 

现在Tomcat,就可以正常启动了,同时生成了一些JAX-B工件,通过http://localhost:8888/service/lovo?wsdl来检查服务是否部署成功。

至此服务端开发结束。

 

 

在已知wsdl文件的情况下,利用jdk1.6中的wsimport工具,生成客户端支持代码非常方便。

例如:wsimport -keep -p service.client http://localhost:8888/service/lovo?wsdl
表示在当前目录下,依据http://localhost:8888/service/lovo?wsdl的内容,生成包名为service.client的java文件和class文件。

 

利用wsimport工具生成的客户端支持代码可以快速的进行客户端开发。

在这个例子中,通过

TestServiceImplService ss = new TestServiceImplService();

TestService service = ss.getTestServiceImplPort();

2行代码获取服务接口的引用,从而可以开始方法调用。

 

最后推荐一个jar包下载的好地方,http://www.jarvana.com/jarvana/。

在已知类名的情况下,可以找到相应的jar包。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java webservice jdk