您的位置:首页 > 编程语言 > Java开发

用JAVA开发WEB Service

2015-10-31 11:21 393 查看
一 学习前的准备

开发环境 JBOSS4.05+axis1.4+JDK1.5

axis1.4下载地址: http://www.apache.org/dist/ws/axis/1_4/,选择axis-bin-1_4.zip

所需要的JAR包:

二 部署axis

以我们CreateGWS405产品为例,在产品server\default\deploy目录下新建一个应用,比如叫myService.war。在里面新建文件夹“WEB-INF”,将axis1.4以下目录中的web.xml文件拷贝到“WEB-INF”下。“axis-bin-1_4\axis-1_4\webapps\axis\WEB-INF“。然后将jar包拷贝到产品server\default\lib下。至此部署完毕。

三 开发webService服务端

用编辑器编写一个简单的服务类,代码如下:

import java.util.*;

import java.text.*;

public class SayHello {

public String say(String name){

System.out.println("call webservice say.....");

return " Hello " + name;

}

}

将该类复制到myService.war中与“WEB-INF”同级目录,然后更改其名字为”SayHello.jws”。

启动CreateGWS405,在浏览器地址输入http://localhost:88/myService/SayHello.jws?wsdl打开页面后你会看到

Click to see the WSDL <--点击链接,如果你上面的步骤都正常,类也没有带

其他包的话,那么就生成了wsdl了。

至此webService服务端发布成功,接下来就是编写客户端了。

四 开发webService客户端。(DLL方式)

这里为了方便测试,我们就以CreateGWS405产品为客户端,在create.war下新建一个JSP页面,代码如下:

String urlname = "http://localhost:88/myService/SayHello.jws?wsdl";

Service s = new Service();

Call call = (Call) s.createCall();

//要调用的方法名称

call.setOperationName("say");

call.setTargetEndpointAddress(urlname);

//方法传入一个String型参数,返回值也是String

String val = (String) call.invoke(new Object[] { "haha" });

System.out.println(val);

需要导入:import org.apache.axis.client.Call;

import org.apache.axis.client.Service;

至此一个简单的客户端就编写好了。上面服务端的方法参数是String,返回值也是String,而实际业务中可能还需要以int,boolean等类型做参数,而且参数不止一个。返回值有时是int有时又是集合ArrayList那该怎么做呢,请看下面这个服务端代码

import java.util.*;

import java.text.*;

public class SayHello {

public String say(String name){

System.out.println("call webservice say.....");

return " Hello " + name;

}

public ArrayList getList(String str){

ArrayList strs = new ArrayList();

System.out.println("call webservice getList.....");

strs.add("A");

strs.add("B");

strs.add("C");

strs.add(str);

return strs;

}

public String [] getStrs(String str,int a){

System.out.println("call webservice getStrs.....");

String[] abc = new String[a];

abc[0]=str;

return abc;

}

public int getInt(String arg){

System.out.println("call webservice getInt.....");

return arg.length();

}

}

这个服务端有4个方法,分别返回不同类型的值。客户端就要改成

String urlname = "http://localhost:8080/aixs_proxy_demo/SayHello.jws?wsdl";

Service s = new Service();

try {

Call call = (Call) s.createCall();

//要调用的方法名称

call.setOperationName("say");

call.setTargetEndpointAddress(urlname);

//方法传入一个String型参数,返回值也是String

String val = (String) call.invoke(new Object[] { "haha" });

System.out.println(val);

Call call4 = (Call) s.createCall();

//要调用的方法名称

call4.setTargetEndpointAddress(urlname);

call4.setOperationName("getList");

String st1 = "abc";

//传入参数类型为String

call4.addParameter(new QName("st1"), XMLType.XSD_STRING, ParameterMode.IN);

//返回一个ArrayList

call4.setReturnType(new QName("ArrayList"), ArrayList.class);

ArrayList list = (ArrayList) call4.invoke(new Object[] { st1 });

System.out.println("+++++" + list.size());

Call call2 = (Call) s.createCall();

String st2 = "abc";

int count = 303;

call2.setOperationName("getStrs");

call2.setTargetEndpointAddress(urlname);

//传入参数类型为String和int

call2.addParameter(new QName("st2"), XMLType.XSD_STRING, ParameterMode.IN);

call2.addParameter(new QName("count"), XMLType.XSD_INT, ParameterMode.IN);

//返回一个String[]

call2.setReturnType(new QName("String[]"), String[].class);

String[] strs = (String[]) call2.invoke(new Object[] { st2,

Integer.valueOf(count) });

System.out.println("-----" + strs.length);

Call call3 = (Call) s.createCall();

String st3 = "abcdefg";

call3.setOperationName("getInt");

call3.setTargetEndpointAddress(urlname);

//传入参数类型为String

call3.addParameter(new QName("st3"), XMLType.XSD_STRING, ParameterMode.IN);

//返回一个int

call3.setReturnType(new QName("Integer"), Integer.class);

Integer getint = (Integer) call3.invoke(new Object[] {st3});

System.out.println(getint);

} catch (Exception e) {

e.printStackTrace();

}

需要导入: import java.util.ArrayList;

import javax.xml.namespace.QName;

import javax.xml.rpc.ParameterMode;

import org.apache.axis.client.Call;

import org.apache.axis.client.Service;

import org.apache.axis.encoding.XMLType;

学习中需要注意的地方:

1、 在客户端调用其他程序的类时需要先把外部类引入到myService.war\WEB-INF\下新建classes文件夹,包路径与原类相同,如果是jar文件,则需要复制到myService.war\WEB-INF\lib下。这样.jws格式文件才能正确编译为.class文件。

2、 调用其他服务器上的webservice时需要注意一定要将包导入完全,如果包缺少会影响使用。

五 开发webService客户端。Dynamic Proxy方式 (代理方式)

还是以上面那个服务端为例,用代理的方式来调用webService我们只需要对客户端的代码进行修改就可以了,代码如下

String wsdlUrl = "http://localhost:8080/aixs_proxy_demo/SayHello.jws?wsdl";

String nameSpaceUri = "http://localhost:8080/aixs_proxy_demo/SayHello.jws";

// 服务名

String serviceName = "SayHelloService";

// 服务

String portName = "SayHello";

// 创建代理对像

ServiceFactory serviceFactory;

try {

serviceFactory = ServiceFactory.newInstance();

//创建远程服务

Service service = (Service) serviceFactory.createService(new URL(wsdlUrl), new QName(

nameSpaceUri, serviceName));

//向上转型为接口

MyServiceInterface proxy = (MyServiceInterface) service.getPort(

new QName(nameSpaceUri, portName), MyServiceInterface.class);

//调用相应方法

System.out.println("proxy.say ----"

+ proxy.say("li lei"));

System.out.println("proxy.getList ----"

+ proxy.getList("AAAA").size());

System.out.println("proxy.getStrs ----"

+ proxy.getStrs("BBBB",10).length);

System.out.println("proxy.getInt ----"

+ proxy.getInt("ABCDEFG"));

} catch (MalformedURLException e) {

e.printStackTrace();

} catch (ServiceException e) {

e.printStackTrace();

}

需要导入:

import java.net.MalformedURLException;

import java.net.URL;

import javax.xml.namespace.QName;

import javax.xml.rpc.ServiceException;

import javax.xml.rpc.ServiceFactory;

import org.apache.axis.client.Service;

MyServiceInterface接口类的编写

import java.rmi.Remote;

import java.util.*;

public interface MyServiceInterface extends Remote{

public String say(String name);

public ArrayList getList(String str);

public String [] getStrs(String str,int a);

public int getInt(String arg);

}

需要注意的是:

1、 接口必须继承Remote类,才能做代理

2、 接口里面的方法必须和jws文件中的方法保持一致。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: