读书人

用eclipse基于jdk1.4跟1.6开发webserv

发布时间: 2012-12-22 12:05:07 作者: rapoo

用eclipse基于jdk1.4和1.6开发webservice
1.序言2
2.基于jdk1.6开发webservice2
2.1环境要求2
2.2服务端开发2
2.2.1新建java工程2
2.2.2编写服务类3
2.2.3生成jaxws4
2.2.4webservice发布类4
2.3客户端开发5
2.3.1新建java项目5
2.3.2编写执行wsimport的build.xml5
2.3.3客户端调用6
3.基于jdk1.4开发webservice6
3.1环境要求6
3.2Axis介绍7
3.3新建web工程7
3.4web工程配置8
3.5DII方式开发9
3.5.1服务端开发9
3.5.2客户端开发10
3.6WSDD方式11
3.6.1服务端开发11
3.6.2客户端开发12
3.7Stubs方式13
3.7.1java2wsdl13
3.7.2wsdl2java14
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.4webservice发布类
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.2Axis介绍
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.4web工程配置
将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.5DII方式开发
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.6WSDD方式
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.7Stubs方式
这种实现方式是比较流行的方式,他将用于发布服务的提供商和用于引用服务的应用商有效的实现了分离,而且较之于前两种开发方法,Stubs不需要程序员关注WebService的返回类型,也就是不用我们去关心wsdl,因为他是axis自动生成的,例如webservice要返回一个Stirng[]类型,axis自动将其转化为Array,调用也简单。这种方式是在EJB基础上发展起来的,熟悉EJB的人应该很熟悉这种方式,所以stubs方式是这几种开发方式中最成熟的方法。下面是主要开发步骤:
3.7.1java2wsdl
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.2wsdl2java
客户端就是把服务端的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工程结构目录


读书人网 >Web前端

热点推荐