- 浏览: 6129 次
- 性别:
- 来自: 珠海
文章分类
最新评论
用eclipse基于jdk1.4和1.6开发webservice
1. 序言 2
2. 基于jdk1.6开发webservice 2
2.1 环境要求 2
2.2 服务端开发 2
2.2.1 新建java工程 2
2.2.2 编写服务类 3
2.2.3 生成jaxws 4
2.2.4 webservice发布类 4
2.3 客户端开发 5
2.3.1 新建java项目 5
2.3.2 编写执行wsimport的build.xml 5
2.3.3 客户端调用 6
3. 基于jdk1.4开发webservice 6
3.1 环境要求 6
3.2 Axis介绍 7
3.3 新建web工程 7
3.4 web工程配置 8
3.5 DII方式开发 9
3.5.1 服务端开发 9
3.5.2 客户端开发 10
3.6 WSDD方式 11
3.6.1 服务端开发 11
3.6.2 客户端开发 12
3.7 Stubs方式 13
3.7.1 java2wsdl 13
3.7.2 wsdl2java 14
3.7.3 客户端测试 16
1. 序言
Webservice技术作为跨平台数据交换的重要工具,应用日益广泛,java对webservice的支持分为jdk6.0以前和jdk6.0以后,jdk6.0以前java实现webservice必须利用web容器,如:tomcat,和第三方jar包,如ajax;从jdk6.0开始则独立支持webservice,不用任何web容器和第三方jar包的支持,与以前的版本相比,具有不可比拟的优势,有了质的飞跃。但一些运行在jdk1.4的基础上的老项目又必须用1.4的jdk,如容器为websphere6.0及以前版本的项目,而websphere又不能指定jdk等等,如果在此基础上加功能,仍然只能用jdk1.4。.下面以eclipse3.5为IDE分别介绍基于jdk1.6和基于jdk1.4的webservice开发。
本文的源代码可以下载:http://sourceforge.net/projects/dazen/files/
2. 基于jdk1.6开发webservice
2.1 环境要求
用jdk1.6开发webservice的开发环境只要jdk1.6和eclipse3.5即可。
2.2 服务端开发
服务的开发工作主要包括服务类和build.xml的编写、生成jaxws包和webservice发布类等工作。
2.2.1 新建java工程
新建java工程,工程名称为:wsServer
图2 1 新建java工程
2.2.2 编写服务类
包结构如下图所示:
图2 2 包结构
其中Helloworld.java代码如下:
package ws.service;
import javax.jws.WebService;
/**
* @author zjd
*
*/
@WebService
public class HelloWorld
{
public String sayHello(String name) {
return "Hello " + name + "! using jkd1.6";
}
2.2.3 生成jaxws
其中build.xml代码如下:
<project default="wsgen">
<target name="wsgen">
<exec executable="D:\jdk1.6.0_05\bin\wsgen.exe">
<arg line="-cp ../../../bin -keep -s ../../../src -d ../../../bin ws.service.HelloWorld" />
</exec>
</target>
</project>
运行build.xml,自动在service包下产生jaxws包,如下图所示:
图2 3 jaxws包
2.2.4 webservice发布类
package ws.service;
import javax.xml.ws.Endpoint;
public class RunWebService
{
public static void main(String[] args) {
System.out.println("HelloWorld Web Service with jdk1.6 started.");
Endpoint.publish("http://localhost:8000/helloWorld", new HelloWorld());
}
}
运行该类即可发布webservice。如下图所示:
图2 4 发布结果
2.3 客户端开发
客户端开发更为简单,只要建立执行wsimport.exe的build.xml文件,执行后根据wsdl文件自动产生客户端程序,然后调用这些程序即可实现webservice访问。
2.3.1 新建java项目
新建java项目,项目名称为:wsClient
2.3.2 编写执行wsimport的build.xml
在wsClient目录下建立build.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project default="wsimport">
<target name="wsimport">
<exec executable="D:\jdk1.6.0_05\bin\wsimport.exe">
<arg line="-s ./src -d ./bin http://localhost:8000/helloWorld?wsdl" />
</exec>
</target>
</project>
执行前要求运行RunWebService来启动webservcie服务。执行后如下图所示:
图2 5 执行结果
执行后的工程目录结构如下:
图2 6 工程目录结构
其中ws.service包是由build.xml自动生成。
2.3.3 客户端调用
package ws.client;
import ws.service.HelloWorld;
import ws.service.HelloWorldService;
public class CallWebService
{
public static void main(String[] args) {
HelloWorld helloWorld = new HelloWorldService().getHelloWorldPort();
String str = helloWorld.sayHello("大众ERP");
System.out.println(str);
}
}
执行该程序,运行结果如下:
图2 7 执行结果
3. 基于jdk1.4开发webservice
3.1 环境要求
用jdk1.4开发webservice的开发环境需要jdk1.4、eclipse3.5、tomcat5.5.26(运行需要jdk1.5)、axis-1_4,此外还需要activation.jar和mail.jar,这两个必须是jdk1.4及以前的版本编译的。
3.2 Axis介绍
Axis(Apache extensible Interaction system)是Apache项目组织的一个开源项目。现在有axis2,但高一点的版本需要jdk1.5。Axis的前身是Apache SOAP,它通过如下方法来扩展了soap2.0的功能:
1、AXIS的关键功能和优势表现在速度,早期的SOAP的分析机制是基于DOM的,而AXIS是基于SAX的;
2、灵活性,提供了在引擎中插入新扩展的功能,可以对头部信息的处理和系统管理进行定制,在WSDD中对服务,Handler对象和串行并行程序进行描述;
3、面向组件展开,引入了链接chainable和Handler的概念;
4、传输框架,SOAP可以建立在SMTP, FTP, HTTP等多种传输层协议上。
Axis支持三种web service的部署和开发,分别为:
1、Dynamic Invocation Interface ( DII)
2、Dynamic Proxy方式
3、Stubs方式
对于前两种Web Service的发布基本一样,客户端的访问也很类似,第一种发布就是直接将.java后缀改为.jws,并将生成的.class文件拷贝到WEB-INF/jwsclasses下面,这样的例子直接在Axis上就有,非常简单,但它也有缺陷,就是不适合程序部署和大型项目开发,而且不支持包(package)的形式,第三种是目前比较流行的方式,stub意思是树桩,意味着服务端和客户端都是通过桩的形式来完成访问的,即在服务端将java转换成wsd,在客户端将wsdl转换成java,这样就实现了良好的桩的分离。
3.3 新建web工程
新建动态web工程,项目名称为:wsAxis:
图3 1 新建动态web工程
3.4 web工程配置
将axis-1_4\webapps\axis中几个必须的文件拷贝到你的WsAxis工程文件下,一个是WEB-INF\lib下的所有文件,一个是WEB-INF下面的web.xml文件,我们来简单看一下web.xml这个文件
<servlet>
<servlet-name>AxisServlet</servlet-name>
<display-name>Apache-Axis Servlet</display-name>
<servlet-class>
org.apache.axis.transport.http.AxisServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/servlet/AxisServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>*.jws</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
就是说如果向容器请求/servlet/AxisServlet、*.jws、/services/*这几种映射会引起调用AxisServlet这个类,我们要用的就这几行,其他的可以删掉。
此外还需要把activation.jar和mail.jar拷到WEB-INF\lib目录下。
整个工程目录结构如下图所示:
图3 2 web工程结构
3.5 DII方式开发
3.5.1 服务端开发
在src下面新建一个myService.java文件,如下
public class myService
{
public String sayHello(String name) {
return "Hello " + name + ",this is an Axis DII Web Service";
}
}
注意这个java文件是不属于任何package的,如果你要将其放入某个package那么Axis会提示你找不到它生成的class文件从而不能将其转换为wsdl文件。
将myService.java拷贝到wsAxis/webContent目录下,将其后缀改为jws。
在comcat的conf/server.xml文件的Host中加项目引用:
<Context debug="0" docBase="D:\workspace\wsAxis\WebContent" path="/wsAxis" reloadable="false" crossContext="true"/>
启动Tomcat,输入http://localhost:8080/wsAxis/myService.jws?wsdl,会看到如下界面:
图3 3 myService.jws效果
这时候在WEB-INF下面会由Axis自动生成一个jwsClasses文件夹,jwsClasses下面会有一个myService.class文件。
3.5.2 客户端开发
在com.client包下新建一个TestorByjws.java,代码如下:
package com.client;
import javax.xml.rpc.ParameterMode;
import javax.xml.rpc.encoding.XMLType;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
public class TestorByjws
{
public static void main(String[] args) {
try {
String endpoint = "http://localhost:8080/wsAaxis/myService.jws";
String name = " 大众ERP";
Service service = new Service();
Call call = (Call)service.createCall();
call.setTargetEndpointAddress(new java.net.URL(endpoint));
call.addParameter("param1", XMLType.XSD_STRING, ParameterMode.IN);
call.setOperationName("getusername");
call.setReturnType(XMLType.XSD_STRING);
String ret = (String)call.invoke(new Object[]{name});
System.out.println("返回结果:" + ret);
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行结果如下:
图3 4 运行结果
3.6 WSDD方式
3.6.1 服务端开发
动态代理就是通过wsdd来描述Web服务,而不是直接访问jws,前面说过jws是不支持包的,而且运行也不稳定,所以不推荐此种方法,wsdd和wsdl的区别在于前者只描述Web服务和操作方法以及传输方式,它相对于wsdl要简单的多,更易被人读懂。为了更好的区分,我们将myService放入com.service包下,这就是WSDD的好处,它不像DII不能建包,并修改代码如下:
package com.service;
public class myService
{
public String sayHello(String name) {
return "Hello " + name + ",this is an Axis WSDD Web Service";
}
}
在WEB-INF下新建一个server-config.wsdd文件,代码如下:
<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<handler type="java:org.apache.axis.handlers.http.URLMapper" name="URLMapper"/>
<service name="myService" provider="java:RPC">
<parameter name="className" value="com.service.myService"/>
<parameter name="allowedMethods" value="sayHello"/>
</service>
<transport name="http">
<requestFlow>
<handler type="URLMapper"/>
</requestFlow>
</transport>
</deployment>
这就是WSDD的全部内容,它描述一个Web Service发布。注:添加此文件后http://localhost:8080/wsAxis/myService.jws?wsdl不能再访问。
测试发布的myService,重启Tomcat,在浏览器输入http://localhost:8080/wsAxis/servlet/AxisServlet;如果出现如下界面表示你的Web Service发布成功
图3 5 WSDD发布结果
3.6.2 客户端开发
在com.client下新建一个TestorByWSDD.java,代码如下:
package com.client;
import java.net.MalformedURLException;
import java.rmi.RemoteException;
import javax.xml.rpc.ServiceException;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
public class TestorByWSDD
{
public static void main(String[] args) throws ServiceException, MalformedURLException, RemoteException {
String endpoint = "http://localhost:8080/wsAxis/services/myService";
Service service = new Service(); // 创建一个Service实例,注意是必须的!
Call call = (Call)service.createCall(); // 创建Call实例,也是必须的!
call.setTargetEndpointAddress(new java.net.URL(endpoint));// 为Call设置服务的位置
call.setOperationName("sayHello"); // 注意方法名与JavaBeanWS.java中一样!!
String res = (String)call.invoke(new Object[]{"大众ERP"}); // 返回String,传入参数
System.out.println(res);
}
}
运行结果如图:
图3 6 运行结果
3.7 Stubs方式
这种实现方式是比较流行的方式,他将用于发布服务的提供商和用于引用服务的应用商有效的实现了分离,而且较之于前两种开发方法,Stubs不需要程序员关注WebService的返回类型,也就是不用我们去关心wsdl,因为他是axis自动生成的,例如webservice要返回一个Stirng[]类型,axis自动将其转化为Array,调用也简单。这种方式是在EJB基础上发展起来的,熟悉EJB的人应该很熟悉这种方式,所以stubs方式是这几种开发方式中最成熟的方法。下面是主要开发步骤:
3.7.1 java2wsdl
1. 在WsAxis根目录下建立两文件夹:java2wsdl和wsdl2java,在java2wsdl文件夹下新建一个名为build.xml的Ant构建,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<project name="Generate WSDL from JavaBeans as Web Services" default="j2w-all" basedir=".">
<property name="build.dir" value="../WEB-INF/classes" />
<property name="axis.dir" location="../WEB-INF" />
<path id="classpath.id">
<fileset dir="${axis.dir}/lib">
<include name="*.jar" />
</fileset>
<pathelement location="${build.dir}" />
</path>
<taskdef name="axis-java2wsdl" classname="org.apache.axis.tools.ant.wsdl.Java2WsdlAntTask" loaderref="axis">
<classpath refid="classpath.id" />
</taskdef>
<target name="j2w-all">
<antcall target="j2w-JavaBeanWS" />
</target>
<target name="j2w-JavaBeanWS">
<axis-java2wsdl classname="com.service.myService"
classpath="${build.dir}"
methods="sayHello"
output="../wsdl2java/myService.wsdl"
location="http://localhost:8080/wsAxis/services/myService"
namespace="http://localhost:8080/wsAxis/services/myService"
namespaceImpl="http://localhost:8080/wsAxis/services/myService">
</axis-java2wsdl>
</target>
</project>
其中:classname表示MyService存放的路径,methods表示webservice中的方法,方法名称必须和MyService中的方法一致,否则即使构建成功了也不能执行,output是输出的wsdl名称,location是myService的访问地址,用于客户调用,namespace是命名空间,有了命名空间你就可以通过namespace.webservice的方法来调用这个webservice。
运行Ant构建,在java2wsdl目录下会自动生成一个myService.wsdl的文件,运行结果如下:
图3 7 java2wsdl运行结果
3.7.2 wsdl2java
客户端就是把服务端的wsdl文件转换为java文件以便于客户端的调用执行,理论上服务端和客户端是分离的,他们属于不同的系统和项目,两者毫无相干,唯一联系他们的是wsdl,但我们为了方便都放在wsAxis项目中,并且wsdl文件直接生成在wsdl2java目录中,客户端的做法是将发布商发布的wsdl文件拷贝到自己的项目中,在wsdl2java目录中创建build.xml文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<project name="wsclient" default="all" basedir=".">
<property name="axis.home" location="../WEB-INF"/>
<property name="options.output" location="../../src"/>
<path id="axis.classpath">
<fileset dir="${axis.home}/lib">
<include name="**/*.jar"/>
</fileset>
</path>
<taskdef resource="axis-tasks.properties" classpathref="axis.classpath" />
<target name="-WSDL2Axis" depends="init">
<mkdir dir="${options.output}"/>
<axis-wsdl2java output="${options.output}" url="${options.WSDL-URI}" verbose="true"/>
</target>
<target name="init">
<echo>Warning: please update the associated WSDL file(s) in the folder wsdl before running the target!</echo>
<echo>Warning: Just run the target(s) related with your developing work!</echo>
<echo></echo>
</target>
<target name="all">
<antcall target="myService"/>
</target>
<target name="myService">
<antcall target="-WSDL2Axis">
<param name="options.WSDL-URI" location="./myService.wsdl"/>
</antcall>
</target>
</project>
运行Ant构建,运行结果如下:
图3 8 wsdl 2java运行提示
在wsdl2java文件夹会自动生成各种类,在localhost包下面,其目录结构如下:
图3 9 wsdl 2java运行结果
localhost包中,我们实际需要直接调用得的就只有*ServiceLocator.java和* Service.java类,ServiceLocator是获得webservice的定位,*Service.java是具体实现类。
3.7.3 客户端测试
编写客户端测试代码,在com.client新建一个TestorByStubs.java,内容如下:
package com.client;
import localhost.wsAxis.services.myService.MyService;
import localhost.wsAxis.services.myService.MyServiceServiceLocator;
public class TestorByStubs {
public static void main(String[] args) throws Exception
{
MyServiceServiceLocator Service= new MyServiceServiceLocator();
MyService port= Service.getmyService();
String response=port.sayHello("大众ERP");
System.out.println(response);
}
}
运行此类的结果如下:
图3 10 运行结果
至此,Eclipse开发webservice的讲解已全部结束,整个wsAxis工程的结构目录如下,希望对您有所帮助。
图3 11 wsAxis工程结构目录
2. 基于jdk1.6开发webservice 2
2.1 环境要求 2
2.2 服务端开发 2
2.2.1 新建java工程 2
2.2.2 编写服务类 3
2.2.3 生成jaxws 4
2.2.4 webservice发布类 4
2.3 客户端开发 5
2.3.1 新建java项目 5
2.3.2 编写执行wsimport的build.xml 5
2.3.3 客户端调用 6
3. 基于jdk1.4开发webservice 6
3.1 环境要求 6
3.2 Axis介绍 7
3.3 新建web工程 7
3.4 web工程配置 8
3.5 DII方式开发 9
3.5.1 服务端开发 9
3.5.2 客户端开发 10
3.6 WSDD方式 11
3.6.1 服务端开发 11
3.6.2 客户端开发 12
3.7 Stubs方式 13
3.7.1 java2wsdl 13
3.7.2 wsdl2java 14
3.7.3 客户端测试 16
1. 序言
Webservice技术作为跨平台数据交换的重要工具,应用日益广泛,java对webservice的支持分为jdk6.0以前和jdk6.0以后,jdk6.0以前java实现webservice必须利用web容器,如:tomcat,和第三方jar包,如ajax;从jdk6.0开始则独立支持webservice,不用任何web容器和第三方jar包的支持,与以前的版本相比,具有不可比拟的优势,有了质的飞跃。但一些运行在jdk1.4的基础上的老项目又必须用1.4的jdk,如容器为websphere6.0及以前版本的项目,而websphere又不能指定jdk等等,如果在此基础上加功能,仍然只能用jdk1.4。.下面以eclipse3.5为IDE分别介绍基于jdk1.6和基于jdk1.4的webservice开发。
本文的源代码可以下载:http://sourceforge.net/projects/dazen/files/
2. 基于jdk1.6开发webservice
2.1 环境要求
用jdk1.6开发webservice的开发环境只要jdk1.6和eclipse3.5即可。
2.2 服务端开发
服务的开发工作主要包括服务类和build.xml的编写、生成jaxws包和webservice发布类等工作。
2.2.1 新建java工程
新建java工程,工程名称为:wsServer
图2 1 新建java工程
2.2.2 编写服务类
包结构如下图所示:
图2 2 包结构
其中Helloworld.java代码如下:
package ws.service;
import javax.jws.WebService;
/**
* @author zjd
*
*/
@WebService
public class HelloWorld
{
public String sayHello(String name) {
return "Hello " + name + "! using jkd1.6";
}
2.2.3 生成jaxws
其中build.xml代码如下:
<project default="wsgen">
<target name="wsgen">
<exec executable="D:\jdk1.6.0_05\bin\wsgen.exe">
<arg line="-cp ../../../bin -keep -s ../../../src -d ../../../bin ws.service.HelloWorld" />
</exec>
</target>
</project>
运行build.xml,自动在service包下产生jaxws包,如下图所示:
图2 3 jaxws包
2.2.4 webservice发布类
package ws.service;
import javax.xml.ws.Endpoint;
public class RunWebService
{
public static void main(String[] args) {
System.out.println("HelloWorld Web Service with jdk1.6 started.");
Endpoint.publish("http://localhost:8000/helloWorld", new HelloWorld());
}
}
运行该类即可发布webservice。如下图所示:
图2 4 发布结果
2.3 客户端开发
客户端开发更为简单,只要建立执行wsimport.exe的build.xml文件,执行后根据wsdl文件自动产生客户端程序,然后调用这些程序即可实现webservice访问。
2.3.1 新建java项目
新建java项目,项目名称为:wsClient
2.3.2 编写执行wsimport的build.xml
在wsClient目录下建立build.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project default="wsimport">
<target name="wsimport">
<exec executable="D:\jdk1.6.0_05\bin\wsimport.exe">
<arg line="-s ./src -d ./bin http://localhost:8000/helloWorld?wsdl" />
</exec>
</target>
</project>
执行前要求运行RunWebService来启动webservcie服务。执行后如下图所示:
图2 5 执行结果
执行后的工程目录结构如下:
图2 6 工程目录结构
其中ws.service包是由build.xml自动生成。
2.3.3 客户端调用
package ws.client;
import ws.service.HelloWorld;
import ws.service.HelloWorldService;
public class CallWebService
{
public static void main(String[] args) {
HelloWorld helloWorld = new HelloWorldService().getHelloWorldPort();
String str = helloWorld.sayHello("大众ERP");
System.out.println(str);
}
}
执行该程序,运行结果如下:
图2 7 执行结果
3. 基于jdk1.4开发webservice
3.1 环境要求
用jdk1.4开发webservice的开发环境需要jdk1.4、eclipse3.5、tomcat5.5.26(运行需要jdk1.5)、axis-1_4,此外还需要activation.jar和mail.jar,这两个必须是jdk1.4及以前的版本编译的。
3.2 Axis介绍
Axis(Apache extensible Interaction system)是Apache项目组织的一个开源项目。现在有axis2,但高一点的版本需要jdk1.5。Axis的前身是Apache SOAP,它通过如下方法来扩展了soap2.0的功能:
1、AXIS的关键功能和优势表现在速度,早期的SOAP的分析机制是基于DOM的,而AXIS是基于SAX的;
2、灵活性,提供了在引擎中插入新扩展的功能,可以对头部信息的处理和系统管理进行定制,在WSDD中对服务,Handler对象和串行并行程序进行描述;
3、面向组件展开,引入了链接chainable和Handler的概念;
4、传输框架,SOAP可以建立在SMTP, FTP, HTTP等多种传输层协议上。
Axis支持三种web service的部署和开发,分别为:
1、Dynamic Invocation Interface ( DII)
2、Dynamic Proxy方式
3、Stubs方式
对于前两种Web Service的发布基本一样,客户端的访问也很类似,第一种发布就是直接将.java后缀改为.jws,并将生成的.class文件拷贝到WEB-INF/jwsclasses下面,这样的例子直接在Axis上就有,非常简单,但它也有缺陷,就是不适合程序部署和大型项目开发,而且不支持包(package)的形式,第三种是目前比较流行的方式,stub意思是树桩,意味着服务端和客户端都是通过桩的形式来完成访问的,即在服务端将java转换成wsd,在客户端将wsdl转换成java,这样就实现了良好的桩的分离。
3.3 新建web工程
新建动态web工程,项目名称为:wsAxis:
图3 1 新建动态web工程
3.4 web工程配置
将axis-1_4\webapps\axis中几个必须的文件拷贝到你的WsAxis工程文件下,一个是WEB-INF\lib下的所有文件,一个是WEB-INF下面的web.xml文件,我们来简单看一下web.xml这个文件
<servlet>
<servlet-name>AxisServlet</servlet-name>
<display-name>Apache-Axis Servlet</display-name>
<servlet-class>
org.apache.axis.transport.http.AxisServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/servlet/AxisServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>*.jws</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
就是说如果向容器请求/servlet/AxisServlet、*.jws、/services/*这几种映射会引起调用AxisServlet这个类,我们要用的就这几行,其他的可以删掉。
此外还需要把activation.jar和mail.jar拷到WEB-INF\lib目录下。
整个工程目录结构如下图所示:
图3 2 web工程结构
3.5 DII方式开发
3.5.1 服务端开发
在src下面新建一个myService.java文件,如下
public class myService
{
public String sayHello(String name) {
return "Hello " + name + ",this is an Axis DII Web Service";
}
}
注意这个java文件是不属于任何package的,如果你要将其放入某个package那么Axis会提示你找不到它生成的class文件从而不能将其转换为wsdl文件。
将myService.java拷贝到wsAxis/webContent目录下,将其后缀改为jws。
在comcat的conf/server.xml文件的Host中加项目引用:
<Context debug="0" docBase="D:\workspace\wsAxis\WebContent" path="/wsAxis" reloadable="false" crossContext="true"/>
启动Tomcat,输入http://localhost:8080/wsAxis/myService.jws?wsdl,会看到如下界面:
图3 3 myService.jws效果
这时候在WEB-INF下面会由Axis自动生成一个jwsClasses文件夹,jwsClasses下面会有一个myService.class文件。
3.5.2 客户端开发
在com.client包下新建一个TestorByjws.java,代码如下:
package com.client;
import javax.xml.rpc.ParameterMode;
import javax.xml.rpc.encoding.XMLType;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
public class TestorByjws
{
public static void main(String[] args) {
try {
String endpoint = "http://localhost:8080/wsAaxis/myService.jws";
String name = " 大众ERP";
Service service = new Service();
Call call = (Call)service.createCall();
call.setTargetEndpointAddress(new java.net.URL(endpoint));
call.addParameter("param1", XMLType.XSD_STRING, ParameterMode.IN);
call.setOperationName("getusername");
call.setReturnType(XMLType.XSD_STRING);
String ret = (String)call.invoke(new Object[]{name});
System.out.println("返回结果:" + ret);
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行结果如下:
图3 4 运行结果
3.6 WSDD方式
3.6.1 服务端开发
动态代理就是通过wsdd来描述Web服务,而不是直接访问jws,前面说过jws是不支持包的,而且运行也不稳定,所以不推荐此种方法,wsdd和wsdl的区别在于前者只描述Web服务和操作方法以及传输方式,它相对于wsdl要简单的多,更易被人读懂。为了更好的区分,我们将myService放入com.service包下,这就是WSDD的好处,它不像DII不能建包,并修改代码如下:
package com.service;
public class myService
{
public String sayHello(String name) {
return "Hello " + name + ",this is an Axis WSDD Web Service";
}
}
在WEB-INF下新建一个server-config.wsdd文件,代码如下:
<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<handler type="java:org.apache.axis.handlers.http.URLMapper" name="URLMapper"/>
<service name="myService" provider="java:RPC">
<parameter name="className" value="com.service.myService"/>
<parameter name="allowedMethods" value="sayHello"/>
</service>
<transport name="http">
<requestFlow>
<handler type="URLMapper"/>
</requestFlow>
</transport>
</deployment>
这就是WSDD的全部内容,它描述一个Web Service发布。注:添加此文件后http://localhost:8080/wsAxis/myService.jws?wsdl不能再访问。
测试发布的myService,重启Tomcat,在浏览器输入http://localhost:8080/wsAxis/servlet/AxisServlet;如果出现如下界面表示你的Web Service发布成功
图3 5 WSDD发布结果
3.6.2 客户端开发
在com.client下新建一个TestorByWSDD.java,代码如下:
package com.client;
import java.net.MalformedURLException;
import java.rmi.RemoteException;
import javax.xml.rpc.ServiceException;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
public class TestorByWSDD
{
public static void main(String[] args) throws ServiceException, MalformedURLException, RemoteException {
String endpoint = "http://localhost:8080/wsAxis/services/myService";
Service service = new Service(); // 创建一个Service实例,注意是必须的!
Call call = (Call)service.createCall(); // 创建Call实例,也是必须的!
call.setTargetEndpointAddress(new java.net.URL(endpoint));// 为Call设置服务的位置
call.setOperationName("sayHello"); // 注意方法名与JavaBeanWS.java中一样!!
String res = (String)call.invoke(new Object[]{"大众ERP"}); // 返回String,传入参数
System.out.println(res);
}
}
运行结果如图:
图3 6 运行结果
3.7 Stubs方式
这种实现方式是比较流行的方式,他将用于发布服务的提供商和用于引用服务的应用商有效的实现了分离,而且较之于前两种开发方法,Stubs不需要程序员关注WebService的返回类型,也就是不用我们去关心wsdl,因为他是axis自动生成的,例如webservice要返回一个Stirng[]类型,axis自动将其转化为Array,调用也简单。这种方式是在EJB基础上发展起来的,熟悉EJB的人应该很熟悉这种方式,所以stubs方式是这几种开发方式中最成熟的方法。下面是主要开发步骤:
3.7.1 java2wsdl
1. 在WsAxis根目录下建立两文件夹:java2wsdl和wsdl2java,在java2wsdl文件夹下新建一个名为build.xml的Ant构建,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<project name="Generate WSDL from JavaBeans as Web Services" default="j2w-all" basedir=".">
<property name="build.dir" value="../WEB-INF/classes" />
<property name="axis.dir" location="../WEB-INF" />
<path id="classpath.id">
<fileset dir="${axis.dir}/lib">
<include name="*.jar" />
</fileset>
<pathelement location="${build.dir}" />
</path>
<taskdef name="axis-java2wsdl" classname="org.apache.axis.tools.ant.wsdl.Java2WsdlAntTask" loaderref="axis">
<classpath refid="classpath.id" />
</taskdef>
<target name="j2w-all">
<antcall target="j2w-JavaBeanWS" />
</target>
<target name="j2w-JavaBeanWS">
<axis-java2wsdl classname="com.service.myService"
classpath="${build.dir}"
methods="sayHello"
output="../wsdl2java/myService.wsdl"
location="http://localhost:8080/wsAxis/services/myService"
namespace="http://localhost:8080/wsAxis/services/myService"
namespaceImpl="http://localhost:8080/wsAxis/services/myService">
</axis-java2wsdl>
</target>
</project>
其中:classname表示MyService存放的路径,methods表示webservice中的方法,方法名称必须和MyService中的方法一致,否则即使构建成功了也不能执行,output是输出的wsdl名称,location是myService的访问地址,用于客户调用,namespace是命名空间,有了命名空间你就可以通过namespace.webservice的方法来调用这个webservice。
运行Ant构建,在java2wsdl目录下会自动生成一个myService.wsdl的文件,运行结果如下:
图3 7 java2wsdl运行结果
3.7.2 wsdl2java
客户端就是把服务端的wsdl文件转换为java文件以便于客户端的调用执行,理论上服务端和客户端是分离的,他们属于不同的系统和项目,两者毫无相干,唯一联系他们的是wsdl,但我们为了方便都放在wsAxis项目中,并且wsdl文件直接生成在wsdl2java目录中,客户端的做法是将发布商发布的wsdl文件拷贝到自己的项目中,在wsdl2java目录中创建build.xml文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<project name="wsclient" default="all" basedir=".">
<property name="axis.home" location="../WEB-INF"/>
<property name="options.output" location="../../src"/>
<path id="axis.classpath">
<fileset dir="${axis.home}/lib">
<include name="**/*.jar"/>
</fileset>
</path>
<taskdef resource="axis-tasks.properties" classpathref="axis.classpath" />
<target name="-WSDL2Axis" depends="init">
<mkdir dir="${options.output}"/>
<axis-wsdl2java output="${options.output}" url="${options.WSDL-URI}" verbose="true"/>
</target>
<target name="init">
<echo>Warning: please update the associated WSDL file(s) in the folder wsdl before running the target!</echo>
<echo>Warning: Just run the target(s) related with your developing work!</echo>
<echo></echo>
</target>
<target name="all">
<antcall target="myService"/>
</target>
<target name="myService">
<antcall target="-WSDL2Axis">
<param name="options.WSDL-URI" location="./myService.wsdl"/>
</antcall>
</target>
</project>
运行Ant构建,运行结果如下:
图3 8 wsdl 2java运行提示
在wsdl2java文件夹会自动生成各种类,在localhost包下面,其目录结构如下:
图3 9 wsdl 2java运行结果
localhost包中,我们实际需要直接调用得的就只有*ServiceLocator.java和* Service.java类,ServiceLocator是获得webservice的定位,*Service.java是具体实现类。
3.7.3 客户端测试
编写客户端测试代码,在com.client新建一个TestorByStubs.java,内容如下:
package com.client;
import localhost.wsAxis.services.myService.MyService;
import localhost.wsAxis.services.myService.MyServiceServiceLocator;
public class TestorByStubs {
public static void main(String[] args) throws Exception
{
MyServiceServiceLocator Service= new MyServiceServiceLocator();
MyService port= Service.getmyService();
String response=port.sayHello("大众ERP");
System.out.println(response);
}
}
运行此类的结果如下:
图3 10 运行结果
至此,Eclipse开发webservice的讲解已全部结束,整个wsAxis工程的结构目录如下,希望对您有所帮助。
图3 11 wsAxis工程结构目录
- 用eclipse基于jdk1.4和1.6开发webservice.pdf (254.6 KB)
- 下载次数: 88
相关推荐
通过对比JDK1.4、JDK1.5和JDK1.6之间的区别,我们可以看到Java的发展历程中不断进步和完善的方向。JDK1.5通过引入泛型、自动装箱/拆箱等功能显著提高了开发效率和代码质量;而JDK1.6则在此基础上进一步增强了这些...
尽管现在已经被更新的版本如JDK 8、JDK 11和JDK 17所取代,但JDK 1.4对于理解Java的发展历程具有重要意义。 **主要特性** 1. **异常链**:在JDK 1.4中,引入了异常链机制,允许一个异常捕获另一个异常,并将它们...
例如,Spring框架的AOP(面向切面编程)和IoC(控制反转)概念在JDK 1.4的环境下得以实现,而Hibernate的ORM(对象关系映射)技术也是基于JDK 1.4提供的JDBC和反射机制。 此外,压缩包中的`j2sdk-1_4_2_13-windows-...
在这个版本中,Java引入了许多新的特性和改进,对于Windows操作系统用户来说,这个版本的JDK在当时的软件开发环境中扮演了关键角色。 首先,JDK 1.4的主要改进之一是引入了正则表达式(Regular Expressions)的支持...
对于调试和性能分析,JDK1.4引入了新的JConsole工具,这是一个基于JMX(Java Management Extensions)的图形化管理工具,能够监控Java应用程序的运行状态,包括内存使用、线程信息、类加载等。 最后,JDK1.4对JVM...
在JDK 1.6中,Java提供了多种工具和技术来开发、部署和消费Web服务,使得开发者能够轻松地构建分布式企业级应用。 1. **Java API for XML Processing (JAXP)**:JAXP是Java处理XML的核心API,它包含了DOM、SAX和...
在使用JDK 1.4绿色版时,只需将解压后的文件夹添加到系统的PATH环境变量中,确保系统可以找到所需的可执行文件,然后就可以开始编写和运行Java程序了。 总结,JDK 1.4绿色免安装版是一个便捷的开发工具,尽管已经有...
Java开发工具JDK 1.4免安装版是一款专为编程人员设计的Java开发环境,无需繁琐的安装过程,可以直接解压使用。JDK(Java Development Kit)是Oracle公司提供的用于开发Java应用程序的重要软件包,它包含了Java编译器...
1. **支持jdk1.2 jdk1.3 jdk1.4 jdk1.5 jdk1.6**:这表明这个工具可以处理这些版本的Java编译后的字节码,意味着它可以打开并反编译这些版本的.class文件,帮助开发者查看对应时期的Java源代码。 2. **支持目录对...
jdk1.4非安装版,可直接在MyEclipse等IDE工具导入jdk相应的版本。希望对你们有用处。
这六个jar文件组合在一起,构成了一个完整的JSON处理环境,特别适合基于JDK1.4的项目使用。通过这些库,开发者可以轻松地在Java程序中解析、创建和操作JSON数据,从而实现与服务器或其他应用程序之间的数据交换。...
m2e插件是Eclipse与Maven完美结合的桥梁,尤其对于仍在使用Eclipse 3.x和JDK 1.6的开发团队来说,它提供了高效且稳定的开发环境。通过m2e,开发者可以充分利用Maven的强大功能,如自动化构建、依赖管理和项目管理,...
**JDK 1.4中文开发手册**是Java开发者的重要参考资料,它详尽地阐述了JDK 1.4版本中的各种特性和API。JDK(Java Development Kit)是Java编程语言的核心工具集,包含了编译器、调试器、文档生成工具以及Java运行时...
JDK1.4是Java开发工具包的一个重要版本,它在Java发展历程中扮演了关键角色。这个版本发布于2002年,带来了许多新的特性和改进,为后续版本奠定了基础。在此源代码中,我们可以深入理解Java语言的实现细节,以及Java...
**JDK 1.4 API 和 JDK 1.6 API 的差异** JDK(Java Development Kit)是Oracle公司发布的用于开发和运行Java应用程序的工具集合。API(Application Programming Interface)是一组预先定义好的函数和类,供开发者在...
JEE版eclipse带jdk1.6JEE版eclipse带jdk1.6JEE版eclipse带jdk1.6
标题“axis2 jdk1.4用jar”指的是在Java Development Kit (JDK) 1.4环境下使用Apache Axis2的特定版本,因为Axis2是一个基于Java的Web服务框架,它允许开发人员创建、部署和管理Web服务。在这个场景中,可能是指一个...
JCE无限制权限策略文件,下载后解压,可以看到local_policy.jar和US_export_policy.jar以及readme.txt。将两个jar文件放到%JDK_HOME%\jre\lib\security下覆盖原来文件,记得先备份
Java Development Kit...JDK 1.4的特性为现代Java打下了坚实的基础,而JDK 1.7则进一步提升了开发效率和代码质量。对于学习Java历史或者需要在特定环境中运行旧代码的开发者来说,这些版本的JDK都是非常宝贵的资源。