简单webservice服务创建并调用

来源:互联网 发布:微信网上订餐系统源码 编辑:程序博客网 时间:2024/05/16 05:02

简单webservic服务创建与调用

1.Webservice接口文档

      首先我想通过该文档向大家展示一下该博客要做的功能以及目的。

1.1 项目






服务端提供webservice服务(为数据传出者),客户端调用服务端的webservice服务(为数据请求者)。


1.2请求参数

请求字段

说明

是否必填

备注

示例

错误示例

name

带有小写字母的字符串(string)

shi示例

Shili;

Cccc;


 

SHILI;

---SHI;

1.3响应数据

报文字段

说明

是否必填

备注

示例

错误提示

name

对参数进行小写字母转大写,并拼接字符串操作。

(string)

 

    -

示例针对上表第一条示例参数

Hello: SHI示例!Welcome to the League of Draven

您输入的参数有误(不含有任何小写字母)!


1.4请求URL

http://192.168.212.25:8080/Struts_2.0/hello.jsp


2.创建自己的webservice

必须工具:JDK1.8(这里使用soap1.1,所以JDK1.6以上一般都没有什么问题),eclipse(版本没啥影响)

2.1创建工程


如图创建一个动态的web project即可,名字自己随便取我这里是WebService,然后一路next;

2.2.创建webservice类



创建好服务类就可以编写其中的代码了(注意我那有一个Type already exists是因为我已经建好了,没建的不会报错),我的代码示例如下:

package com.ustcinfo.service1;import javax.jws.WebMethod;import javax.jws.WebService;import javax.xml.ws.Endpoint;/** * @WebService - 它是一个注解,用在类上指定将此类发布成一个ws. Endpoint – *             此类为端点服务类,它的方法publish用于将一个已经添加了@WebService注解对象绑定到一个地址的端口上。 *  * @author chen *  */@WebServicepublic class HelloWebService {    public String HelloWord(String name) {        char letters[] = new char[name.length()];//将传进来的参数存放到一个char类型的一维数组里面        for(int i=0;i<name.length();i++){//遍历数组将数组中的小写字母转化为大写字母            char c = name.charAt(i);            if(c>='a' && c<='z'){                c = (char) (c-32);                letters[i]=c;            }else{                letters[i]=c;            }        }        //返回的结果是传入的参数中的小写转化为大写字母其余不变,然后再拼接其他字符串。        return "Hello: " + new String(letters)+"!Welcome to the League of Draven";    }    /**     * 添加exclude=true后,HelloWord2()方法不会被发布     *      * @param name     * @return     */    @WebMethod(exclude = true)    public String HelloWord2(String name) {        return "Hello: " + name+"!Welcome to the League of Draven";    }public static void main(String[] args) {  /**  *address:服务的发布地址  *Endpoint:服务的实现 */      //给服务分配地址    String address="http://192.168.212.25:6666/helloWord";    //发布服务    Endpoint.publish("http://192.168.212.25:6666/helloWord",new HelloWebService());    //打印WSDL文档的地址    System.out.println("访问wsdl的地址是:"+address+"?WSDL");    }}
为上述代码解释五点东西:

1.发布的函数是该类中的所有public方法且非static的。

    不免有人问了这里面有一个Helloword2方法没有发布啊,那是因为添加了@WebMethod(exclude = true)注解,所以以后要有必须要的public的方法,又不想被发布的时候就是用该注解


2.发布的函数Helloword(String name)需要一个String类型参数,下面的参数处理可以根据自己的需要,我的是修改参数大小写以及添加新字符串,这样方法大家能联想自己能怎么去处理。


3.发布服务,我使用的是自己的本地的IP,要保证端口未被其他项目所占用。还有一点,同一个端口可以发布多个服务,比如

      String address="http://192.168.212.25:6666/helloWord";

      String address="http://192.168.212.25:6666/helloWord2";

      String address="http://192.168.212.25:6666/helloWord3";

都是可以的。这里只说明一下不论证了,毕竟不是该博客的重点。

   发布服务使用的是Endpoint函数,具体可百度,也不论述了。


4.地址的配置,大家如果是使用本地的IP的话,可以使用ipconfig命令在dos窗口下查看自己的ip地址


5.最后打印的WSDL文档是什么东西?

  大家做到这应该是可以运行该服务了,而后台只是打印了:访问wsdl的地址是:http://192.168.212.25:6666/helloWord?WSDL

千万不要小看这个东西,这里我简单说一下他能在生成的相应的代码,供我们调用服务使用,后面会详细介绍。



3.调用自己创建的服务

3.1建立动态的web项目,构建过程跟上述一样。


请忽略我红色方框以外 的东西,这个项目是我练习Struts2时临时建立的一个项目,使用这个项目是方便我能在页面上展示。

首先看我的com.ustcinfo.client2这个包,里面除了_Main.java这个类,其他类并不是我建的。哈哈,这里就用到了上面所说的WSDL文档了,

<1>首先我们运行我们建立的web服务


如果没有报错的话就会打印访问wsdl的地址是:http://192.168.212.25:6666/helloWord?WSDL

报错的话,一般情况下就是地址分配有误,一:查看是否端口被占用,二检测自己本机地址有没有错误(有时候本机地址在不同的局域网或者不同时间的时候会变化)

<2>调用服务前提准备

     我们运行了我们服务之后,在IE浏览器中打开:

http://192.168.212.25:6666/helloWord?WSDL 我们会看到相应的XML文件,是不是很神奇,这都是apache的功劳,在这个xml文件中我们可以看到我们服务的相应信息,比如服务名,port方式,发布的方法,初学者,我们暂时不用去管这些,我们先看看怎么把这个东西变成我们所需要的。

  (1)打开dos界面

          随便进入一个磁盘,这里C盘为例,使用命令md test建立test文件夹,cd test进入该文件夹。

        使用命令wsimport -s . -p com.ustcinfo.client2 http://192.168.212.23:6666/helloWorld?WSDL

(也许有人要问了,上面的地址明明是192.168.212.25,下面怎么变23了,那是因为我昨天的本机地址是25,今天早上一看就成23了,解释一下以示严谨,哈哈

命令wsimport是编译WSDL文档的命令,-s是生产源代码的,-p com.ustcinfo.client2 是以我们想要的文件目录结构构建。后面的地址就是我们在后台打印的地址。

         

 (2)如果执行结果如上如所示便是执行成功了,这时候我们就到我们的test目录下看一看


 首先看目录层次,确实是我们命令写的那样,再看内容我们发现居然多了许多java和class文件,这就是WSDL文档的作用。我们对这些内容还要处理一下,先把里面所有的.class文件删除,只要java文件。然后返回到com文件夹下面,复制com文件夹到我们第二个建立的项目中,就是我上面介绍的中出现的位置。


3.2编写服务调用代码

  我是用页面形式展示的,使用了strust框架,我先说这个吧,看上去比较顺眼。待会儿我讲一下直接调用服务,不带其他技术的东西。

  hello.jsp(主界面)

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body><form action="login/hello" method="post">请输入带有小写字母的字符串:<input name="name" type="text"/><input type="submit" value="提交"></form></body></html>

helloAction.java(后台action)
package com.mystruts.action;import com.ustcinfo.client2.HelloWebService;import com.ustcinfo.client2.HelloWebServiceService;public class helloAction {private String name;//参数名private String result;//返回的结果public String submit(){//构建我们需要的服务对象HelloWebServiceService hw = new HelloWebServiceService();HelloWebService hws = hw.getHelloWebServicePort();//这里是对是否含有小写字母的条件判断,别的方法有别的方法的处理方式(非必须)String rs = hws.helloWord(this.getName());System.out.println(rs);System.out.println(name);boolean a = false;for(int i=0;i<name.length();i++){char c = name.charAt(i);if (Character.isLowerCase(c)){a = true;}}if(a){this.setResult(rs);//将调用服务之后的结果赋给resultreturn "success";//返回调用成功界面}else{return "error";//返回参数输入有误界面}}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getResult() {return result;}public void setResult(String result) {this.result = result;}}
hello_success.jsp(调用成功界面)

    <%@ page language="java" contentType="text/html; charset=UTF-8"          pageEncoding="UTF-8"%>      <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">      <%@ taglib prefix="s" uri="/struts-tags" %>            <html>      <head>      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">      <title>调用成功</title>      </head><body>您输入的参数为:<s:property value="name"/><br>返回的结果为:<s:property value="result"/><br><a href="http://192.168.212.25:6666/helloWord?WSDL">WSDL文档</a><br>(WSDL文档打开报错请更换浏览器尝试!)</body></html>


hello_error.jsp(调用失败界面)

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body>您输入的参数有误(不含有任何小写字母)!</body></html>

3.3运行结果调试



可以看到我们的服务调用成功了。(第二次提示,有错误的话,首先看地址一般都是地址有问题,其次看代码逻辑。)



3.3最后我们看一下直接在后台看服务调用吧

    这里的代码直接写在_Main.java里面

 _Main.java

package com.ustcinfo.client2;public class _Main {public static void main(String[] args) {// TODO Auto-generated method stubHelloWebServiceService hw = new HelloWebServiceService();HelloWebService hws = hw.getHelloWebServicePort();String rs = hws.helloWord("chenASSS");System.out.println(rs);}}
执行结果:


可以看到后台打印结果,说明我们服务调用成功了!







2 0
原创粉丝点击