简单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);
}
}
执行结果:
可以看到后台打印结果,说明我们服务调用成功了!