想了解webservice学习心得的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于webservice入门的相关问题,此外,我们还将为您介绍关于axis2(Webservice)学习心得、W
想了解webservice学习心得的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于webservice入门的相关问题,此外,我们还将为您介绍关于axis2(Webservice)学习心得、WebService Behavior 学习心得、webservice学习之AXIS初学笔记--创建自己的webservice、webservice学习之使用java发布webservice以及调用的新知识。
本文目录一览:- webservice学习心得(webservice入门)
- axis2(Webservice)学习心得
- WebService Behavior 学习心得
- webservice学习之AXIS初学笔记--创建自己的webservice
- webservice学习之使用java发布webservice以及调用
webservice学习心得(webservice入门)
在写这个心得体会·之前我先感谢下我的同事小何同事(何秀明)。其实我和他身上有很多共同,有太多的痛苦学习经历(都是非软件专业毕业,靠自学成才),所以使得我和他在初次见面的时候就有很多共同的话题。真是相见恨晚的感觉。在工作上他给予我很大的帮助,,我也很欣赏他,,欣赏他对技术的渴望、执着。所以我一直把他当作学习的榜样。其他的不说了。
之前的工作中其实已经都用到了webservice提供的服务。只不过,那时候自己的水平底(现在也很低)都不知道怎么回事,就知道这样使用,不知道原理。后来听同事说过这个东西很流行所以就花点时间学习了,在这里我就不细说webservice的相关说明了,,网上很多。在这里推荐一个网站,,上面提供了很多的免费的服务。http://www.webxml.com.cn/zh_cn/web_services.aspx?offset=2;
axis2(Webservice)学习心得
最近写一个手机短信功能。就是把GSM接入到自己的系统中。在开发的过程中用到了,webservice和多线程知识。
因为之前没有接触过webservice,所以花了两天时间搞这个。在研究的过程中也是遇到了不少的问题。最终经过查资料,请教高人搞了了
来。今天把我的心得记下来,防止时间长了忘记,同时也能给想要学习webservice的同仁,提供一点参考。
费话少说,下面进入正题:
1.资源准备: axis2-1.5-bin.zip , axis2-1.5-war.zip 两个包。可以在apahce网站上下到最新版本。目前1.5是最新版本。
axis2-1.5-bin.zip解压后 如下图所示:lib包下包含axis2用到的所有jar包。samples是一些示例,学习的时候可以参考。
将axis2-1.5-war.zip 文件解压到相应的目录,将目录中的axis2.war文件放到<Tomcat安装目录>/webapps目录中(本文使用的Tomcat的版本是6.x),并启动Tomcat,可以直接运行。
启动toamct后,在IE中输入http://localhost:8080/axis2/ 看到如下界面,表示安装成功。
2. axis2安装成功后,就可以编写Webservice工程了。服务器端工程和正常的java工程一样编写,不要有任何顾及。java工程可以很轻松的发布成一个Webservice工程。
3. Webservice工程发布。正如我在2种所说,开发的时候,按正常的java工程去开发就可以。主要是在于发布。
我在学习的时候,上网查到的资料大部分是对一个java类的发布与测试,基本上没看见如何把一个Java工程发布置成Webservice工程。
后来发现其实很简单。
1). 把所有的java类文件,包括一些配置文件放置到 axis2/WEB-INF/classes 下。如下图:
我的类文件全在com文件包下,org文件是hibernate用到的类文件,如HibernateUtil类。
2). 把你工程中用到的jar包拷到 axis2/WEB-INF/lib 包下。该包下已经有axis2用到的所有jar包,只需把你工程中用到的其它包拷进去。
3). 把 meta-inf/services.xml 打成arr包。具体做法如下: 到运行下cd →粘贴classes路径回车→输入 jar cvf mobile.jar ./* →回车。把生成的mobile.jar 改名成为 mobile.aar(当然不改也行,改了较正规) ,然后拷入到 axis2/WEB-INF/services下。如下:
4).启动tomact服务,在IE中输入 http://localhost:8080/axis2/services/listServices ,便可看到我刚发布我的服务。如下图所示:
点服务名“Mobile”,可以查看wsdl文件。如下图所示。客户端调用的时候,就是根据wsdl文件调用。
上面讲述了如何发布Webservice工程。下面我来说一下,编写Webservice工程比较关键的几个点
1. 数据传递。 webservice 支持很多类型数据的传递,但对Date类型数据传递支持不好。我刚开始在传递对象时,对象中有一个Date类型的数据,怎么也传不过去,并且报错。后来才发现这个问题,改成String就好了。
axis2 可以传对象,对象数组。集合类型的数据必须放在对象中,作为一个属性传递,直接传是传不过去的。
2. 我的服务端接收类代码如下;
package com.css.mobile.mobilemsg;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.List;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.css.mobile.config.CommonConstaints;
import com.css.mobile.exception.ExceptionConfig;
import com.css.mobile.hibernate.dao.CommonDAO;
import com.css.mobile.hibernate.model.Phone;
import com.css.mobile.pojo.data.PhoneVO;
import com.css.mobile.resource.MobileMsg;
import com.css.mobile.resource.Phones;
import com.css.mobile.resource.Resource;
import com.css.mobile.thread.StartThread;
/**
* ReceiveMsg WebService对外接口类,用于接收客户端传过来的短信
* @author lizhh
*/
public class ReceiveMsg {
private static Log log = LogFactory.getLog(ReceiveMsg.class);
static{
StartThread.getInstance().startThread();
}
// 对外接口,用于接收客户端发过来的短信
public String receiveMsg(Phones phones){
String result = ExceptionConfig.getString("systemMsg.sendMsgError");
if(phones == null){
result = ExceptionConfig.getString("systemMsg.paramError");
}else{
PhoneVO[] list = phones.getList();
saveResource(Arrays.asList(list));
result = ExceptionConfig.getString("systemMsg.sendMsgSuccess");
}
return result;
}
/**
* 把短信放入数据库中
* @param phone 短信VO
*/
private void setMsgToDataBase(Phone phone){
phone.setPhoneDate(Calendar.getInstance().getTime());
CommonDAO.getInstance().add(phone);
}
/**
* 如果队列被加锁则不放入队列,如果没被加锁则放入队列
* @param phone 短信VO
*/
private void saveResource(List list){
Resource resource = MobileMsg.resourceMap.get(CommonConstaints.MAINTHREAD);
if(list !=null && !list.isEmpty()){
for(int i=0;i<list.size();i++){
PhoneVO phonevo = (PhoneVO)list.get(i);
Phone phone = setPhoneData(phonevo);
if(resource.isAlive()){
if(resource.isLock()){
phone.setPhonestate(CommonConstaints.notinQUEUE);
}else{
resource.setLock(CommonConstaints.LOCK);
phone.setPhonestate(CommonConstaints.NOSEND);
// 加入队列
resource.getPhoneList().add(phone);
resource.setLock(CommonConstaints.NOTLOCK);
}
}
// 存入数据库
setMsgToDataBase(phone);
}
}
}
public Phone setPhoneData(PhoneVO phonevo){
Phone phone = new Phone();
phone.setPhoneContent(phonevo.getPhoneContent());
phone.setPnoneNumber(phonevo.getPnoneNumber());
phone.setPhonestate(phonevo.getPhonestate());
return phone;
}
}
3. 客户端调用类如下:
package com.css.mobile.client;
import java.util.Calendar;
import javax.xml.namespace.QName;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;
import com.css.mobile.hibernate.model.Phone;
import com.css.mobile.pojo.data.PhoneVO;
import com.css.mobile.resource.Phones;
public class ExampleClient {
@SuppressWarnings("deprecation")
public static void main(String[] args)throws Exception{
RPCServiceClient serviceClient = new RPCServiceClient();
Options options = serviceClient.getoptions();
EndpointReference targetEPR = new EndpointReference("http://localhost:8080/axis2/services/Mobile?wsdl");
options.setTo(targetEPR);
options.setTimeOutInMilliSeconds(60000);
/**
* 客户端invoke方法的参数一:QName(发布方法的名称)
*/
QName opQueryResult = new QName("http://mobilemsg.mobile.css.com","receiveMsg");
/**
* 客户端invoke方法的参数二:Object[](发布方法的参数数组)
*/
Phones phones = new Phones();
java.util.List<PhoneVO> phoneList = new java.util.ArrayList<PhoneVO>();
PhoneVO phone1 = new PhoneVO();
phone1.setPnoneNumber("15110092285");
phone1.setPhoneContent("第一999aaa个短信测试");
phone1.setPhonestate("0");
phoneList.add(phone1);
phones.setList(new PhoneVO[]{phone1});
Object[] opQueryResultArgs = new Object[] {phones};
/**
* 客户端invoke方法的参数三:Class[](发布方法的返回类型)
*/
Class[] returnTypes = new Class[] {String.class };
/**
* 调用客户端的invoke方法
*/
Object[] response=serviceClient.invokeBlocking(opQueryResult,opQueryResultArgs,returnTypes);
String result=(String)response[0];
System.out.println(result);
}
}
上面代三中,Phones是一个对象,Phones中包括一个数组属性。
4. services.xml 代码如下: 该文件一定要放在 meta-inf 文件夹下。发布时一起打成aar包。
<?xml version="1.0" encoding="UTF-8"?>
<service name="Mobile">
<parameter name="ServiceClass">com.css.mobile.mobilemsg.ReceiveMsg
</parameter>
<operation name="receiveMsg">
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
https://www.jb51.cc/tag/cme/" target="_blank">cmessageReceiver" />
<actionMapping>urn:receiveMsg</actionMapping>
</operation>
</service>
我在上面侧重于讲解如何把一个java工程,发布成一个webservice工程,以及客户端如何调用服务端。还有就是数据传输问题。
至于axis2 (webservice) 我就不做详细介绍了。我在学习的过程,找到了一本很不错的书,推荐给大家,网址是:http://www.blogjava.net/nokiaguy/archive/2009/04/archive/2009/nokiaguy/archive/2009/nokiaguy/archive/2009/01/02/249556.html
这本书介绍的非常详细。大家一定要多看。
WebService Behavior 学习心得
XML Web services 行为使客户端脚本能够调用由 Microsoft .NET XML Web services 或其他支持简单对象访问协议 (SOAP) 的 Web 服务器公开的远程方法。
目的:提供一种简单的方法使用和利用 SOAP,而不需具有 SOAP 实现的专业知识。
步骤:
1.下载Webservice.htc,许多网上的文章介绍该文件可以在微软的网站上找到,但我按照地址点进去时,只看到网页不存在的提示
2.创建WebService文件假设为MathService.asmx,其提供Add和Subtract两个服务函数
3.创建调用的网页文件Sample.htm(文件内容在下面详细分析)
4.将Webservice.htc复制到Sample.htm同一目录下
5.通过浏览器,浏览该网页
下面分析Sample.htm的内容(取自Msdn)
// 同一ServiceURl可以指定多个名字,Service为HTM文件中的HTML TAG,可以使用HTML中定义的任何标记 service.useService("..//..//MathService.asmx?WSDL","MyMath"); // 禁用Add按钮. doAddButton.disabled = true; service.onserviceavailable = enableButton(); } function enableButton(){ doAddButton.disabled = false; } function doAdd(x,y){ // 同步调用 // 创建一个 the SOAPHeader object var headobj = new Object(); // 创建 the call object callObj = service.createCallOptions(); callObj.async = false; callObj.params = new Array(); callObj.params.a = x; callObj.params.b = y; callObj.funcName = "Add"; callObj.soAPHeader = new Array(); callObj.soAPHeader[0] = headobj; oSPAN.innerText = x + " + " + y + " = "; // 使用回调函数"mathResults"调用 iCallID = service.MyMath.callService(mathResults,callObj); mathResults(iCallID); } function doSubtraction(y,x){ // 异步调用,这是系统默认的调用方式(the default) oSPAN.innerText = y + " - " + x + " = "; // 调用Subtract // 使用回调函数"mathResults"调用 iCallID = service.MyMath.callService(mathResults,"Subtract",y,x); } function mathResults(result){ // If there is an error,and the call came from the call() in init() if(result.error){ // Pull the error information from the event.result.errorDetail properties var xfaultcode = result.errorDetail.code; var xfaultstring = result.errorDetail.string; var xfaultsoap = result.errorDetail.raw; oSPAN.innerText = xfaultcode + " " + xfaultstring + " " + xfaultsoap; }// If there was no error else{ // Show the arithmetic oSPAN.innerText += result.value; } } </SCRIPT> </HEAD> <body onload="init()">
一些总结:
- 客户端必须包含Webservice.htc,将Webservice.htc放在服务器可访问的目录下,可以保证IE浏览器浏览时自动下载该文件,该过程对客户来说是透明的,但是使用其他的浏览器可能会无法使用该功能。
-
获取调用结果有两种方式
使用事件捕获:在Html标记中添加 onresult="onWSresult()",如:
<SCRIPT language="JavaScript">
var iCallID;
function init()
{
service.useService("/services/math.asmx?WSDL","MyMath");
iCallID = service.MyMath.callService("add",5,6);
}
function onWSresult()
{
if((event.result.error)&&(iCallID==event.result.id))
{
var xfaultcode = event.result.errorDetail.code;
var xfaultstring = event.result.errorDetail.string;
var xfaultsoap = event.result.errorDetail.raw;
document.writeln("ERROR. Method call Failed!");
document.writeln("Call ID:" + iCallID);
document.writeln("Fault Code:" + xfaultcode);
document.writeln("Fault String:" + xfaultstring);
document.writeln("SOAP Data:" + xfaultsoap);
}
else if(event.result.error == false)
{
document.writeln("Result received without errors!");
}
}
</script>
<body onload="init()">
<div id="service"onresult="onWSresult()">
</div>
</body>
使用回调函数:(例子见上面) - 调用分为同步调用和异步调用,异步调用为默认的调用方式:(例子见上面)
- 可以使用Callobj进行复杂的调用,设置调用时的参数,以及认证信息
- 支持有限的数据类型,请参看http://msdn.microsoft.com/workshop/author/webservice/datatypes.asp
webservice学习之AXIS初学笔记--创建自己的webservice
AXIS框架共有两种发布方式:即时发布(JWS-Java Web Service)和定制发布(WSDD)。
我对这两种方式分别做了测试,由于时间关系,我只在此说明一些关键性的步骤。
一:即时发布(JWS)
服务器端:创建一个java项目jwstest_server,创建一个jws_server类,代码如下
public class jws_server { public String test(String a,Integer b){ String resultString="a="+a+",b="+b; System.out.println("Received:"+resultString); return "Server Response OK,you send:"+resultString; } }将jws_server.java改成jws_server.jws,然后拷贝到%TOMCAT_HOME%webapps\axis目录中,然后在地址栏输入 http://localhost:8080/axis/jws_server.jws测试,运行结果如下:
说明发布成功。点击进去就可以看到这个WebService的WSDL描述文件,如下图所示:
客户端:新建一个project,起名jwstest_client,然后建一个class文件jws_client.java。代码如下:
import java.rmi.remoteexception; import javax.xml.namespace.QName; import javax.xml.rpc.ServiceException; import org.apache.axis.client.Call; import org.apache.axis.client.Service; public class jws_client { public static void main(String args[]) throws ServiceException,remoteexception{ String urlString="http://localhost:8080/axis/jws_server.jws"; Service service=new Service(); Call call=(Call)service.createCall(); call.setTargetEndpointAddress(urlString); call.setoperationName(new QName(urlString,"test")); String result=(String)call.invoke(new Object[]{"NKLiming",100}); System.out.println("result="+result); } }然后Run as Application,结果如下:
log4j:WARN No appenders Could be found for logger (org.apache.axis.i18n.ProjectResourceBundle).
log4j:WARN Please initialize the log4j system properly.
result=Server Response OK,you send:a=NKLiming,b=100
上述情况没有问题,测试成功。不过在成功之前需要注意几个事项:
1.需要导包,从axis的lib库中导入以下几个包:axis.jar,commons-discovery-0.2.jar,commons-logging-1.0.4.jar,jaxrpc.jar,log4j-1.2.8.jar。如果用到其他的类,可能还需要导入其他的包,现在我的客户端代码中需要用到的axis.jar和jaxrpc.jar,其他的包都是与logging有关的,所有的客户端代码都有有这些包的支持。
2.需要尤其注意这行:
call.setoperationName(new QName(urlString,"test"));后面的参数必须是“test”,我之前用的是“testjws”,运行结果如下:
后来查了一些相关文档,发现QName的构造函数是这样的,
public QName(final String namespaceURI,final String localPart) { this(namespaceURI,localPart,XMLConstants.DEFAULT_NS_PREFIX); }于是,我在地址栏里输入这个网址: http://127.0.0.1:8080/axis/jws_server.jws?wsdl,发现有这几行
<wsdl:portType name="jws_server"> <wsdl:operation name="test" parameterOrder="a b"> <wsdl:input message="impl:testRequest" name="testRequest"/> <wsdl:output message="impl:testResponse" name="testResponse"/> </wsdl:operation> </wsdl:portType>不难看出,此处的test对应的是要调用的服务器端的类的相应的方法名。
3.假如你现在手里只有class或者一个jar包,jws就不再满足你的需求了,最要命的就是及时发布不支持带包的类,这点AXIS的用户手册上写的也很明白。
二、定制发布(WSDD)
由于篇幅问题,我这部分就从简了。
相比及时发布,定制发布更加繁琐更复杂,但是换来的是更大的灵活性,因此实际项目中定制发布还是不二选择。定制发布需要自己编写一个WSDD(Web Service Deployment Descriptor)文件,其实就是一个xml描述文件。
服务器端:
package com.service.wsdd; public class wsdd_server { private int requestCount=0; public String hello(String name){ requestCount++; System.out.println("requestCount="+requestCount); System.out.println("Received:"+name); return "Hello "+name; } public float add(float a,float b){ requestCount++; String result="a="+a+",b="+b; System.out.println("requestCount="+requestCount); System.out.println("Received:"+result); return a+b; } }之后,我是这样操作的,在%TOMCAT_HOME%/webapps/axis/WEB-INF/class目录下建了com目录,进去后建立service,点进后在建立wsdd目录,最后进入wsdd目录将拷贝的wsdd_server.java放进去。形成的目录结构如下图所示
然后运行->cmd,打开命令行,对wsdd_server.java进行编译,如下图所示:
在%TOMCAT_HOME%\webapps\axis\WEB-INF目录下建立配置发布文件deploy.wsdd,内容如下:
<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> <service name="wsdd_server" provider="java:RPC"> <parameter name="className" value="com.service.wsdd.wsdd_server"/> <parameter name="allowedMethods" value="*"/> <parameter name="scope" value="request"/> </service> </deployment>
编写完配置发布文件之后,cmd打开windows的控制台,进入:%TOMCAT_HOME%\webapps\axis\WEB-INF 目录下键入如下命令:java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient deploy.wsdd之后控制台返回Processing file deploy.wsdd 和Done processing 这两段话即说明发布成功。成功之后的目录中会多一个server-config.wsdd的文件。如下:
在这里要尤其需要注意的:在发布时,必须保证tomcat是开启的(这个问题困扰了我一下午,务必要注意),否则就会出现java.net.ConnectException: Connection refused: connect这类的错误,如下图所示:
客户端代码如下:
import javax.xml.namespace.QName; import org.apache.axis.client.Call; import org.apache.axis.client.Service; public class wsdd_client { public static void main(String[] args){ try { String urlString="http://localhost:8080/axis/services/wsdd_server"; Service service=new Service(); Call call=(Call) service.createCall(); call.setTargetEndpointAddress(urlString); call.setoperationName(new QName(urlString,"hello")); String result=(String)call.invoke(new Object[]{"NKLiming"}); System.out.println("result = "+result); call.setoperationName(new QName(urlString,"add")); Float returnvalue=(Float)call.invoke(new Object[]{new Float(3.2),new Float(2.8)}); System.out.println("returnvalue = "+returnvalue); } catch (Exception e) { e.printstacktrace(); } } }
测试结果如下:
到此为止,所有的jws和wsdd的测试均完毕了。
PS:忙活了一个下午,刚开始接触webservice的孩纸伤不起啊!
webservice学习之使用java发布webservice以及调用
不需要别的jar包,直接用myeclipse创建web项目,有自带的javax.jws.WebService
很简单,第一步写一个接口:注意写上注解
package test.wervice;
import javax.jws.WebService;
@WebService
public interface HelloWorld {
void sayHi(String name);
}
第二步写上接口的实现类:注意写上注解 package test.wervice.impl;
import javax.jws.WebService;
import test.wervice.HelloWorld;
@WebService(endpointInterface="test.wervice.HelloWorld") public class HelloWorldImpl implements HelloWorld{
public void sayHi(String name) {
System.out.println("helloWorld"+name);
}
}
第三步就可以发布你的这个webservice了,写一个发布类 package test.wervice;
import javax.xml.ws.Endpoint;
import test.wervice.impl.HelloWorldImpl;
public class serviceApp { public static void main(String[] args){ System.out.println("start service"); Endpoint.publish("http://localhost:8080/helloWorld", new HelloWorldImpl()); System.out.println("end service"); } }
这样运行main方法,你的webservice接口就算发布了,然后打开浏览器输入http://localhost:8080/helloWorld?wsdl即可
这样就完成了发布,要怎么调用呢?我是借用的cxf中的wsdl2java来生成的,具体步骤如下:
1、先下载cxf包 http://cxf.apache.org/download.html,现在cxf包。 2、解压缩包,通过cmd命令进入到bin目录下 3、使用wsdl2java命令生成客户端代码,执行如下命令 wsdl2java -p org.logink.ws -d f:\logink\src -all http://localhost:8080/helloWorld?wsdl
其中wsdl2java用法解释: wsdl2java -p com -d src -all aa.wsdl -p 指定其wsdl的命名空间,也就是要生成代码的包名: -d 指定要产生代码所在目录 -client 生成客户端测试web service的代码 -server 生成服务器启动web service的代码 -impl 生成web service的实现代码 -ant 生成build.xml文件 -all 生成所有开始端点代码:types,service proxy,,service interface, server mainline, client mainline, implementation object, and an Ant build.xml file.这个我不是很理解,反正后面就是wsdl这个地址
生成后最后从生成目录中找出代码,copy到你自己要用的地方,测试下Ok了
关于webservice学习心得和webservice入门的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于axis2(Webservice)学习心得、WebService Behavior 学习心得、webservice学习之AXIS初学笔记--创建自己的webservice、webservice学习之使用java发布webservice以及调用的相关信息,请在本站寻找。
本文标签: