简单的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>  

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

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

(0)
上一篇 2022年7月21日 下午2:00
下一篇 2022年7月21日 下午2:00


相关推荐

  • 2014找工作总结-机会往往留给有准备的人

    转发请注明出处:http://blog.csdn.net/xiajun07061225/article/details/12844801其实我的求职过程在十一之前就已经结束了,总体讲比较顺利。参加面试的几家公司基本都拿到了offer,分别是阿里巴巴、美团网、创新工场涂鸦移动以及华为。当时也参加了其他公司的面试,比如人人,一面过后收到了二面通知,拒了。创新工场豌豆荚一面结束后等消息。十…

    2022年4月9日
    50
  • npm的卸载与安装流程

    安装1、下载地址为:https://nodejs.org/en/2、检查是否安装成功:如果输出版本号,说明我们安装node环境成功3、为了提高我们的效率,可以使用淘宝的镜像:http://npm.taobao.org/输入:npminstall-gcnpm–registry=https://registry.npm.taobao.org,即可安装npm镜像,以后再用到npm的地方…

    2022年4月5日
    433
  • 推荐使用C++ 11

    如果你的代码工作正常并且表现良好,你可能会想知道为什么还要使用C++11。当然了,使用用最新的技术感觉很好,但是事实上它是否值得呢? 在我看来,答案毫无疑问是肯定的。我在下面给出了9个理由

    2021年12月23日
    53
  • Response.AddHeader「建议收藏」

    Response.AddHeader「建议收藏」Response.AddHeader

    2022年7月1日
    28
  • navicat for mysql 15 激活码【2021.8最新】

    (navicat for mysql 15 激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlS32PGH0SQB-eyJsa…

    2022年3月26日
    187
  • 第k短路径_典型的分类算法K均值

    第k短路径_典型的分类算法K均值给定一张 N 个点(编号 1,2…N),M 条边的有向图,求从起点 S 到终点 T 的第 K 短路的长度,路径允许重复经过点或边。注意: 每条最短路中至少要包含一条边。输入格式第一行包含两个整数 N 和 M。接下来 M 行,每行包含三个整数 A,B 和 L,表示点 A 与点 B 之间存在有向边,且边长为 L。最后一行包含三个整数 S,T 和 K,分别表示起点 S,终点 T 和第 K 短路。输出格式输出占一行,包含一个整数,表示第 K 短路的长度,如果第 K 短路不存在,则输出 −1。数据范围

    2022年8月10日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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