參看博文: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>