-
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、完整项目图:
版权声明:本文为博主原创文章,未经博主允许不得转载。