簡單的webService實例

參看博文:http://nopainnogain.iteye.com/blog/791525

項目的源碼與所有jar包:http://pan.baidu.com/s/1qXQuDtE

本文主要是在原來的博文上的一些細節

1.開發的流程

此列子主要是在兩個項目上進行測試,一個是web項目充當服務器使用在上面提供兩個方法,一個是普通的java project充當測試項目,調用服務器的方法後就會返回一個字符串。從而實現兩個系統之間的通訊(webservice 可以實現跨編程語言和跨系統的多個項目之間的通信)

1.1項目需求

項目類型 項目名 類名
webproject WebServiceTest HelloService
java project ServiceClient TestHelloService

1.2需要導如的jar(兩個項目的jar包都一樣)

web:jar包需要放在WebContent/WEB-INF/lib

java:直接通過build path添加

1.3需要到的文件server-config.wsdd,service.bat,web.xml結構如下


1.4整體的結構如下



2.webservice服務器實現過程

2.1編寫服務器服務HelloService代碼

代碼提供了兩個函數,分別爲sayHello和sayHelloToPerson,源代碼如下:

    /* 
     * File name: HelloService.java 
     *  
     * Version: v1.0 
     *  
     * Created on Aug 2, 2008 9:40:20 AM 
     *  
     * Designed by Stephen 
     *  
     * (c)Copyright 2008 
     */  
    package com.sinosoft.webservice;    
      
    /** *//** 
     * @author Stephen 
     *  
     * Test web service 
     */  
    public class HelloService {    
        /** *//** 
         * 不帶參數的函數 
         *  
         * @return 返回Hello字符串 
         */  
        public String sayHello() {  
            return "Hello";  
        }  
      
        /** *//** 
         * 帶參數的函數 
         *  
         * @param name 
         *            名稱 
         * @return 返回加上名稱的歡迎詞 
         */  
        public String sayHelloToPerson(String name) {  
            if (name == null || name.equals("")) {  
                name = "nobody";  
            }  
            return "Hello " + name;  
        }  
    }  


2.2發佈webservice

要將HelloService類發佈爲WebService,需要先搭建Web應用。下面是在Tomcat下使用Axis(http://ws.apache.org/axis/)創建WebService服務的例子。

2.2.1在WEB-INF文件夾下web.xml文件,該文件的內容如下:

<?xml version="1.0" encoding="UTF-8"?>    
      
    <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web  
    Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">  
      
    <web-app>  
      <display-name>Apache-Axis</display-name>  
          
        <listener>  
            <listener-class>org.apache.axis.transport.http.AxisHTTPSessionListener</listener-class>  
        </listener>  
          
      <servlet>  
        <servlet-name>AxisServlet</servlet-name>  
        <display-name>Apache-Axis Servlet</display-name>  
        <servlet-class>  
            org.apache.axis.transport.http.AxisServlet  
        </servlet-class>  
      </servlet>  
      
      <servlet>  
        <servlet-name>AdminServlet</servlet-name>  
        <display-name>Axis Admin Servlet</display-name>  
        <servlet-class>  
            org.apache.axis.transport.http.AdminServlet  
        </servlet-class>  
        <load-on-startup>100</load-on-startup>  
      </servlet>  
      
      <servlet>  
        <servlet-name>SOAPMonitorService</servlet-name>  
        <display-name>SOAPMonitorService</display-name>  
        <servlet-class>  
            org.apache.axis.monitor.SOAPMonitorService  
        </servlet-class>  
        <init-param>  
          <param-name>SOAPMonitorPort</param-name>  
          <param-value>5001</param-value>  
        </init-param>  
        <load-on-startup>100</load-on-startup>  
      </servlet>  
      
      <servlet-mapping>  
        <servlet-name>AxisServlet</servlet-name>  
        <url-pattern>/servlet/AxisServlet</url-pattern>  
      </servlet-mapping>  
      
      <servlet-mapping>  
        <servlet-name>AxisServlet</servlet-name>  
        <url-pattern>*.jws</url-pattern>  
      </servlet-mapping>  
      
      <servlet-mapping>  
        <servlet-name>AxisServlet</servlet-name>  
        <url-pattern>/services/*</url-pattern>  
      </servlet-mapping>  
      
      <servlet-mapping>  
        <servlet-name>SOAPMonitorService</servlet-name>  
        <url-pattern>/SOAPMonitor</url-pattern>  
      </servlet-mapping>  
      
     <!-- uncomment this if you want the admin servlet -->  
     <!--  
      <servlet-mapping>  
        <servlet-name>AdminServlet</servlet-name>  
        <url-pattern>/servlet/AdminServlet</url-pattern>  
      </servlet-mapping>  
     -->  
      
        <session-config>  
            <!-- Default to 5 minute session timeouts -->  
            <session-timeout>5</session-timeout>  
        </session-config>  
      
        <!-- currently the W3C havent settled on a media type for WSDL;  
        http://www.w3.org/TR/2003/WD-wsdl12-20030303/#ietf-draft  
        for now we go with the basic 'it's XML' response -->  
      <mime-mapping>  
        <extension>wsdl</extension>  
         <mime-type>text/xml</mime-type>  
      </mime-mapping>  
        
      
      <mime-mapping>  
        <extension>xsd</extension>  
        <mime-type>text/xml</mime-type>  
      </mime-mapping>  
      
      <welcome-file-list id="WelcomeFileList">  
        <welcome-file>index.jsp</welcome-file>  
        <welcome-file>index.html</welcome-file>  
        <welcome-file>index.jws</welcome-file>  
      </welcome-file-list>    
      
    </web-app>  

在上面的web.xml中主要是配置了axis的相關配置。

添加jar,具體的將位置和jar包在目錄結構已經說了

至此,操作正常的話應該可以看到如下界面:

訪問:http://127.0.0.1:8080/WebServiceTest/services

後臺控制檯:


原因是缺少了一個server-config.wsdd文件

2.2.2在WebContent/WEB-INF/lib創建server-config.wsdd文件

<?xml version="1.0" encoding="UTF-8"?>
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
	xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
	<handler type="java:org.apache.axis.handlers.http.URLMapper"
		name="URLMapper" />
	<!-- Services from SSOService WSDL service -->
	<service name="HelloServices" provider="java:RPC">
		<parameter name="className" value="com.sinosoft.webservice.HelloService" />
		<parameter name="allowedMethods" value="*" />
	</service>
	<transport name="http">
		<requestFlow>
			<handler type="URLMapper" />  
		</requestFlow>
	</transport>
</deployment>      

 發佈WebService需要使用現有的AdminService來實現,這裏寫了一個批處理文件來發布WebService,以後如果需要發佈其他文件,只需要修改相應的參數就可以了。


至此,能夠正常訪問http://127.0.0.1:8080/WebServiceTest/services界面如下:表示發佈成功!



2.2.3創建批處理文件service.bat

直接在項目中創建批處理文件是不能夠修改裏面的內容的,這個時候的解決方法需要先把後罪名改爲xml格式內容如下:


    java -cp axis-ant.jar;axis-schema.jar;axis.jar;commons-discovery-0.2.jar;commons-logging-1.0.4.jar;jaxrpc.jar;log4j-1.2.8.jar;saaj.jar;wsdl4j-1.5.1.jar;xmlsec-1.3.0.jar org.apache.axis.client.AdminClient -lhttp://localhost:8080/WebServiceTest/services/AdminService server-config.wsdd  
      
    pause  

  其中上面的jar包我都拷到和bat文件在同一個目錄,現在將所有的jar文件都加入到classpath中進行執行。

-l後的參數是本地要發佈WebService的AdminService對應的訪問地址。

 最後server-config.wsdd是對應的配置文件名稱。

至此,訪問http://127.0.0.1:8080/WebServiceTest/services/HelloServices?wsdl可以看到如下wsdl的內容:




3.創建java project 工程調用發佈的webservice

導入jar包,兩個項目的jar包都是一樣的

編寫測試代碼:

/*
 * File name: TestHelloService.java
 * 
 * Version: v1.0
 * 
 * Created on Aug 2, 2008 9:54:10 AM
 * 
 * Designed by Stephen
 * 
 * (c)Copyright 2008
 */
package test.com.sinosoft.webservice;

import java.io.IOException;
import java.net.MalformedURLException;

import javax.xml.namespace.QName;
import javax.xml.rpc.ServiceException;

import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * @author Stephen
 * 
 * 測試調用WebService
 */
public class TestHelloService {
    private static final Log log = LogFactory.getLog(TestHelloService.class);
    private static final String HELLO_SERVICE_ENDPOINT = "http://127.0.0.1:8080/WebServiceTest/services/HelloServices?wsdl";

    public static void main(String[] args) {
        TestHelloService tester = new TestHelloService();
        // tester.callSayHello();
        tester.callSayHelloToPerson();
        tester.callSayHello();
    }
  
    public void callSayHello() {
        try {
            Service service = new Service();
            Call call = (Call) service.createCall();
            call.setTargetEndpointAddress(new java.net.URL(
                    HELLO_SERVICE_ENDPOINT));
            //下面名字查詢的http://127.0.0.1:8080/WebServiceTest/services/HelloServices?wsdl文件裏有
            call.setOperationName(new QName("http://webservice.sinosoft.com/",
                    "sayHello"));
            call.setReturnType(org.apache.axis.Constants.XSD_STRING);
            try {
            	//遠程調用發佈的方法
                String ret = (String) call.invoke(new Object[] {});
                System.out.println("The return value is:" + ret);
                return;
            } catch (IOException e) {
                e.printStackTrace();
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (ServiceException e) {
            e.printStackTrace();
        }
        log.error("call sayHello service error!");
    }

    public void callSayHelloToPerson() {
        try {
            Service service = new Service();
            Call call = (Call) service.createCall();
            call.setTargetEndpointAddress(new java.net.URL(HELLO_SERVICE_ENDPOINT));
            call.setOperationName(new QName("http://webservice.sinosoft.com/",
                    "sayHelloToPerson"));
            call.addParameter("name", org.apache.axis.Constants.XSD_STRING,
                    javax.xml.rpc.ParameterMode.IN);
            call.setReturnType(org.apache.axis.Constants.XSD_STRING);
            try {
                String ret = (String) call.invoke(new Object[] { "Stephen" });
                System.out.println("The return value is:" + ret);
                return;
            } catch (IOException e) {
                e.printStackTrace();
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (ServiceException e) {
            e.printStackTrace();
        }
        log.error("call sayHello service error!");
    }
}

需要將server.bat文件和server-config.wssd一起方法tomcat下的hellowservice下的calss下的web-inf 下


4.常見問題

4.1編譯後的在tomcat 的webapps下沒有看到生成的編譯代碼

解決方案:

雙擊tomcat服務器選擇第二項:use tomcat installation,deploy path選擇爲webapps

4.2運行的時候報出不允許有匹配“[xX][mM][lL]”

嚴重: Parse Fatal Error at line 1 column 9: 不允許有匹配 "[xX][mM][lL]" 的處理指令目標。
org.xml.sax.SAXParseException; systemId: jndi:/localhost/WebServiceTest/WEB-INF/web.xml; lineNumber: 1; columnNumber: 9; 不允許有匹配 "[xX][mM][lL]" 的處理指令目標。
原因:xml文件的第一代碼必須靠左,複製的代碼格式對不上就會包這個錯誤,解決的幫發就是刪掉第一行的空格使其右對齊

4.3訪問http://127.0.0.1:8080/WebServiceTest/services/HelloServices?wsdl出現異常could not generate WSDL!

AXIS error

Could not generate WSDL!

There is no SOAP service at this location

這個原因是wssd文件中缺少如下紅色部分

<?xml version="1.0" encoding="UTF-8"?>
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
	xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
	<handler type="java:org.apache.axis.handlers.http.URLMapper"
		name="URLMapper" />
	<!-- Services from SSOService WSDL service -->
	<service name="HelloServices" provider="java:RPC">
		<parameter name="className" value="com.sinosoft.webservice.HelloService" />
		<parameter name="allowedMethods" value="*" />
	</service>
	<!-- <transport name="http">
		<requestFlow>
			<handler type="URLMapper" />  
		</requestFlow>   
	</transport> -->
</deployment>  







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章