简单的webService实例

来源:互联网 发布:游戏编程需要怎么学 编辑:程序博客网 时间:2024/05/22 17:26

参看博文:http://nopainnogain.iteye.com/blog/791525

项目的源码与所有jar包:http://pan.baidu.com/s/1qXQuDtE

本文主要是在原来的博文上的一些细节

1.开发的流程

此列子主要是在两个项目上进行测试,一个是web项目充当服务器使用在上面提供两个方法,一个是普通的java project充当测试项目,调用服务器的方法后就会返回一个字符串。从而实现两个系统之间的通讯(webservice 可以实现跨编程语言和跨系统的多个项目之间的通信)

1.1项目需求

项目类型项目名类名webprojectWebServiceTestHelloServicejava projectServiceClientTestHelloService

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>  







原创粉丝点击