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


 

前面是基于java Application发布webservice的服务,现在我们以前看一个用Tomcat发布服务的过程。

 

这个WebService主要是对书的管理的小功能实现。

 

1、首先我们建立一个Dynamic WEB项目,看下这个项目的结构:

 

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

 

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要自己到上面提供的官网下载,有什么问题或意见欢迎提出。

 

 

你可能感兴趣的:(tomcat,jax-ws)