java中webservice实例,如何使用java做webservice
java中webservice实例,如何使用java做webservice详细介绍
本文目录一览: java如何写webservice服务端
Java 中的 Web Service 分为基于 SOAP 的和基于 REST 的两种,下面简单说一个基于 SOAP 的例子。要使用 JDK6u4 之后的版本才能编译通过。
先编写一个 Web Service 的接口:
@WebService@SOAPBinding(style = Style.RPC) public interface TimeServer { @WebMethod String getTimeAsString(); @WebMethod long getTimeAsElapsed();}再编写 Web Service 实现:
import java.util.Date;import javax.jws.WebService;@WebService(endpointInterface = "test.TimeServer")public class TimeServerImpl implements TimeServer { public String getTimeAsString() { return new Date().toString(); } public long getTimeAsElapsed() { return new Date().getTime(); }}最后启动 Web Service:
public class TimeServerPublisher { public static void main(String[ ] args) { Endpoint.publish("http://127.0.0.1:9876/ts", new TimeServerImpl()); }}
如果正常启动,可以用浏览器访问 http://127.0.0.1:9876/ts?wsdl 看到这个 Web Service 的 wsdl 文档。
如何在Java中快速发布WebService服务
1,在Java项目中发布一个WebService服务:
如何发布?
——JDK1.6中JAX-WS规范定义了如何发布一个WebService服务;
(1)用jdk1.6.0_21以后的版本发布;
(2)与Web服务相关的类,都位于Javax.jws.*包中
@WebService——此注解用在类上指定将此类发布成一个WebService;
EndPoint——此类为端点服务类,其中publish()方法用于将一个已经添加了@WebService注解对象绑定到一个地址的端口上,用于发布。
2,例子:
(1)发布WebService服务
HelloWebService.java:
[java] view plain copy
注:
@WebService- 它是一个注解,用在类上指定将此类发布成一个ws.
Endpoint –此类为端点服务类,它的方法publish用于将一个已经添加了@WebService注解对象绑定到一个地址的端口上。
运行以上程序进行发布。
(2)查看wsdl
地址:http://192.168.24.138:456/helloWord?wsdl
只要在客户端浏览器能看到此WSDL文档,说明服务发布成功
以上服务发布成功;
总结:
如何发布一个Web服务:
a,在类上添加@WebService注解
(注:此注解是jdk1.6提供的,位于javax.jws.WebService包中)
b,通过EndPoint(端点服务)发布一个WebService
(注:EndPoint是jdk提供的一个专门用于发布服务的类,该类的publish方法接收两个参数,一个是本地的服务地址,二是提供服务的类。位于 javax.xml.ws.Endpoint包中)
c,注:
类上添加注解@WebService,类中所有非静态方法都会被发布;
静态方法和final方法不能被发布;
方法上加@WebMentod(exclude=true)后,此方法不被发布;
(3)客户端访问发布的服务
根据WSDL文档来在客户端编写代码,访问发布的服务;
但是,WSDL文档看不懂怎么办?代码该如何编写?
——你看不懂,JDK看得懂,wsimport是JDK自带的,可以根据WSDL文档生成客户端调用代码的工具。无论服务器端WebService使用什么语言编写的,豆浆在客户端生成Java代码。所以服务器用什么语言编写的并不重要。
wsimport.exe命令参数熟知:
-d:生成class文件。默认参数。
-s:生成Java文件
-p:自定义包结构
解析地址生成源码到E盘:
执行以上命令后,即可在E盘下生成如下包及类
注:还可以自定义包结构:
自定义包结构的命令:
将生成的包及.java文件复制到客户端:如下图
创建访问服务的类:MyClient.java:
MyClient.java:
[java] view plain copy
(4)运行结果:
如何使用java做webservice
点右键,新建一个webservice项目,然后下载一个例子参照了做
给分就给你例子
基于AXIS的web service: 1 比如要建一个Server.java类的web service public class Server { public String printInfo(String name){ return "Hello,"+name; } } 2 把Server.java改为Server.Jws放到 …\Tomcat 5.5\webapps\axis中,重启服务器 3 访问 4 在cmd中输入 cd D:\Program Files\Apache Software Foundation\Tomcat 5.5\webapps\axis\WEB-INF 输入命令:Java -Djava.ext.dirs=lib org.apache.axis.wsdl.WSDL2Java 5 找到…\Tomcat 5.5\webapps\axis\WEB-INF下生成的localhost文件夹复制到工程中 6 建一个Client端的类进行测试: public class Client { public static void main(String arg[]) throws ServiceException, RemoteException{ ServerService ss=new ServerServiceLocator(); Server s=ss.getServer(); System.out.println("............"+s.printInfo("shiyou")); } }
蓝屏
java如何调用webservice接口?
Java通过WSDL文件来调用webservice直接调用模式如下:
import java.util.Date;
import java.text.DateFormat;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import javax.xml.namespace.QName;
import java.lang.Integer;
import javax.xml.rpc.ParameterMode;
public class caClient {
public static void main(String[] args) {
try {
String endpoint = "http://localhost:8080/ca3/services/caSynrochnized?wsdl";
//直接引用远程的wsdl文件
//以下都是套路
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(endpoint);
call.setOperationName("addUser");//WSDL里面描述的接口名称
call.addParameter("userName", org.apache.axis.encoding.XMLType.XSD_DATE,
javax.xml.rpc.ParameterMode.IN);//接口的参数
call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);//设置返回类型
String temp = "测试人员";
String result = (String)call.invoke(new Object[]{temp});
//给方法传递参数,并且调用方法
System.out.println("result is "+result);
}
catch (Exception e) {
System.err.println(e.toString());
}
}
}
我想用java做一个web services.请问该怎么做
网上有很多答案的,下面这个是个专业性的答案:
webservice的应用已经越来越广泛了,下面介绍几种在Java体系中开发webservice的方式,相当于做个记录。
1.Axis2
Axis是apache下一个开源的webservice开发组件,出现的算是比较早了,也比较成熟。这里主要介绍Axis+eclipse开发webservice,当然不用eclipse也可以开发和发布webservice,只是用eclipse会比较方便。
(1)下载eclipse的Java EE版本
(2)下载axis2
(3)下载eclipse的axis2插件
Axis2_Codegen_Wizard
Axis2_Service_Archiver
推荐使用1.3的版本
(4)eclipse安装axis2插件
1)在任意目录下新建一个Axis2文件夹,在该文件夹下新建eclipse目录,在eclipse目录中新建plugins目录和features目录,例如:D:\programSoftware\eclipse-SVN\Axis2\eclipse;
2)把下载的axis2插件解压,并把解压的文件放到新建的eclipse的plugins目录下;
3)在%eclipse_home%的目录下新建links目录,并在links目录下新建axis2.link文件,内容为:path=D:\programSoftware\eclipse-SVN\Axis2;
4)重启eclipse,点击·file-new-other,如果看到Axis2 Wizards,则表明插件安装成功。
(5)安装axis2
(6)使用eclipse新建web工程,创建一个普通java类,至少包含一个方法。
(7)发布webservice
1)点击eclipse的File-New-other,打开Axis2 Wizards,选择Axis2 Service Archiver,然后Next;
2)选择Class File Location,也就是类文件存放路径,注意:只选到classes目录,不要包括包文件夹,然后Next;
3)选择Skip WSDL,然后Next
4)一路Next到Select the Service XML file to be included in the Service archive,勾选Generate theservice xml automatically;
5)Service Name-填写你的service名称,Class Name-填写类名称,要包括包名,然后点击load,然后点击Finish,这时webservice就发布成功了;
6)然后到%TOMCAT_HOME%/webapps/axis2/WEB-INF/services 看看是否多了一个.aar的文件;
注意:以上的方式是发布到axis2.war包中,你也可以把生成.aar文件copy到你的实际应用中,同时,你也可以使用eclipse的create webservice功能发布你的webservice,选择axis2生成你的webservice,这样webservice就会部署到你的应用中了。
2.Apche CXF
CXF开发webservice也是比较方便和简单的,它和spring的集成可以说是非常地好。举一个CXF开发webservice的例子吧。
1)在eclipse中新建一个web工程,导入依赖包,如图:
2)编写一个接口,如:
注意:CXF开发的webservice,接口中的方法的参数一定要以这种方式,否则客户端调用的时候CXF服务端会接收不到参数的值,name:参数名称,可不写(建议写上),targetNamespace:命名空间,一定要填写上,默认是包名反过来的顺序,mode:参数类型,IN表示输入。
3)编写一个实现类,实现接口的方法;
4)和spring的集成,编写一个bean文件,如:cxf-beans.xml,内容如下:
Cxf-beans.xml代码
这个文件比较容易理解,就不解释了。
5)配置CXFServlet
在web.xml文件中配置CXFServlet,加载cxf-beans.xml文件,内容如下:
Web.xml代码
id="WebApp_ID" version="2.5">
contextConfigLocation
WEB-INF/cxf-beans.xml
org.springframework.web.context.ContextLoaderListener
cxf
org.apache.cxf.transport.servlet.CXFServlet
1
cxf
/services/*
把工程部署到中间件,如tomcat,就可以访问该webservice了。
3.JDK开发webservice
1)编写一个Java类,如下:
Jdkwebservice.java代码
package demo;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.xml.ws.Endpoint;
@WebService
public class JdkWebService {
return "Just do it," + value + "!";
}
public static void main(String[] args) {
}
}
2)运行该java类,在浏览器上就可以访问该webservice了。
注意:开发web工程的时候,这种方法不太友好。我们可以编写一个servlet类,在servlet类的初始化方法中发布webservice,这样我们的中间件服务器启动的时候就会帮我们自动webservice了。
4) xfire
开发WebService的框架不少,每个框架都有各自的有点,最近我用xfire练习开发WebService,下面是开发WebService的小例子,希望对入门的人有些小帮助
1.新建一个java web project命名为TestWebService,将xfire相关的jar包添加到lib目录中,写接口类和实现类
Java代码
package com.lamp.service;
public interface MessageService {
public String getName(String name);
}
[java] view plaincopyprint?
package com.lamp.service;
public interface MessageService {
public String getName(String name);
}
实现类
Java代码
package com.lamp.service.impl;
import com.lamp.service.MessageService;
public class MessageServiceImpl implements MessageService {
public String getName(String name) {
return "hellow " + name + ", welcome to WebService world";
}
}
[java] view plaincopyprint?
package com.lamp.service.impl;
import com.lamp.service.MessageService;
public class MessageServiceImpl implements MessageService {
public String getName(String name) {
return "hellow " + name + ", welcome to WebService world";
}
}
在src目录下新建文件夹META-INF,然后再在其下新建文件夹xfire,在xfire目录下新建配置文件services.xml
Xml代码
MessageService
com.lamp.service.MessageService
com.lamp.service.impl.MessageServiceImpl
[xml] view plaincopyprint?
MessageService
com.lamp.service.MessageService
com.lamp.service.impl.MessageServiceImpl
最后在web.xml中配置xfire的servlet
Xml代码
XFireServlet
XFireServlet
/servlet/XFireServlet/*
XFireServlet
/services/*
[xml] view plaincopyprint?
XFireServlet
XFireServlet
/servlet/XFireServlet/*
XFireServlet
/services/*
这样服务器端开发完毕,现在开始客户端的开发
新建一个java project也将xfire相关的jar引入,我用ant在客户端生成代理对象,在项目路径下新建build.xml,代码为
Xml代码
<wsgen outputdirectory="${src.dir}"
wsdl="${wsdl.dir}" package="com.lamp.ws.client" overwrite="true"/>
[xml] view plaincopyprint?
<wsgen outputdirectory="${src.dir}"
wsdl="${wsdl.dir}" package="com.lamp.ws.client" overwrite="true"/>
怎样在myecplise8开发webservice 简单实例
1.1.系统功能:
开发一个计算器服务CalculateService,这个服务包含加(plus)、减(minus)、乘(multiply)、除(divide)的操作。
1.2.开发前准备:
安装Eclipse-jee;
下载最新版本的Axis2,网址http://axis.apache.org/axis2/java/core/download.cgi
,选择Standard Binary Distribution的zip包,解压缩得到的目录名axis2-1.4.1,目录内的文件结构如下:
1.3.开发前配置:
在Eclipse的菜单栏中,Window --> Preferences --> Web Service -->
Axis2 Perferences,在Axis2 runtime
location中选择Axis2解压缩包的位置,设置好后,点"OK"即行。(如图)
1.4.开发Web Service:
(1)新建一个Java Project,命名为"WebServiceTest1"
(2)新建一个class,命名为"CalculateService",完整代码如下:
package edu.sjtu.webservice;
/**
* 计算器运算
* @author rongxinhua
*/
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;
}
}
(3)在"WebServiceTest1"项目上new --> other,找到"Web Services"下面的"Web Service";
(4)下一步(next),在出现的Web Services对象框,在Service
implementation中点击"Browse",进入Browse
Classes对象框,查找到我们刚才写的写的CalculateService类。(如下图)。点击"ok",则回到Web Service话框。
(5)在Web Service对话框中,将Web Service type中的滑块,调到"start service“的位置,将Client type中的滑块调到"Test client"的位置。
(6)在Web Service
type滑块图的右边有个"Configuration",点击它下面的选项,进入Service Deployment
Configuration对象框,在这里选择相应的Server(我这里用Tomcat6.0)和Web
Service runtime(选择Apache Axis2),如下图:
(7)点OK后,则返回到Web Service对话框,同理,Client
type中的滑块右边也有"Configuration",也要进行相应的置,步骤同上。完成后,Next -->
next即行。进入到Axis2 Web Service Java Bean Configuration,我们选择Generate a
default services.xml,如下图所示:
(8)到了Server startup对话框,有个按键"start server"(如下图),点击它,则可启动Tomcat服务器了。
(9)等启完后,点击"next -- > next",一切默认即行,最后,点击完成。最后,出现如下界面:(Web Service
Explorer),我们在这里便可测试我们的Web服务。(使用浏览器打开的话使用如下地址:http://127.0.0.1:19189/wse
/wsexplorer/wsexplorer.jsp?org.eclipse.wst.ws.explorer=3)。如下图所示:
注:在浏览器中打开Web Service Explorer(有时候在eclipse中关闭了webservice explorer,可以用这种方法打开)
首先登录地址:http://127.0.0.1:19189/wse/wsexplorer/wsexplorer.jsp。然后在网页右上角选择
Web Service
Exoplorer标签。然后输入WSDL地址:http://localhost:8080/WebServiceTest1/services
/CalculateService?wsdl 。这个wsdl地址就是我们刚才发布服务的那个wsdl。点击go,如下图所示:
然后就可以看到如下界面了:
(10)测试比较简单,例如,我们选择一个"plus"的Operation(必须是
CalculateServiceSoap11Binding),出现下图,在x的输入框中输入1,在y的输入框中输入2,点击"go",便会在
status栏中显示结果3.0。其他方法的测试也类似。结果如上图所示。
1.5.CalculateService客户端调用程序
前面我们已经定义好了加减乘除的方法并将这些方法发布为服务,那么现在要做的就是调用这些服务即可。客户端调用程序如下代码所示:CalculateServiceTest.java
package edu.sjtu.webservice.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 CalculateServiceTest {
/**
* @param args
* @throws AxisFault
*/
public static void main(String[] args) throws AxisFault {
// TODO Auto-generated method stub
// 使用RPC方式调用WebService
RPCServiceClient serviceClient = new RPCServiceClient();
Options options = serviceClient.getOptions();
// 指定调用WebService的URL
EndpointReference targetEPR = new EndpointReference(
"http://localhost:8080/WebServiceTest1/services/CalculateService");
options.setTo(targetEPR);
// 指定要调用的计算机器中的方法及WSDL文件的命名空间:edu.sjtu.webservice。
QName opAddEntry = new QName("http://webservice.sjtu.edu","plus");//加法
QName opAddEntryminus = new QName("http://webservice.sjtu.edu","minus");//减法
QName opAddEntrymultiply = new QName("http://webservice.sjtu.edu","multiply");//乘法
QName opAddEntrydivide = new QName("http://webservice.sjtu.edu","divide");//除法
// 指定plus方法的参数值为两个,分别是加数和被加数
Object[] opAddEntryArgs = new Object[] { 1,2 };
// 指定plus方法返回值的数据类型的Class对象
Class[] classes = new Class[] { float.class };
// 调用plus方法并输出该方法的返回值
System.out.println(serviceClient.invokeBlocking(opAddEntry,opAddEntryArgs, classes)[0]);
System.out.println(serviceClient.invokeBlocking(opAddEntryminus,opAddEntryArgs, classes)[0]);
System.out.println(serviceClient.invokeBlocking(opAddEntrymultiply,opAddEntryArgs, classes)[0]);
System.out.println(serviceClient.invokeBlocking(opAddEntrydivide,opAddEntryArgs, classes)[0]);
}
}
运行结果:
3.0
-1.0
2.0
0.5
2.实例
2.HelloService
(1)首先定义服务方法,代码如下所示:
package edu.sjtu.webservice;
public class HelloService {
public String sayHelloNew() {
return "hello";
}
public String sayHelloToPersonNew(String name) {
if (name == null) {
name = "nobody";
}
return "hello," + name;
}
public void updateData(String data) {
System.out.println(data + " 已更新。");
}
}
(2)参考实例1将这个方法发布为服务。
(3)编写客户端代码调用WebService(主要参考[5])
本文例子与其他例子最大的不同就在这里,其他例子一般需要根据刚才的服务wsdl生成客户端stub,然后通过stub来调用服务,这种方式显得比
较单一,客户端必须需要stub存根才能够访问服务,很不方面。本例子的客户端不采用stub方式,而是一种实现通用的调用方式,不需要任何客户端存根即
可访问服务。只需要指定对于的web servce地址、操作名、参数和函数返回类型即可。代码如下所示:
HelloServiceTest2.java
package edu.sjtu.webservice.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 HelloServiceTest2 {
private RPCServiceClient serviceClient;
private Options options;
private EndpointReference targetEPR;
public HelloServiceTest2(String endpoint) throws AxisFault {
serviceClient = new RPCServiceClient();
options = serviceClient.getOptions();
targetEPR = new EndpointReference(endpoint);
options.setTo(targetEPR);
}
public Object[] invokeOp(String targetNamespace, String opName,
Object[] opArgs, Class
[] opReturnType) throws AxisFault,
ClassNotFoundException {
// 设定操作的名称
QName opQName = new QName(targetNamespace, opName);
// 设定返回值
// Class
[] opReturn = new Class[] { opReturnType };
// 操作需要传入的参数已经在参数中给定,这里直接传入方法中调用
return serviceClient.invokeBlocking(opQName, opArgs, opReturnType);
}
/**
* @param args
* @throws AxisFault
* @throws ClassNotFoundException
*/
public static void main(String[] args) throws AxisFault,
ClassNotFoundException {
// TODO Auto-generated method stub
final String endPointReference = "http://localhost:8080/WebServiceTest1/services/HelloService";
final String targetNamespace = "http://webservice.sjtu.edu";
HelloServiceTest2 client = new HelloServiceTest2(endPointReference);
String opName = "sayHelloToPersonNew";
Object[] opArgs = new Object[] { "My Friends" };
Class
[] opReturnType = new Class[] { String[].class };
Object[] response = client.invokeOp(targetNamespace, opName, opArgs,
opReturnType);
System.out.println(((String[]) response[0])[0]);
}
}
运行该程序,点击Run As->Java application,可以看到控制台端口的输出是:Hello, My
Friends,表明客户端调用成功。该例子最大的不同和优势表现在客户端的调用方式,或者说是发起服务调用的方式,虽然比起客户端stub存根的方式,
代码稍多,但是这种方式统一,不需要生产stub存根代码,解决了客户端有很多类的问题。如果读者对这些代码进一步封装,我想调用方式很简单,只需要传递
相关参数,这更好地说明了服务调用的优势。而且这种方式更加简单明了,一看便知具体含义。而不需要弄得stub类的一些机制。
(4)改写客户端调用服务的代码
(3)中提到的客户端应用代码写的略微有些繁杂,下面将上面的客户端调用service程序进行改写,简洁了许多。代码如下:
HelloServiceTest.java
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 HelloServiceTest {
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/WebServiceTest1/services/HelloService");
options.setTo(targetEPR);
// 指定要调用的sayHelloToPerson方法及WSDL文件的命名空间
QName opAddEntry = new QName("http://webservice.sjtu.edu","sayHelloToPersonNew");
// 指定sayHelloToPerson方法的参数值
Object[] opAddEntryArgs = new Object[] { "xuwei" };
// 指定sayHelloToPerson方法返回值的数据类型的Class对象
Class[] classes = new Class[] { String.class };
// 调用sayHelloToPerson方法并输出该方法的返回值
System.out.println(serviceClient.invokeBlocking(opAddEntry,opAddEntryArgs, classes)[0]);
}
}
java调用webservice例子
最简单的Java自带实现方式Jaxws,百度一下Jaxws很完整很简单的例子
亲再给您一个更简单的,使用myecli...工具自带的webservice。。更简单!都是自动生成滴,网上搜一下myecl..的webservice就有
望采纳
自己去CSDN下载吧,你这的1000分也赶不上那的3分。
不知道你用的什么做webservice服务。据我所知,axis和cxf都有一个工具叫wsdl2java——是一个自动生成客户端的工具。剩下的……你懂得。
现在大多数项目都会用到spring,所以选择 CXF 框架,cxf能很好的和spring结合
在官网下载最新版 xcf 3.0.3 网站 http://cxf.apache.org/
MyEclipse项目结构图
cxf 必要jar包
结构图中各个文件源码
HelloWorldImpl.java
---------
import javax.jws.WebService;
@WebService(endpointInterface = "IHelloWorld", serviceName = "HelloWorld")
public class HelloWorldImpl implements IHelloWorld {
@Override
public String sayHello(String text) {
return "serviceSay: " + text;
}
}
------------------------------------------------------------------------------------------------
IHelloWorld.java
---------
import javax.jws.WebService;
@WebService
public interface IHelloWorld {
public String sayHello(String text);
}
------------------------------------------------------------------------------------------------
Test.java
---------
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.endpoint.dynamic.DynamicClientFactory;
public class Test {
public static void main(String[] args) throws Exception {
DynamicClientFactory dcf = DynamicClientFactory.newInstance();
Client c = dcf.createClient("http://localhost:8080/cxf/ws/hwUrl?wsdl");
Object[] param = new Object[] { "----test....." };
Object[] result = c.invoke("sayHello", param);
System.out.println(result[0].toString());
}
}
------------------------------------------------------------------------------------------------
cxf-servlet.xml
-----------------
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws"
xmlns:soap="http://cxf.apache.org/bindings/soap"
xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/bindings/soap http://cxf.apache.org/schemas/configuration/soap.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
<jaxws:server id="hwService" serviceclass="IHelloWorld"
address="/hwUrl">
------------------------------------------------------------------------------------------------
web.xml
---------
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
index.jsp
cxfS
org.apache.cxf.transport.servlet.CXFServlet
1
cxfS
/ws/*
------------------------------------------------------------------------------------------------
部署项目,然后运行Test.java
在浏览器里面输入 http://localhost:8080/cxf/ws/hwUrl?wsdl 可查看webservice服务接口信息
java如何调用webservice接口
Java通过WSDL文件来调用webservice:
注意,以下的代码并没有经过真正的测试,只是说明这些情况,不同版本的Axis相差很大,大家最好以apache网站上的例子为准,这里仅仅用于说明其基本用法。
1,直接AXIS调用远程的web service
这种方法比较适合那些高手,他们能直接看懂XML格式的WSDL文件,我自己是看不懂的,尤其我不是专门搞这行的,即使一段时间看懂,后来也就忘记了。直接调用模式如下:
import java.util.Date;
import java.text.DateFormat;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import javax.xml.namespace.QName;
import java.lang.Integer;
import javax.xml.rpc.ParameterMode;
public class caClient {
public static void main(String[] args) {
try {
String endpoint = "http://localhost:8080/ca3/services/caSynrochnized?wsdl";
//直接引用远程的wsdl文件
//以下都是套路
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(endpoint);
call.setOperationName("addUser");//WSDL里面描述的接口名称
call.addParameter("userName", org.apache.axis.encoding.XMLType.XSD_DATE,
javax.xml.rpc.ParameterMode.IN);//接口的参数
call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);//设置返回类型
String temp = "测试人员";
String result = (String)call.invoke(new Object[]{temp});
//给方法传递参数,并且调用方法
System.out.println("result is "+result);
}
catch (Exception e) {
System.err.println(e.toString());
}
}
}
2,直接SOAP调用远程的webservice
这种模式我从来没有见过,也没有试过,但是网络上有人贴出来,我也转过来
import org.apache.soap.util.xml.*;
import org.apache.soap.*;
import org.apache.soap.rpc.*;
import java.io.*;
import java.net.*;
import java.util.Vector;
public class caService{
public static String getService(String user) {
URL url = null;
try {
url=new URL("http://192.168.0.100:8080/ca3/services/caSynrochnized");
} catch (MalformedURLException mue) {
return mue.getMessage();
}
// This is the main SOAP object
Call soapCall = new Call();
// Use SOAP encoding
soapCall.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC);
// This is the remote object we're asking for the price
soapCall.setTargetObjectURI("urn:xmethods-caSynrochnized");
// This is the name of the method on the above object
soapCall.setMethodName("getUser");
// We need to send the ISBN number as an input parameter to the method
Vector soapParams = new Vector();
// name, type, value, encoding style
Parameter isbnParam = new Parameter("userName", String.class, user, null);
soapParams.addElement(isbnParam);
soapCall.setParams(soapParams);
try {
// Invoke the remote method on the object
Response soapResponse = soapCall.invoke(url,"");
// Check to see if there is an error, return "N/A"
if (soapResponse.generatedFault()) {
Fault fault = soapResponse.getFault();
String f = fault.getFaultString();
return f;
} else {
// read result
Parameter soapResult = soapResponse.getReturnValue ();
// get a string from the result
return soapResult.getValue().toString();
}
} catch (SOAPException se) {
return se.getMessage();
}
}
}
3,使用wsdl2java把WSDL文件转成本地类,然后像本地类一样使用,即可。
这是像我这种懒人最喜欢的方式,仍然以前面的global weather report为例。
首先 java org.apache.axis.wsdl.WSDL2Java http://www.webservicex.net/globalweather.asmx.WSDL
原本的网址是http://www.webservicex.net/globalweather.asmx?WSDL,中间个各问号,但是Linux下面它不能解析,所以去掉问号,改为点号。
那么就会出现4个文件:
GlobalWeather.java GlobalWeatherLocator.java GlobalWeatherSoap.java GlobalWeatherSoapStub.java
其中GlobalWeatherSoap.java是我们最为关心的接口文件,如果你对RMI等SOAP实现的具体细节不感兴趣,那么你只需要看接口文件即可,在使用的时候,引入这个接口即可,就好像使用本地类一样。
Java通过WSDL文件来调用webservice直接调用模式如下:
import java.util.Date;
import java.text.DateFormat;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import javax.xml.namespace.QName;
import java.lang.Integer;
import javax.xml.rpc.ParameterMode;
public class caClient {
public static void main(String[] args) {
try {
String endpoint = "http://localhost:8080/ca3/services/caSynrochnized?wsdl";
//直接引用远程的wsdl文件
//以下都是套路
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(endpoint);
call.setOperationName("addUser");//WSDL里面描述的接口名称
call.addParameter("userName", org.apache.axis.encoding.XMLType.XSD_DATE,
javax.xml.rpc.ParameterMode.IN);//接口的参数
call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);//设置返回类型
String temp = "测试人员";
String result = (String)call.invoke(new Object[]{temp});
//给方法传递参数,并且调用方法
System.out.println("result is "+result);
}
catch (Exception e) {
System.err.println(e.toString());
}
}
}
http://www.blogjava.net/zjhiphop/archive/2009/04/29/webservice.html
有几种方法
Java调用WebService可以直接使用Apache提供的axis.jar自己编写代码,或者利用Eclipse自动生成WebService Client代码,利用其中的Proxy类进行调用。理论上是一样的,只不过用Eclipse自动生成代码省事些。
1、编写代码方式:
package com.yudun.test;
import java.rmi.RemoteException;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.message.PrefixedQName;
import org.apache.axis.message.SOAPHeaderElement;
import com.cezanne.golden.user.Exception;
import com.cezanne.golden.user.UserManagerServiceProxy;
import javax.xml.namespace.QName;
import java.net.MalformedURLException;
import javax.xml.rpc.ServiceException;
import javax.xml.soap.Name;
import javax.xml.soap.SOAPException;
public class testWebService {
public static String getResult() throws ServiceException, MalformedURLException, RemoteException, SOAPException
{
//标识Web Service的具体路径
String endpoint = "WebService服务地址";
// 创建 Service实例
Service service = new Service();
// 通过Service实例创建Call的实例
Call call = (Call) service.createCall();
//将Web Service的服务路径加入到call实例之中.
call.setTargetEndpointAddress( new java.net.URL(endpoint) );//为Call设置服务的位置
// 由于需要认证,故需要设置调用的SOAP头信息。
Name headerName = new PrefixedQName( new QName("发布的wsdl里的targetNamespace里的url", "string_itemName") );
org.apache.axis.message.SOAPHeaderElement header = new SOAPHeaderElement(headerName);
header.addTextNode( "blablabla" );
call.addHeader(header);
// SOAPHeaderElement soapHeaderElement = new SOAPHeaderElement("发布的wsdl里的targetNamespace里的url", "SoapHeader");
// soapHeaderElement.setNamespaceURI("发布的wsdl里的targetNamespace里的url");
// try
// {
// soapHeaderElement.addChildElement("string_itemName").setValue("blablabla");
// }
// catch (SOAPException e)
// {
// e.printStackTrace();
// }
// call.addHeader(soapHeaderElement);
//调用Web Service的方法
org.apache.axis.description.OperationDesc oper;
org.apache.axis.description.ParameterDesc param;
oper = new org.apache.axis.description.OperationDesc();
oper.setName("opName");
param = new org.apache.axis.description.ParameterDesc(new javax.xml.namespace.QName("", "arg0"), org.apache.axis.description.ParameterDesc.IN, new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "string"), java.lang.String.class, false, false);
param.setOmittable(true);
oper.addParameter(param);
param = new org.apache.axis.description.ParameterDesc(new javax.xml.namespace.QName("", "arg1"), org.apache.axis.description.ParameterDesc.IN, new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "string"), java.lang.String.class, false, false);
param.setOmittable(true);
oper.addParameter(param);
param = new org.apache.axis.description.ParameterDesc(new javax.xml.namespace.QName("", "arg2"), org.apache.axis.description.ParameterDesc.IN, new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "string"), java.lang.String.class, false, false);
param.setOmittable(true);
oper.addParameter(param);
oper.setReturnType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "string"));
oper.setReturnClass(java.lang.String.class);
oper.setReturnQName(new javax.xml.namespace.QName("", "return"));
oper.setStyle(org.apache.axis.constants.Style.WRAPPED);
oper.setUse(org.apache.axis.constants.Use.LITERAL);
oper.addFault(new org.apache.axis.description.FaultDesc(
new javax.xml.namespace.QName("发布的wsdl里的targetNamespace里的url", "Exception"),
"Exception",
new javax.xml.namespace.QName("发布的wsdl里的targetNamespace里的url", "Exception"),
true
));
call.setOperation( oper );
call.setOperationName(new javax.xml.namespace.QName("发布的wsdl里的targetNamespace里的url", "opName"));
//调用Web Service,传入参数
String res = ( String ) call.invoke( new Object[]("arg0","arg1"));
System.out.println("===============");
return res;
}
/**
* @param args
*/
public static void main(String[] args) {
try {
System.out.println(getResult());
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
} catch (ServiceException e) {
e.printStackTrace();
} catch (SOAPException e) {
e.printStackTrace();
}
}
}
2、利用Eclipse自动生成WebService client代码就容易多了:(由于还不会发图片,就用语言描述了,大家酬和看吧。。。)
首先,new project,选择other,在输入框中输入Web Service Client,选中搜索后的结果,点击Next,在Service definition中输入 WebService的发布地址,点击Finish
这样,WebService Client代码已经生成好了。
接下来写一个Test类,在main函数中输入如下代码:
String endpoint = "服务器的WebService的地址";
YourWebServiceNameProxy umsp = new YourWebServiceNameProxy (endpoint);
try {
String resultStr = umsp.opMethod("arg0","arg1");
System.out.println(resultStr);
} catch (Exception e) {
System.out.println("异常");
e.printStackTrace();
} catch (RemoteException e) {
System.out.println("RemoteException异常");
e.printStackTrace();
}
如果还有疑问的话还有视频,如果对你有帮助请采纳!
用java怎么写webservice?
JDK1.5就已经有了WS的解决方案,API里面有
下一个spring webservice,里边有helloworld,很简单
下一个spring webservice,里边有helloworld
网上直接百度应该都有吧
Web Services以XML作为数据交换的标准格式,它是跨平台的应用,允许以任何方式创建Web Services,在.NET、Java平台上访问。
在Java平台创建和访问Web Service多通过Axis完成。Axis本质上就是一个SOAP引擎,提供创建服务器端、客户端和网关SOAP操作的基本框架。Axis目前版本是为Java编写的。在使用Axis访问Web Service时,需要引入以下包(10个):axis-ant.jar、axis.jar、commons-discovery-0.2.jar、commons-logging-1.0.4.jar、jaxrpc.jar、log4j-1.2.8.jar、saaj.jar、wsdl4j-1.5.1.jar、activation-1.1.jar和mail-1.4.jar。
(1)访问Java创建的Web Service
在当前Java客户端应用中添加相应的10个Axis包,编写客户端程序:
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
public class Test {
public static void main(String[] args) throws Exception {
try{
String endpoint = "http://localhost:8080/MyService/services/Hello";
Service service = new Service();
Call call = (Call)service.createCall();
call.setTargetEndpointAddress(new java.net.URL(endpoint));
call.setOperationName("getHello");
String res = (String) call.invoke(new Object[]{});
System.out.println(res);
}
catch (Exception ex){
ex.printStackTrace();
}
}
}
其中两处代码加粗,第一处表示引用Java Web Service的URL,第二处表示公共的方法名称。
java调用webservice出错了!
The resource cannot be found.
java实现webservice实例
文章分类:Java编程
今天下午突然想研究下WEBSERVICE,从网上找了好多实例,但很多写的让人实在难以恭维,花了三个小时的圈圈转后总算搞通了,其实也挺简单的,这里特别感谢http://www.liuzm.com/article/java/992.htm这篇文章,总算让我弄明白了,现在贴出我的实例步骤,感谢那个博主的同时,与大家共同分享。
一:
首先创建个WEB工程,然后: http://ws.Apache.org/axis/网站下载Axis安装包.当然还依赖其他包的,我这里在附件里上传了所有应用到得包,方便大家。
二:
然后就写wsdd 文件(注:其实这里真的不用,可以跳过第二步)为了生成这个文件:server-config.wsdd
deploy.wsdd:
http://xml.apache.org/axis/wsdd/providers/java">
在DOS下转换目录到%TOMCAT_HOME%\webapps\axis\WEB-INF,命令:
java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient deploy.wsdd
三:
可以自己写第二步中的文件,代码如下:
放到 WEB-INF 目录下 和web.xml一起,其中,WEB.XML可以直接从你下载的axis项目中拿来到自己工程就好,或者自己添加:
AxisServlet
org.apache.axis.transport.http.AxisServlet
AxisServlet
/services/*
四:
服务端提供的方法:
package server;
public class SayHello {
public String getName(String name) {
return "hello====>" + name;
}
}
五:
客户端访问服务端接口获得数据的方法:
package client;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
public class TestClient {
public static void main(String[] args) throws Exception {
// 指出service所在URL
String endpoint = "http://127.0.0.1:8082/webservice/services/Login.jws";
// 创建一个服务(service)调用(call)
Service service = new Service();
Call call = (Call) service.createCall();// 通过service创建call对象
// 设置service所在URL
call.setTargetEndpointAddress(new java.net.URL(endpoint));
// 方法名(processService)与MyService.java方法名保持一致
call.setOperationName("getName");
// Object 数组封装了参数,参数为"This is Test!",调用processService(String arg)
String ret = (String) call.invoke(new Object[] { "继中" });
System.out.println(ret);
}
}
六:启动tomcat,先访问http://127.0.0.1:8082/webservice/services,看是否有方法显示,有显示,则代表服务端提供的接口可以成功访问了。
我的效果是这样:
And now... Some Services
?Login.jws (wsdl)
?getName
七:
然后在本地跑客户端TestClient,就应该有结果啦,大家试试吧。
需要lib.jar可以到这里找http://yangjizhong.javaeye.com/blog/579511