简单webservice服务创建并调用

简单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
 * 
 */
@WebService
public 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);//将调用服务之后的结果赋给result
			return "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 stub
		HelloWebServiceService hw = new HelloWebServiceService();
		HelloWebService hws = hw.getHelloWebServicePort();
		String rs = hws.helloWord("chenASSS");
		System.out.println(rs);
	}

}
执行结果:


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







  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值