- 浏览: 198377 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
xueruipp:
应该还能用吧
坦克大战用到的图片素材 -
泽在1993:
...
坦克大战用到的图片素材 -
AzraelWarrior:
...
坦克大战用到的图片素材 -
edison87915:
...
Java OCR 图像智能字符识别技术,可识别中文 -
innger:
为了避免如此我们应该用如下格式:
什么格式啊?
能不能在页 ...
Spring mvc3自己手动写国际化
WebService是一种服务的提供方式,通过WebService,不同应用间相互间调用变的很方便,网络上有很多常用的WebService服务,如:http://developer.51cto.com/art/200908/147125.htm,不同的语言平台对WebService都有实现,Java的WebService实现,比较流行的有Axis2、Jaxws,本文介绍的是Axis2。
Axis2下载和部署
Axis2是Apache开发的一个开源项目,再次感叹Apache的伟大!
下载地址:
http://mirror.bit.edu.cn/apache//axis/axis2/java/core/1.6.2/axis2-1.6.2-war.zip
将其内axis2.war解压到<Tomcat安装目录>/webapps下,启动Tomcat,war包会自动解压,
访问http://localhost:8080/axis2/,如果看到欢迎主页,则说明部署成功。
配置Axis2
<Tomcat安装目录>/webapps/axis2/WEB-INF/conf/axis2.xml,配置其内两个属性,以便调试。
[html] view plaincopy
<parameter name="hotdeployment">true</parameter><!-- 开启热部署,不需要重启即可部署服务 -->
<parameter name="hotupdate">true</parameter><!-- 开启热更新,不需要重启即可更新服务 -->
编写服务
所谓服务就是编写一个类,写一些方法,方法返回数据,WebService客户端获取数据。
[java] view plaincopy
public class HelloService {
public String sayHello() {
return "hello";
}
}
0配置POJO发布服务
服务类创建好后,我们需要发布到服务器上,将HelloService.class放到<Tomcat安装目录>/webapps/axis2/WEB-INF/pojo下,pojo没有需要创建。
至此,我们已经成功的创建了一个WebService服务了,so easy!
再次访问http://localhost:8080/axis2/,点击Services,可以发现可用services中多了一个HelloService,其内有一个可用操作sayHello,说明发布成功。
[java] view plaincopy
HelloService
Service Description : No description available for this service
Service EPR : http://localhost:8080/axis2/services/HelloService
Service Status : Active
Available Operations
sayHello
访问http://localhost:8080/axis2/services/HelloService,页面输出正是我们的返回值。
[html] view plaincopy
<ns:sayHelloResponse xmlns:ns="http://ws.apache.org/axis2">
<return>hello</return>
</ns:sayHelloResponse>
这里有两点需要注意:
- POJO发布的类不能放在包里,既不能使用package关键字;
- 默认的发布目录是pojo,可以在<Tomcat安装目录>/webapps/axis2/WEB-INF/conf/axis2.xml中增加目录,
[html] view plaincopy
<deployer extension=".class" directory="<要增加的目录名称>" class="org.apache.axis2.deployment.POJODeployer" />
要注意多个目录见WebService要唯一,否则会重名,重名后,先部署的会成功,后部署的会报错。
services.xml配置文件发布服务
虽然POJO的方式不需要配置文件,但是其服务类不能放在包内,显然是不符合我们日常开发的,Axis2也允许带包的类发布WebService,如果不允许,估计就没人用了。
首先写一个较复杂的服务类,多个方法,带参数,有返回值的。
[java] view plaincopy
package webservice.test;
/**
* 计算器运算
*
* @author gaoshuang
*/
public class CalculateService {
// 加法
public float plus(float x, float y) {
return x + y;
}
// 减法
public float minus(float x, float y) {
return x - y;
}
// 乘法
public float multiply(float x, float y) {
return x * y;
}
// 除法
public float divide(float x, float y) {
if (y != 0)
return x / y;
else
return -1;
}
}
然后编写services.xml,该文件需要放在META-INF文件夹下。
[html] view plaincopy
<?xml version="1.0" encoding="UTF-8"?>
<!-- 服务名称 -->
<service name="CalculateService">
<!-- 服务描述 -->
<description>
加减乘除计算服务
</description>
<!-- 设置服务类 -->
<parameter name="ServiceClass">
com.runqianapp.webservice.test.CalculateService
</parameter>
<!-- 方法 -->
<operation name="plus">
<!-- 方法处理器,RPCMessageReceiver为带返回值的处理器,
RPCInOnlyMessageReceiver为不带返回值的处理器 -->
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
</operation>
<operation name="minus">
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
</operation>
<operation name="multiply">
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
</operation>
<operation name="divide">
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
</operation>
</service>
最后将这两个文件打成jar包,不论用工具还是手动打,打的都是最外层的文件夹。
我打的名字是server.jar,更改后置为aar,所以最后是server.aar,Axis2建议使用aar发布WebService,
将server.aar放到<Tomcat安装目录>/webapps/axis2/WEB-INF/services下,访问http://localhost:8080/axis2/services/listServices,
多出了一个CalculateService,说明发布成功。
[java] view plaincopy
CalculateService
Service Description : CalculateService
Service EPR : http://localhost:8080/axis2/services/CalculateService
Service Status : Active
Available Operations
divide
plus
minus
multiply
分别访问
http://localhost:8080/axis2/services/CalculateService/plus?x=1&y=2
http://localhost:8080/axis2/services/CalculateService/divide?x=1&y=2
http://localhost:8080/axis2/services/CalculateService/minus?x=1&y=2
http://localhost:8080/axis2/services/CalculateService/multiply?x=1&y=2
也可以发布多个WebService,可以使用serviceGroup标签。
[html] view plaincopy
<serviceGroup>
<service name="myService1">
...
</service>
<service name="myService2">
...
</service>
</serviceGroup>
客户端实现
以上介绍的都是WebService服务创建及发布,那么有了一个WebService服务后,我们如何调用呢?只在浏览器上访问是没有意义的。
下载Axis2客户端压缩包:http://mirror.esocc.com/apache//axis/axis2/java/core/1.6.2/axis2-1.6.2-bin.zip,并解压。
新建工程WebServiceClientTest,将<Axis2客户端安装目录>/lib下所有jar包添加到工程中;
编写客户端代码;
[java] view plaincopy
package webservice.client.test;
import javax.xml.namespace.QName;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;
public class Client1 {
/**
* @param args
* @throws AxisFault
*/
public static void main(String[] args) throws AxisFault {
// 使用RPC方式调用WebService
RPCServiceClient serviceClient = new RPCServiceClient();
Options options = serviceClient.getOptions();
// 指定调用WebService的URL
EndpointReference targetEPR = new EndpointReference(
"http://localhost:8080/axis2/services/CalculateService");
options.setTo(targetEPR);
// 调用方法的参数值
Object[] entryArgs = new Object[] {1, 2};
// 调用方法返回值的数据类型的Class对象
Class[] classes = new Class[] { float.class };
// 调用方法名及WSDL文件的命名空间
// 命名空间是http://localhost:8080/axis2/services/CalculateService?wsdl中wsdl:definitions标签targetNamespace属性
QName opName = new QName("http://test.webservice", "plus");
// 执行方法获取返回值
// 没有返回值的方法使用serviceClient.invokeRobust(opName, entryArgs)
Object result = serviceClient.invokeBlocking(opName, entryArgs, classes)[0];
System.out.println(result);
// out: 3.0
}
}
以上是实现了一个简单的WebSerivce客户端,调用CalculateService中的plus方法,由代码可见,这种调用方式比较杂乱,代码不太友好。
wsdl2java简化客户端
<Axis2客户端安装目录>/bin目录,其内有两个bat,wsdl2java.bat和java2wsdl.bat,可以实现WSDL文件和Java之间的互相转换。
考虑到我们以后可能经常使用这些命令,设置环境变量,方便以后调用。在系统变量中加入AXIS2_HOME=<Axis2客户端安装目录>,path中追加;%AXIS2_HOME%\bin。
启动命令提示符,进入WebServiceTestClient所在目录,运行
[plain] view plaincopy
wsdl2java -uri http://localhost:8080/axis2/services/CalculateService?wsdl -p webservice.client.test -s
参数说明:uri - wsdl文件路径,网络路径或本地路径,p - 打包,这里和上一个客户端实现类打在了一个包里,wsdl2java有很多参数,详细可以运行该命令去查看。
执行后,如果没有报错,说明运行成功,刷新项目,该包下多出了一个CalculateServiceStub类,里面的代码极其复杂,还乱呼呼的,这我们不用管,调用该类。
[java] view plaincopy
package webservice.client.test;
import java.rmi.RemoteException;
import webservice.client.test.CalculateServiceStub.Plus;
public class Client2 {
/**
* @param args
* @throws RemoteException
*/
public static void main(String[] args) throws RemoteException {
CalculateServiceStub stub = new CalculateServiceStub();
Plus plus = new Plus();
plus.setX(1);
plus.setY(2);
float result = stub.plus(plus).get_return();// 返回值自动转型,这也是强大之处
System.out.println(result);
}
}
如此做的好处就是调用时不需要在去查看WSDL,和正常使用一个类一样,对WebService的封装都由wsdl2java自动生成,代码更优雅、简洁。
利用wsdl2java轻松使用第三方WebService服务
有了wsdl2java,已知一个WSDL文件我们就可以轻松的生成WebService客户端供我们调用,给我们服务。文章开头给出的链接包含了一些第三方服务,有一个服务是生成随机个数中文,WSDL:http://www.webxml.com.cn/WebServices/RandomFontsWebService.asmx?wsdl,同样,启动命令提示符,进入项目路径,执行
[plain] view plaincopy
wsdl2java -uri http://www.webxml.com.cn/WebServices/RandomFontsWebService.asmx?wsdl -p webservice.client.test -s
调用该类
[java] view plaincopy
package webservice.client.test;
import java.rmi.RemoteException;
import webservice.client.test.RandomFontsWebServiceStub.ArrayOfString;
import webservice.client.test.RandomFontsWebServiceStub.GetChineseFonts;
public class ThirdClient {
/**
* @param args
* @throws RemoteException
*/
public static void main(String[] args) throws RemoteException {
RandomFontsWebServiceStub stub = new RandomFontsWebServiceStub();
GetChineseFonts getChineseFonts = new GetChineseFonts();
getChineseFonts.setByFontsLength(10);// 免费使用有限制,最多8个
ArrayOfString result = stub.getChineseFonts(getChineseFonts).getGetChineseFontsResult();
for(String str : result.getString()) {
System.out.println(str);
}
}
}
源码下载
文中代码尽在下面链接中,免积分下载。
http://download.csdn.net/download/ghsau/6400843
(完)
原文地址:http://blog.csdn.net/ghsau/article/details/12714965
发表评论
-
新浪博客那样用户自己提交二级域名并自动解析是怎么实现的?
2013-11-27 09:24 817方法一 通过泛域名解析,将某个顶级域名下的所有的子域名都指向 ... -
【转】Java:Session详解
2013-01-18 14:06 971【转】Java:Session详解 书中讲: 以下情况,Se ... -
Eclipse 堆栈和内存大小设置
2012-11-09 00:26 10281, 设置Eclipse内存使用情况 修改ecl ... -
Target runtime Apache Tomcat 6.0 is not defined
2012-11-07 09:52 1009Eclipse导入工程后工程上显示一个小红叉,但工程里没有文 ... -
怎样在Eclipse中使用debug调试程序?
2012-10-10 10:20 0最基本的操作是: 1, 首先在一个java文件中设断点, ... -
Javascript跳转页面和打开新窗口等方法
2012-09-28 21:14 12131.在原来的窗体中 ... -
String与InputStream互转
2012-09-15 02:14 7178//String转inputStream 1. String ... -
Tomcat下面配置二级域名
2012-05-29 11:33 2529(1)开通二级域名支持,即house.map512.cn,pl ... -
Java OCR 图像智能字符识别技术,可识别中文
2012-05-22 15:34 2356几天一直在研究 OCR 技术,据我了解的情况,国内最专 ... -
上传组件
2012-05-02 23:19 933http://seyaa.iteye.com/blog/106 ... -
java实现简单的单点登录
2012-04-09 14:13 934http://www.blogjava.net/xcp/arc ... -
web service 实例
2012-02-20 11:18 870http://wenku.baidu.com/view/fac ... -
URI和URL的不同
2012-01-17 19:40 12051.什么是URI Web上可用的每种资源 - ... -
常用解决疑难杂症的网站
2012-01-09 09:28 978http://stackoverflow.com/questi ... -
java内部类详解
2012-01-05 13:56 1234内部类是指在一个外部类的内部再定义一个类。内部类作为外部类的一 ... -
iBATIS的多对多映射配置浅析
2011-12-28 16:58 925http://developer.51cto.com/art/ ... -
Spring security3 中文官方文档
2011-12-23 13:57 1062Spring security 3.0 官方翻译文档 -
Spring security 3.0 配置实例
2011-11-30 23:29 1088http://junjun16818.iteye.com/bl ... -
Java treemap 排序
2011-11-25 11:42 1932TreeMap 和 HashMap 用法大 ... -
坦克大战用到的图片素材
2011-11-23 22:36 9262坦克大战用到的图片素材
相关推荐
**三、创建WebService客户端** 1. **生成客户端代理类** 使用JAX-WS的`wsimport`工具,根据服务的WSDL地址生成客户端所需的代理类和数据绑定类。在命令行中运行: ```bash wsimport -keep -s src -p ...
从准备必要的jar包,到编写服务接口和实现,再到生成和部署服务,以及创建客户端并调用服务,这一系列过程涵盖了WebService开发的关键步骤。理解并掌握这些知识,将有助于你在实际工作中灵活运用WebService进行跨...
总结,本教程详细介绍了如何利用Spring Boot和Apache CXF搭建Web Service服务端,以及使用JAX-WS的`javax.xml.ws.Service`和Apache CXF的`JaxWsProxyFactoryBean`两种方式实现Java客户端调用。这些技能对于开发者来...
使用axis2创建webservice步骤以及客户端调用service服务代码,如何编写和发布WebService,如何使用services.xml配置文件发布,如何用Java实现调用WebService的客户端程序等等
- **实现服务接口**:创建一个实现了服务接口的类,这个类通常包含实际的服务逻辑。 - **发布服务**:使用`Endpoint`类的`publish`方法发布服务,指定服务的终结点地址。 3. **生成WSDL(Web Service Description...
2. 实现服务接口:创建一个类实现该接口,提供实际的业务逻辑。 3. 配置服务:使用CXF提供的注解(如`@WebService`)标记接口和实现类,指定服务的元数据,如服务名、端点地址等。 4. 发布服务:通过CXF的Server类...
WebService服务端及客户端样例工程提供了一个完整的实例,帮助开发者理解如何创建、调用和测试Web服务。服务端主要涉及接口定义、服务发布,而客户端则涉及代理类的生成和调用服务。在实际项目中,还需要关注安全性...
3. **实现服务接口** 接下来,我们需要实现这个接口。实现类也需要被标记为`@WebService`,并且可以添加其他的注解来定制行为: ```java @WebService(endpointInterface = "com.example.HelloWorldService") ...
2. **实现服务类**:为接口提供具体的实现。 3. **部署服务**:使用Axis2的工具,如wsdl2java,将WSDL文件转换为Java代码,然后将服务类打包成服务存根(Stub)和 skeletons。 4. **启动服务**:通过Axis2的服务器...
【Java调用WebService客户端详解】 在Java开发中,有时我们需要从客户端调用远程的WebService服务以获取或传递数据。本文将详细介绍如何使用Java进行WebService客户端的调用,并提供HttpGet、HttpPost、HttpSoap...
2. 实现服务:根据WSDL定义的服务接口编写实际的业务逻辑。在Java中,可以使用JAX-WS(Java API for XML Web Services)框架来创建Web服务。 3. 部署服务:将实现的服务部署到支持SOAP的Web服务器上,例如Tomcat或...
在这种场景下,Java创建了一个WebService,而C#作为客户端需要与之交互。 1. **Java WebService创建**: Java开发者通常使用JAX-WS(Java API for XML Web Services)框架来创建WebService。这包括编写一个Java类...
### Java编写WebService客户端详解 #### 一、概述 在现代软件开发中,Web服务作为一种重要的技术手段被广泛应用于系统间的数据交互与通信。其中,基于Java的WebService客户端开发更是占据了重要地位。本文将通过...
java 创建webservice,服务端与客户端源码
2. **实现服务接口**:创建一个类实现这个接口,并提供具体的服务逻辑。 ```java @WebService(endpointInterface = "UserService") public class UserServiceImpl implements UserService { @Override public ...
在使用Tomcat+Axis实现服务调用的情况下,Tomcat是一个流行的Java应用服务器,而Axis是Java中的一个WebService框架。你需要在Tomcat中部署WebService服务,然后使用Axis工具生成客户端代码,最后在客户端应用程序中...
本篇文章将深入探讨如何利用JBoss Netty创建高效的Web Service客户端和服务端。 首先,我们需要理解Netty的基本工作原理。Netty采用非阻塞I/O模型,基于Java NIO(非阻塞输入/输出)库,允许在网络操作中进行高并发...
三、创建WebService客户端 1. 生成客户端代理类:CXF提供了wsdl2java工具,可以将服务端的WSDL文档转换为Java客户端代码,生成服务代理类和数据模型类。 2. 引入依赖:同样需要引入CXF客户端的相关jar包,如cxf-rt-...
在这种情况下,Java开发者可以创建一个Web服务,该服务可以接收文件数据并进行传输。 Java调用Windows COM组件是一个相对复杂的过程,因为Java本身并不直接支持COM(Component Object Model)。这就是JACOB(Java ...
2. **WebService客户端调用**: - **代理类生成**:客户端通常需要一个代理类来调用服务端的方法。对于Java,可以使用WSDL文件生成代理类,如使用`wsimport`工具或者Apache CXF框架。 - **SOAP请求构造**:通过...