Tomcate 发布基于JAX-WS的项目流程小案例
?
前面是基于java Application发布webservice的服务,现在我们以前看一个用Tomcate发布服务的过程。
?
这个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;@WebServicepublic interface IBookBiz {@WebResultpublic 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();@Overridepublic 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;@Beforepublic void init(){BookBizImplService bbs=new BookBizImplService();bz=bbs.getBookBizImplPort();}@Testpublic 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 blockSystem.out.println(e.getMessage());}}@Testpublic void testList(){List<Book> bookList=bz.list();for(Book book:bookList){System.out.println(book.getBookName());}}@Testpublic void testFindByName(){String bookName="销售";try {Book book=bz.findBookByName(bookName);System.out.println(bookName+"的价格是:"+book.getBookPrice());} catch (BookException_Exception e) {// TODO Auto-generated catch blockSystem.err.println(e.getMessage());}}}
?
?
好了,这就是整个的流程,下面有源码,不过jar要自己到上面提供的官网下载,有什么问题或意见欢迎提出。
?
?