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


相关推荐

  • Delphi 2010下载+完美激活成功教程「建议收藏」

    Delphi 2010下载+完美激活成功教程「建议收藏」点击链接进入http://altd.embarcadero.com/download/RADStudio2010/delphicbuilder_2010_3615_win.isoRADStudio/

  • 在线电影资源的版式说明

    在线电影资源的版式说明http://tieba.baidu.com/f?kz=47439298http://wenku.baidu.com/view/74cadfd0b9f3f90f76c61bca.htmlhttp://wenku.baidu.com/view/a14f7410ff00bed5b9f31d9b.html一、在线电影资源的常见版式(按画质排列)1. CAM(枪版) CA

  • spdlog用法

    spdlog用法转自:https://blog.csdn.net/haojie_superstar/article/details/89383433?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-19.control&dist_request_id=1328730.643.16167433128441371&depth_1-utm_source=distribute.pc_relevant.none-task-bl

  • 前端页面的简单学习与项目搭建(主要针对HTML和VUE的学习)「建议收藏」

    备注:只是本人的自学与备注,自己本身不是做前端的,只是简单搭建一些前端的东西,自己玩的。一、HTML简单的回顾(一)HTML基本结构<!DOCTYPEHTMLPUBLIC”-//W3C//DTDHTML4.01Transitional//EN””http://www.w3.org/TR/html4/loose.dtd”><html&…

  • 如何直接运行jar包_怎么运行jar文件

    如何直接运行jar包_怎么运行jar文件怎么后台运行jar包1.后台运行jar包[root@slaver5testshanghai]#nohupjava-jarplaningprojectweb-2020120813.jar&nohup:不挂断地运行命令,输出都将附加到当前目录的nohup.out文件中。如果当前目录的nohup.out文件不可写,输出重定向到$HOME/nohup.out文件中&:后台运行查看nohup.out[root@slaver5testshanghai]#cat

  • 文件服务器的搭建(linux文件服务器搭建)

    经过两天的研究终于把文件服务器搞定了,现在给各位午饭分享一下哦。前期准备工作:server2003系统,AD活动,域首先在server2003上建立域,然后一下边的图形为模板要求:1.所有的员工都能访问所属部门的共享文件和公司的共享文件,但是不能对该共享文件进行修改,只能读取。2.员工自己有自己私有的共享文件,该员工对自己的文件拥有所…

发表回复

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

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