WebService体系之——CXF+SPRING文件上传

WebService体系之——CXF+SPRING文件上传


        摘要:此篇笔记实现一个web项目中不可避免的功能——文件上传。主要是FileEntity这个file的封装javaBean的构建。测试时使用两种方法、一种是原始的获取webservice接口掉结果、另一种是使用spring实现上传。

 

一:简介

 

        在前面搭建的spring+webservice项目的基础上实现文件上传。

        1、在服务器端添加一个表示file信息的JavaBean:FileEntity。

        2、创建上传文件的服务接口。

        3、实现上传文件的服务接口。

        4、将上传文件的服务接口通过spring注册发布。

        5、新建webservice客户端项目(可直接使用前面笔记中创建的客户端项目)。

        6、在客户端创建file实体类:FileEntity(属性名要完全相同、简单点就是直接拷贝、包名也要一样)。

        7、创建与服务端功能完全相同的上传文件接口(直接拷贝。注意包名也要一样)。

        8、使用spring配置文件获取服务器端发布的上传文件的webservice。

        9、测试:

                a)       使用原始的获取方式测试。

                b)       使用spring注册的webservice测试。

 

二:具体实现步骤

 

        1、在服务器端添加一个表示file信息的JavaBean:FileEntity代码:


package com.chy.ws.entity;

import javax.activation.DataHandler;

public class FileEntity {
	private String fileName;
	private String fileType;
	private DataHandler file;
	public String getFileName() {
		return fileName;
	}
	public void setFileName(String fileName) {
		this.fileName = fileName;
	}
	public String getFileType() {
		return fileType;
	}
	public void setFileType(String fileType) {
		this.fileType = fileType;
	}
	public DataHandler getFile() {
		return file;
	}
	public void setFile(DataHandler file) {
		this.file = file;
	}
}

        2、创建上传文件的服务接口——UploadFileService代码:


package com.chy.ws.service;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;

import com.chy.ws.entity.FileEntity;

@WebService
public interface UploadFileService {
	
	@WebMethod
	public void uploadFile(@WebParam(name="fileEntity") FileEntity fileEntity);
}

        3、实现上传文件的服务接口——UploadFileServiceImpl代码:


package com.chy.ws.service;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.activation.DataHandler;

import com.chy.ws.entity.FileEntity;

public class UploadFileServerImpl implements UploadFileService {

	@Override
	public void uploadFile(FileEntity fileEntity) {
		DataHandler handler = fileEntity.getFile();
		InputStream is = null;
		OutputStream os = null;
		try {
			is = handler.getInputStream();
			os = new FileOutputStream("F:/" + fileEntity.getFileName() + "."
					+ fileEntity.getFileType());
			int n = 0;
			byte[] b = new byte[1024];
			while ((n = is.read(b)) != -1) {
				os.write(b, 0, n);
			}
			os.flush();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if (is != null) {
					is.close();
				}
				if (os != null) {
					os.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

        4、将上传文件的服务接口通过spring注册发布——spring配置文件applicationContext-server.xml代码:


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws"
	xsi:schemaLocation="    
            http://www.springframework.org/schema/beans     
            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd    
            http://cxf.apache.org/jaxws    
            http://cxf.apache.org/schemas/jaxws.xsd">

	<!-- Import apache CXF bean definition 固定-->
	<import resource="classpath:META-INF/cxf/cxf.xml" />
	<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
	<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />

	<!-- services接口配置 -->
	<bean id="helloServicesBean" class="com.chy.ws.service.HelloServiceImpl" />
	<bean id="uploadFileServiceBean" class="com.chy.ws.service.UploadFileServerImpl" />

	<!-- CXF 配置WebServices的服务名及访问地址 -->
	<jaxws:server id="helloService" address="/HelloService" serviceClass="com.chy.ws.service.HelloService">
		<jaxws:serviceBean>
			<ref bean="helloServicesBean" />
		</jaxws:serviceBean>
	</jaxws:server>

	<jaxws:server id="uploadFileService" address="/UploadFileService" serviceClass="com.chy.ws.service.UploadFileService">
		<jaxws:serviceBean>
			<ref bean="uploadFileServiceBean" />
		</jaxws:serviceBean>
	</jaxws:server>
</beans>  

        5、客户端——FileEntity代码:


package com.chy.ws.entity;

import javax.activation.DataHandler;

public class FileEntity {
	private String fileName;
	private String fileType;
	private DataHandler file;
	public String getFileName() {
		return fileName;
	}
	public void setFileName(String fileName) {
		this.fileName = fileName;
	}
	public String getFileType() {
		return fileType;
	}
	public void setFileType(String fileType) {
		this.fileType = fileType;
	}
	public DataHandler getFile() {
		return file;
	}
	public void setFile(DataHandler file) {
		this.file = file;
	}
}

        6、客户端——UploadFileService代码:


package com.chy.ws.service;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;

import com.chy.ws.entity.FileEntity;

@WebService
public interface UploadFileService {
	
	@WebMethod
	public void uploadFile(@WebParam(name="fileEntity") FileEntity fileEntity);
}

        7、客户端——applicationContext-client.xml代码:


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws"
	xsi:schemaLocation="    
            http://www.springframework.org/schema/beans     
            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd    
            http://cxf.apache.org/jaxws    
            http://cxf.apache.org/schemas/jaxws.xsd">
	<!-- Import apache CXF bean definition -->
	<import resource="classpath:META-INF/cxf/cxf.xml" />
	<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
	<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />

	<!-- CXF webservices 客户端配置 -->
	<jaxws:client id="helloClient" serviceClass="com.chy.ws.service.HelloService"
		address="http://localhost:8080/webservice_spring_server/services/HelloService">
	</jaxws:client>

	<!-- 上传文件 -->
	<jaxws:client id="uploadFileService" serviceClass="com.chy.ws.service.UploadFileService"
		address="http://localhost:8080/webservice_spring_server/services/UploadFileService">
	</jaxws:client>
</beans>  

        8、测试——UploadClient代码:

 

package com.chy.ws.test;

import java.io.File;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;

import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.chy.ws.entity.FileEntity;
import com.chy.ws.service.UploadFileService;

@SuppressWarnings("unused")
public class UploadFileClient {

	/**
	 * use original method to test upload file.
	 * @param the real file path.
	 */
	private static void invokingUploadFile(String filePath){
		FileEntity fileEntity = constructFileEntity(filePath);
		
		//obtain web service
		JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
		factory.setAddress("http://localhost:8080/webservice_spring_server/services/UploadFileService");
		factory.setServiceClass(UploadFileService.class);
		
		//upload file
		UploadFileService uploadFileService = (UploadFileService)factory.create();
		uploadFileService.uploadFile(fileEntity);
	}
	
	/**
	 * use the spring application context to test upload file.
	 * @param the real file path.
	 */
	private static void invokingUploadFileBySpring(String filePath){
		FileEntity fileEntity = constructFileEntity(filePath);
		
		//Obtain the spring UploadFileService through the spring application context!
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext-client.xml");
		UploadFileService uploadFileService = applicationContext.getBean("uploadFileService", UploadFileService.class);
		try {
			uploadFileService.uploadFile(fileEntity);
		} catch (Exception e) {
			e.printStackTrace();
			return;
		}
		System.out.println("Upload file succeed!");
	}
	
	/**
	 * Construct FileEntity.
	 * @param the real file path.
	 * @return FileEntity.
	 */
	private static FileEntity constructFileEntity(String filePath) {
		// construct FileEntity
		FileEntity fileEntity = new FileEntity();
		File file = new File(filePath);
		fileEntity.setFileName(file.getName().substring(0,(file.getName().lastIndexOf("."))));
		fileEntity.setFileType(filePath.substring(filePath.lastIndexOf(".")+1));
		DataSource source = new FileDataSource(file);
		DataHandler handler = new DataHandler(source);
		fileEntity.setFile(handler);
		return fileEntity;
	}
	
	public static void main(String[] args) {
		String filePath = "D:\\text.txt";
		//invokingUploadFile(filePath);
		invokingUploadFileBySpring(filePath);
	}
}

补充:

 

       1、注意:服务端和客户端的JavaBean的名称属性要一模一样、最好是连包一起拷贝。

       2、完整项目图:


                

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值