lyl801013 发表于 2017-2-7 06:23:49

Tomcat 发布基于JAX-WS的项目流程小案例

  前面是基于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要自己到上面提供的官网下载,有什么问题或意见欢迎提出。
页: [1]
查看完整版本: Tomcat 发布基于JAX-WS的项目流程小案例