简单的webService实例

简单的webService实例本文主要是描述了一个简单的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

简单的webService实例

java:直接通过build path添加

简单的webService实例

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

简单的webService实例

1.4整体的结构如下

简单的webService实例

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

简单的webService实例

后台控制台:

简单的webService实例

原因是缺少了一个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界面如下:表示发布成功!

简单的webService实例

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的内容:

简单的webService实例

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>  

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • java堆栈 (转)

    java堆栈 (转)

  • 小米5 Android 8.0解bl,小米解BL锁超详细的图文教程「建议收藏」

    小米5 Android 8.0解bl,小米解BL锁超详细的图文教程「建议收藏」BL锁全称bootloader锁,其中bootloader中文名称为“启动加载”,其主要作用是为了保护用户的隐私数据安全,在日常使用的时候感受不到BL锁的存在,但是如果你要对手机进行刷机的话,第一步就是必须先解除手机里的BL锁,部分机子不需要解BL锁,手机是否需要解锁请到手机官方网站进行查看或者咨询。解BL锁会清除手机所有的数据,相当于手机恢复出厂设置,记得提前备份好手机里的所有资料以下是小米解锁…

  • python和delphi哪个好_python编程时如何修改撤回

    python和delphi哪个好_python编程时如何修改撤回原博文2020-03-2818:10−复制行,在代码行光标后,输入Ctrl+d,即为复制一行,输入多次即为复制多行撤销上一步操作:Ctrl+z为多行代码加注释#代码选中的条件下,同时按住Ctrl+/,被选中行被注释,再次按下Ctrl+/,注…0319相关推荐2019-12-2423:37−djangoTermipython:manage.pymakemigrati…

  • React高阶组件实践

    React高阶组件实践前言React高阶组件,即Higher-OrderComponent,其官方解释是:Ahigher-ordercomponentisafunctionthattakesacomponentandreturnsanewcomponent.一个传入一个组件,返回另一个组件的函数,其概念与高阶函数的将函数作为参数传入类似。用代码来解释就是:const…

    2022年10月29日
  • C#自定义特性实例

    元数据,就是C#中封装的一些类,无法修改.类成员的特性被称为元数据中的注释.1、什么是特性(1)属性与特性的区别属性(Property):属性是面向对象思想里所说的封装在类里面的数据字段,Get

    2021年12月24日
  • pytorch学习笔记七:torchvision.datasets.ImageFolder使用详解

    pytorch学习笔记七:torchvision.datasets.ImageFolder使用详解一、数据集组织方式ImageFolder是一个通用的数据加载器,它要求我们以下面这种格式来组织数据集的训练、验证或者测试图片。root/dog/xxx.pngroot/dog/xxy.pngroot/dog/xxz.pngroot/cat/123.pngroot/cat/nsdf3.pngroot/cat/asd932_.png对于上面的root,假设data文件夹在.py文件…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号