Eclipse下使用Apache CFX开发部署文件上传的WebService
配置和部署
该示例将展示如何配置和开发一个运行在服务器上的基于 CXF 的 Web 服务,该服务会上传客户端提交的文件。参见下列规范。
Tomcat Web 服务器 5.5 或更高版本:Tomcat servlet 引擎是一个开源包,是 Apache Software Foundation 的 Jakarta 项目的一部分。它是 servlet 和 JSP 规范的官方参考实现。Tomcat 可以作为一个独立的 Web 服务器使用,也可以作为一个 servlet/JSP 引擎实现。可以从 http://tomcat.apache.org/download-60.cgi 下载 Tomcat 的最新发行版。
Apache-cxf-2.3. 或更高版本: Apache CXF 是一个开源服务框架。CXF 帮助您使用前端编程 API(如 JAX-WS 和 JAX-RS)构建和开发服务。这些服务可以支持各种协议,如 SOAP、XML/HTTP、RESTful HTTP 或 CORBA,并可以使用多种传输方式,如 HTTP、JMS 或 JBI。您可以从 http://cxf.apache.org/download.html 下载最新版本。
Eclipse IDE:一种集成开发环境 (IDE),集编写、编辑、编译和运行计算机程序的所有工具于一体。并且,Eclipse 提供了出色的集成开发环境。您可以在 www.eclipse.org 找到 eclipse 的最新发行版。
设置环境
创建 Web 服务
package com.ibm.uploadbean;
import javax.activation.DataHandler;
public class FileUploader
{
private String Name;
private String FileType;
private DataHandler Dfile;
public String getName()
{
return this.Name;
}
public void setName(String Name)
{
this.Name = Name;
}
public DataHandler getDfile()
{
return this.Dfile;
}
public void setDfile(DataHandler Dfile)
{
this.Dfile = Dfile;
}
public String getFileType() {
return FileType;
}
public void setFileType(String FileType) {
this.FileType = FileType;
}
}
package com.ibm.uploadservice;
import javax.jws.WebParam;
import javax.jws.WebService;
import com.ibm.uploadbean.FileUploader;
@WebService
public interface UploadSEI {
void uploadFile(@WebParam(name="Dfile") FileUploader Dfile);
}
6. 创建一个名为‘UploadServiceImpl’的服务实现类,它在‘com.ibm.uploadservice’包的内部实现接口。该类定义了实现方法 uploadFile,后者使用 FileUploader bean 作为其参数。
package com.ibm.uploadservice;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.activation.DataHandler;
import javax.jws.WebService;
import com.ibm.uploadbean.FileUploader;
@WebService(endpointInterface = "com.ibm.uploadservice.UploadSEI",
serviceName = "UploadService")
public class UploadServiceImpl implements UploadSEI{
public void uploadFile(FileUploader Dfile) {
DataHandler handler = Dfile.getDfile();
try {
InputStream is = handler.getInputStream();
OutputStream os = new FileOutputStream(new File("E:/uploads/"
+ Dfile.getName() +"."+
Dfile.getFileType()));
byte[] b = new byte[100000];
int bytesRead = 0;
while ((bytesRead = is.read(b)) != -1) {
os.write(b, 0, bytesRead);
}
os.flush();
os.close();
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
CxfService
contextConfigLocation
classpath:cxf.xml
org.springframework.Web.context.ContextLoaderListener
CXFServlet
org.apache.cxf.transport.servlet.CXFServlet
CXFServlet
/*
aopalliance-1.0.jar
asm-2.2.3.jar
commons-lang-2.4.jar
commons-logging-1.1.jar
cxf-api-2.1.5.jar
cxf-common-schemas-2.1.5.jar
cxf-common-utilities-2.1.5.jar
cxf-rt-bindings-soap-2.1.5.jar
cxf-rt-bindings-xml-2.1.5.jar
cxf-rt-core-2.1.5.jar
cxf-rt-databinding-jaxb-2.1.5.jar
cxf-rt-frontend-jaxws-2.1.5.jar
cxf-rt-frontend-simple-2.1.5.jar
cxf-rt-transports-http-2.1.5.jar
cxf-rt-ws-addr-2.1.5.jar
cxf-tools-common-2.1.5.jar
FastInfoset-1.2.2.jar
geronimo-activation_1.1_spec-1.0.2.jar
geronimo-annotation_1.0_spec-1.1.1.jar
geronimo-javamail_1.4_spec-1.3.jar
geronimo-jaxws_2.1_spec-1.0.jar
geronimo-stax-api_1.0_spec-1.0.1.jar
geronimo-ws-metadata_2.0_spec-1.1.2.jar
jaxb-api-2.1.jar
jaxb-impl-2.1.9.jar
neethi-2.0.4.jar
saaj-api-1.3.jar
saaj-impl-1.3.2.jar
spring-beans-2.0.8.jar
spring-context-2.0.8.jar
spring-core-2.0.8.jar
spring-Web-2.0.8.jar
wsdl4j-1.6.2.jar
wstx-asl-3.2.6.jar
xml-resolver-1.2.jar
XmlSchema-1.4.5.jar
Service Endpoint - http://localhost:8080/CxfService/UploadWS
WSDL 位置 - http://localhost:8080/CxfService/UploadWS?wsdl
生成 Stub
要调用服务,客户端必须知道 Service Endpoint Interface 和 bean 文件,后者将作为参数进行调用。要获得这些内容,客户端可以通过服务的 WSDL 创建 stub。
CXF 发行版提供了一个名为 ‘wsdl2java.bat’ 的工具,该工具可以为特定服务创建 stub,同时为 WSDL 位置提供一些额外的参数。
从命令提示符中访问 $(CXF_HOME) 的 bin 目录,并输入以下命令。 wsdl2java
–
client
–
verbose http://localhost:8080/CxfService/UploadWS?wsdl
这将运行 bin 目录中的 wsdl2java.bat 文件。‘-client’ 选项为客户端主线生成开始(starting point)代码。‘–verbose’ 选项在生成代码的过程中显示注释。参见图 9。
在成功执行命令后,将发现在 $(CXF_HOME)/bin 目录的 ‘com.ibm.uploadservice’ 包下创建了 stub。
创建客户端
接下来,我们将创建客户端项目,以便可以使用 Web 服务。在本例中,客户端是一个 POJO 客户端,您还可以创建一个需要 Web 容器的客户端。执行以下步骤,开发一个客户端。
package com.ibm.client;
import java.io.File;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import com.ibm.uploadservice.*;
public final class Client {
public static void main(String args[]) throws Exception {
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.getInInterceptors().add(new LoggingInInterceptor());
factory.getOutInterceptors().add(new LoggingOutInterceptor());
factory.setServiceClass(UploadSEI.class);
factory.setAddress
("http://localhost:8080/CxfService/UploadWS");
UploadSEI client =(UploadSEI) factory.create();
FileUploader file=new FileUploader();
file.setName("Partha");
file.setFileType("doc");
DataSource source = new FileDataSource(new File("D:/my_upload_doc.doc"));
file.setDfile(new DataHandler(source));
client.uploadFile(file);
System.exit(0);
}
}