简单的webService实例

2022-09-16 08:05:29 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

参看博文: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,源代码如下:

代码语言:javascript复制
    /* 
     * 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文件,该文件的内容如下:
代码语言:javascript复制
<?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文件
代码语言:javascript复制
<?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格式内容如下:

代码语言:javascript复制
    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包都是一样的

编写测试代码:

代码语言:javascript复制
/*
 * 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]”

代码语言:javascript复制
严重: 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文件中缺少如下红色部分

代码语言:javascript复制
<?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>  

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/162644.html原文链接:https://javaforall.cn

0 人点赞