前面是基于java Application发布webservice的服务,现在我们以前看一个用Tomcat发布服务的过程。
这个WebService主要是对书的管理的小功能实现。
1、首先我们建立一个Dynamic WEB项目,看下这个项目的结构:
2、首先看下实体类:Book.java
package com.lyl.vo; public class Book { private int bookId; private String bookName; private int bookPrice; public Book() { super(); } public Book(int bookId, String bookName, int bookPrice) { super(); this.bookId = bookId; this.bookName = bookName; this.bookPrice = bookPrice; } public int getBookId() { return bookId; } public void setBookId(int bookId) { this.bookId = bookId; } public String getBookName() { return bookName; } public void setBookName(String bookName) { this.bookName = bookName; } public int getBookPrice() { return bookPrice; } public void setBookPrice(int bookPrice) { this.bookPrice = bookPrice; } }
3、持久层 BookDao.java
package com.lyl.dao; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import com.lyl.vo.Book; public class BookDao { private Map<String,Book> bookMap=new HashMap<String,Book>(); private static BookDao bookDao; public static BookDao newStance(){ if( bookDao==null){ bookDao=new BookDao(); } return bookDao; } private BookDao(){ bookMap.put("三国演义", new Book(1,"三国演义",20)); } public void add(Book b) throws BookException{ if(bookMap.containsKey(b.getBookName())){ throw new BookException("此书已存在"); } bookMap.put(b.getBookName(), b); } public List<Book> list(){ ArrayList<Book> bookList=new ArrayList<Book>(); Set<String> bookNames=bookMap.keySet(); for(String bookName:bookNames){ bookList.add(bookMap.get(bookName)); } return bookList; } public Book findBookByName(String bookName) throws BookException{ Book book=bookMap.get(bookName); if(book==null){ throw new BookException("此书不存在"); } return book; } }
3、异常处理类:BookException.java(注意通过注解@WebFault表示是用来封装服务端程序处理过程中出现异常,以便通过消息传递到客户端,而不会在服务端报异常)
package com.lyl.dao; import javax.xml.ws.WebFault; @WebFault(faultBean="com.lyl.BookException",messageName="BookException" ,name="fault") public class BookException extends Exception { public BookException() { super(); // TODO Auto-generated constructor stub } public BookException(String message, Throwable cause) { super(message, cause); // TODO Auto-generated constructor stub } public BookException(String message) { super(message); // TODO Auto-generated constructor stub } public BookException(Throwable cause) { super(cause); // TODO Auto-generated constructor stub } }
3、具体的业务操作接口,也就WebService的服务接口
IBookBiz.java
package com.lyl.service; import java.util.List; import javax.jws.WebParam; import javax.jws.WebResult; import javax.jws.WebService; import com.lyl.dao.BookException; import com.lyl.vo.Book; @WebService public interface IBookBiz { @WebResult public void add(@WebParam(name="book")Book b) throws BookException; @WebResult(name="bookList") public List<Book> list(); @WebResult(name="book") public Book findBookByName(@WebParam(name="bookName")String bookName) throws BookException; }
实现类: BookBizImpl .java
package com.lyl.service; import java.util.List; import javax.jws.WebService; import com.lyl.dao.BookDao; import com.lyl.dao.BookException; import com.lyl.vo.Book; @WebService(endpointInterface="com.lyl.service.IBookBiz",targetNamespace="http://service.lyl.com") public class BookBizImpl implements IBookBiz { private BookDao bookDao=BookDao.newStance(); @Override public void add(Book b) throws BookException { bookDao.add(b); } public List<Book> list() { return bookDao.list(); } public Book findBookByName(String bookName) throws BookException { return bookDao.findBookByName(bookName); } }
需要的类我们都准备好了,现在是如何利用Tomcate在启动的时候将WebService发布出去,这里我们就需要引入第三方法的jar包,我们可以到http://jax-ws.java.net/2.2.5/ 官方网上下载所有基于java API for XML 开发webservice需要的jar包,拷贝其中lib目录下的jar包到项目中的lib目录下。
因为要在Tomcat启动时候就加载,因此在web.xml文件中配置如下内容:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <listener> <listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class> </listener> <!-- 其中是servlet-name和sun-jaxws中endpoint中的name一致 --> <servlet> <servlet-name>bookService</servlet-name> <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>bookService</servlet-name> <url-pattern>/book</url-pattern> </servlet-mapping> </web-app>
然后再WEB-INF目了下添加一个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表示一个发布的webservice服务,name要和web.xml中servlet的name一致,url-pattern和servlet的url-pattern一致--> <endpoint name="bookService" implementation="com.lyl.service.BookBizImpl" url-pattern="/book"/> </endpoints>
在endpoint中的url-pattern指定了我们可以通过"http://localhost:port/projectName/url_pattern"发布的地址。
因此在启动Tomcate后输入http://localhost:8080/test_soa_web1/book?wsdl将可以看到如下WSDL文件信息:
<?xml version="1.0" encoding="UTF-8" ?> - <!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2.5-b05 . --> - <!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2.5-b05 . --> - <definitions xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsp="http://www.w3.org/ns/ws-policy" xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://service.lyl.com" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://service.lyl.com" name="BookBizImplService"> <import namespace="http://service.lyl.com/" location="http://localhost:8080/test_soa_web1/book?wsdl=1" /> - <binding xmlns:ns1="http://service.lyl.com/" name="BookBizImplPortBinding" type="ns1:IBookBiz"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" /> - <operation name="add"> <soap:operation soapAction="" /> - <input> <soap:body use="literal" /> </input> - <output> <soap:body use="literal" /> </output> - <fault name="BookException"> <soap:fault name="BookException" use="literal" /> </fault> </operation> - <operation name="list"> <soap:operation soapAction="" /> - <input> <soap:body use="literal" /> </input> - <output> <soap:body use="literal" /> </output> </operation> - <operation name="findBookByName"> <soap:operation soapAction="" /> - <input> <soap:body use="literal" /> </input> - <output> <soap:body use="literal" /> </output> - <fault name="BookException"> <soap:fault name="BookException" use="literal" /> </fault> </operation> </binding> - <service name="BookBizImplService"> - <port name="BookBizImplPort" binding="tns:BookBizImplPortBinding"> <soap:address location="http://localhost:8080/test_soa_web1/book" /> </port> </service> </definitions>
同样我们通过wsimport 命令生成客户端代码:
新建客户端项目:添加客户端代码和测试类,引入Junit4库。
import java.util.List; import org.junit.Before; import org.junit.Test; import com.lyl.service.Book; import com.lyl.service.BookBizImplService; import com.lyl.service.BookException_Exception; import com.lyl.service.IBookBiz; public class TestBookService { IBookBiz bz; @Before public void init(){ BookBizImplService bbs=new BookBizImplService(); bz=bbs.getBookBizImplPort(); } @Test public void testAdd(){ Book book=new Book(); book.setBookId(2); book.setBookName("水浒传"); book.setBookPrice(100); try { bz.add(book); } catch (BookException_Exception e) { // TODO Auto-generated catch block System.out.println(e.getMessage()); } } @Test public void testList(){ List<Book> bookList=bz.list(); for(Book book:bookList){ System.out.println(book.getBookName()); } } @Test public void testFindByName(){ String bookName="销售"; try { Book book=bz.findBookByName(bookName); System.out.println(bookName+"的价格是:"+book.getBookPrice()); } catch (BookException_Exception e) { // TODO Auto-generated catch block System.err.println(e.getMessage()); } } }
好了,这就是整个的流程,下面有源码,不过jar要自己到上面提供的官网下载,有什么问题或意见欢迎提出。