開發環境:jdk1.6 + Tomcat7 + MyEclipse10
源碼下載地址張貼在文章最后面:首先是使用WSDL協議實現:這里使用XFire
XFire一個免費、開源的SOAP框架,它構建了POJO和SOA之間的橋梁,主要特性就是支持將POJO通過非常簡單的方式發布成Web服務,其原理是以接口反射機制自動取得遠程方法的
WSDL是一個用來描述Web服務和說明如何與Web服務通信的XML語言
准備:開發之前請先下載xfire-distribution-1.2.6.zip並解壓縮
(1)、新建一個Web項目(服務端),名稱為XFireWebService,其目的是為了測試WebService服務端
為工程添加XFire支持的類庫,把xfire-1.2.6里lib所有jar和xfire-all-1.2.6.jar拷貝到工程lib里
(2)、把XFire加載到系統中來,增加web.xml的配置信息
- <?xml version="1.0" encoding="UTF-8"?>
- <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
- http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
- <servlet>
- <servlet-name>XFireServlet</servlet-name>
- <servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class>
- <load-on-startup>0</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>XFireServlet</servlet-name>
- <url-pattern>/servlet/XFireServlet/*</url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>XFireServlet</servlet-name>
- <url-pattern>/services/*</url-pattern>
- </servlet-mapping>
- <welcome-file-list>
- <welcome-file>index.jsp</welcome-file>
- </welcome-file-list>
- </web-app>
(3)、創建Web服務接口,聲明該Web服務對外暴露的接口
- package com.test.ws;
- import java.util.List;
- /**
- * <p>Title: IHelloService</p>
- * <p>Description: 定義接口</p>
- */
- public interface IHelloService {
- public String getTestString(String str);
- public ExceedVO getTestObject(EnterVO vo);
- public List getTestList(List list);
- }
(4)、創建Web服務實現類,為Web服務接口提供實現
- package com.test.ws;
- import java.util.ArrayList;
- import java.util.List;
- /**
- * <p>Title: HelloServiceImpl</p>
- * <p>Description: 接口實現</p>
- */
- public class HelloServiceImpl implements IHelloService {
- @Override
- public String getTestString(String str) {
- return "Hello" + str;
- }
- @Override
- public ExceedVO getTestObject(EnterVO vo) {
- ExceedVO revo = new ExceedVO();
- revo.setDescStr("名稱:"+vo.getName()+"年齡:"+vo.getAge());
- return revo;
- }
- @Override
- public List getTestList(List list) {
- List<EnterVO> users = new ArrayList<EnterVO>();
- for(int i=0; i<9; i++){
- EnterVO user = new EnterVO("姓名"+i, i);
- users.add(user);
- }
- return users;
- }
- }
(5)、這兩個類是具體的業務實現類,對業務方法的具體實現放在里面
- package com.test.ws;
- import java.io.Serializable;
- /**
- * <p>Title: EnterVO</p>
- * <p>Description: 入參對象</p>
- */
- public class EnterVO implements Serializable {
- private static final long serialVersionUID = 1L;
- private String name;
- private int age;
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public EnterVO(String name, int age) {
- this.name = name;
- this.age = age;
- }
- public EnterVO() { }
- }
- package com.test.ws;
- import java.io.Serializable;
- /**
- * <p>Title: ExceedVO</p>
- * <p>Description: 出參對象</p>
- */
- public class ExceedVO implements Serializable {
- private static final long serialVersionUID = 1L;
- private String descStr;
- public String getDescStr() {
- return descStr;
- }
- public void setDescStr(String descStr) {
- this.descStr = descStr;
- }
- }
(6)、在src目錄下新建一個META-INF/xfire/services.xml,該文件是XFire框架的服務發布文件
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- 服務發布文件 -->
- <beans xmlns="http://xfire.codehaus.org/config/1.0">
- <service> <!-- service標簽和它所包含的xml內容為發布成Web服務的POJO提供完整的描述 -->
- <name>HelloService</name> <!-- Web服務被發布時所采用的唯一名稱 -->
- <namespace>http://test/HelloService</namespace> <!-- Web服務發布時所使用的命名空間 -->
- <serviceClass>com.test.ws.IHelloService</serviceClass> <!-- Web服務接口類的全名 -->
- <implementationClass>com.test.ws.HelloServiceImpl</implementationClass> <!-- Web服務實現類的全名 -->
- <!-- 不需要接口時,把業務寫在serviceClass標簽中 -->
- </service>
- </beans>
(7)、注意:當用到List等集合類型時,需要定義Mapping關系
必須與接口同名后綴.aegis.xml,而且要與接口同一位置
- <mappings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://xfire.codehaus.org/schemas/1.0/mapping.xsd">
- <!-- XFire可以支持基本類型,但針對集合類型時需要特殊配置 -->
- <mapping>
- <method name="getTestList"> <!-- 需要配置的方法名 -->
- <!-- index="0"代表方法的參數的序號0即第一個參數,componentType屬性代表集合參數內包含的類型 -->
- <parameter index="0" componentType="java.lang.String" />
- <!-- 配置返回類型,componentType屬性代表返回的集合中所包含的類 -->
- <return-type componentType="com.test.ws.EnterVO" />
- </method>
- </mapping>
- </mappings>
web.xml和service.xml都可以通過IDE自動生成,也可以手寫
(8)、到這步webService服務端就基本完成
部署項目,啟動Tomcat,測試一下wsdl,訪問http://localhost:8080/XFireWebService/services/HelloService?wsdl
如果能正確顯示wsdl文件,說明剛才的部署成功了!!!


(9)、再建一個Web項目(客戶端),名稱為XFireWebClient,其目的是用來調用一個webService服務
將XFire的庫文件拷貝到Web項目的WEB-INF\lib目錄下,同時需要將服務器端發布的服務打包發布給客戶端,發布給客戶端的代碼只需要打包接口和參數類即可,實現類不必打包到客戶端
這里發布的jar包名稱為IHelloService.jar,里面包含IHelloService、EnterVO、ExceedVO這三個類
(10)、在這個Web項目里面新建一個Servlet作為測試的Servlet,名稱為ClientTestServlet.java
在web.xml里面配置好這個Servlet后,就可以在Servlet里面寫webService調用的代碼了
- package com.test.ws;
- import java.io.IOException;
- import java.net.MalformedURLException;
- import java.util.ArrayList;
- import java.util.List;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import org.codehaus.xfire.XFire;
- import org.codehaus.xfire.XFireFactory;
- import org.codehaus.xfire.client.XFireProxyFactory;
- import org.codehaus.xfire.service.Service;
- import org.codehaus.xfire.service.binding.ObjectServiceFactory;
- /**
- * <p>Title: ClientTestServlet</p>
- * <p>Description: 測試Servlet</p>
- */
- public class ClientTestServlet extends HttpServlet {
- private static final long serialVersionUID = 1L;
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- request.setCharacterEncoding("UTF-8");
- Service serviceModel = new ObjectServiceFactory().create(IHelloService.class);
- XFire xfire = XFireFactory.newInstance().getXFire();
- XFireProxyFactory factory = new XFireProxyFactory(xfire);
- String serviceUrl = "http://localhost:8080/XFireWebService/services/HelloService";
- IHelloService client = null;
- try {
- client = (IHelloService) factory.create(serviceModel, serviceUrl);
- } catch (MalformedURLException e) {
- e.printStackTrace();
- }
- String str = client.getTestString("Beijing");
- request.setAttribute("str", str);
- EnterVO enterVO = new EnterVO();
- enterVO.setName("Yaodi");
- enterVO.setAge(26);
- ExceedVO vo = client.getTestObject(enterVO);
- request.setAttribute("vo", vo);
- List<String> al = new ArrayList<String>();
- al.add("111");
- al.add("222");
- al.add("333");
- List list = client.getTestList(al);
- request.setAttribute("list", list);
- request.getRequestDispatcher("/result.jsp").forward(request, response);
- }
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- doGet(request,response);
- }
- }
客戶端的web.xml如下所示:
- <?xml version="1.0" encoding="UTF-8"?>
- <web-app version="2.5"
- xmlns="http://java.sun.com/xml/ns/javaee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
- http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
- <servlet>
- <servlet-name>ClientTestServlet</servlet-name>
- <servlet-class>com.test.ws.ClientTestServlet</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>ClientTestServlet</servlet-name>
- <url-pattern>/ClientTest.do</url-pattern>
- </servlet-mapping>
- <welcome-file-list>
- <welcome-file>ClientTest.do</welcome-file>
- </welcome-file-list>
- </web-app>
(11)、注意:XFireWebService項目里的IHelloService.aegis.xml文件,也要放到XFireWebClient項目中來,位置與ClientTestServlet.java同級
(12)、Servlet返回的結果頁面:result.jsp
- <%@ page language="java" pageEncoding="UTF-8"%>
- <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
- <%@ page isELIgnored="false"%>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <title>測試客戶端</title>
- </head>
- <body>
- 測試客戶端!!!<br>
- String:${str} <br>
- Object:${vo.descStr} <br>
- List:<br>
- <c:forEach items="${list}" var="list">
- ${list.name} --- ${list.age} <br>
- </c:forEach>
- </body>
- </html>
(13)、同樣將這個Web項目發布,同時啟動XFireWebService和XFireWebClient這兩個應用,然后在地址欄里面輸入http://localhost:8080/XFireWebClient/
此時會調用客戶端的Servlet,然后調用其doGet方法,如果正常的話,可以看到頁面輸出結果了(*^__^*)
注:參考文章地址http://di201yao.iteye.com/blog/310292
源碼下載地址(測試通過,下載時需要修改tomcat服務器的端口,我用的端口是18080):http://download.csdn.net/detail/carboncomputer/8445449