热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SSH与SSM学习之SSH实现CRM练习12——文件上传原理

SSH与SSM学习之SSH实现CRM练习12文件上传原理一主要说明二查看struts-defaultxml三FileUploadInterceptorjavaSSH与SSM学习之S


  • SSH与SSM学习之SSH实现CRM练习12文件上传原理
    • 一主要说明
    • 二查看 struts-defaultxml
    • 三FileUploadInterceptorjava


SSH与SSM学习之SSH实现CRM练习12——文件上传原理


一、主要说明

其实文件上传,主要就是通过 FileUploadInterceptor 这个拦截器,配合 ParametersInterceptor来完成的。

FileUploadInterceptor 把上传的文件 添加到值栈中,ParametersInterceptor 取出添加的值,赋值到对应的Action的属性中。

下面我们具体来看一下。




二、查看 struts-default.xml

我使用的是 struts 2.5
如下地址:

web\WEB-INF\lib\struts2-core-2.5.13.jar!\struts-default.xml

主要看到下面

.....<interceptors>.......<interceptor name&#61;"fileUpload" class&#61;"org.apache.struts2.interceptor.FileUploadInterceptor"/><interceptor name&#61;"i18n" class&#61;"org.apache.struts2.interceptor.I18nInterceptor"/><interceptor name&#61;"logger" class&#61;"com.opensymphony.xwork2.interceptor.LoggingInterceptor"/><interceptor name&#61;"modelDriven" class&#61;"com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/><interceptor name&#61;"scopedModelDriven" class&#61;"com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor"/><interceptor name&#61;"params" class&#61;"com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>.......<interceptor-stack name&#61;"defaultStack">.......<interceptor-ref name&#61;"fileUpload"/><interceptor-ref name&#61;"checkbox"/><interceptor-ref name&#61;"datetime"/><interceptor-ref name&#61;"multiselect"/><interceptor-ref name&#61;"staticParams"/><interceptor-ref name&#61;"actionMappingParams"/><interceptor-ref name&#61;"params"/>.......interceptor-stack>.......interceptors>.....

上面我们可以看到&#xff0c;默认的拦截器栈中&#xff0c;先调用 fileUpload&#xff0c;然后才是 params




三、FileUploadInterceptor.java

主要就是完成&#xff0c;获取文件、文件名、文件的ContentType 添加到值栈中&#xff0c;最后会调用到 ParametersInterceptor&#xff0c;赋值给Action中对应的属性。


public class FileUploadInterceptor extends AbstractInterceptor {public String intercept(ActionInvocation invocation) throws Exception {.......// bind allowed FilesEnumeration fileParameterNames &#61; multiWrapper.getFileParameterNames();while (fileParameterNames !&#61; null && fileParameterNames.hasMoreElements()) {// get the value of this input tag//获取文件的对应的属性名String inputName &#61; (String) fileParameterNames.nextElement();// get the content typeString[] contentType &#61; multiWrapper.getContentTypes(inputName);if (isNonEmpty(contentType)) {// get the name of the file from the input tagString[] fileName &#61; multiWrapper.getFileNames(inputName);if (isNonEmpty(fileName)) {// get a File object for the uploaded FileUploadedFile[] files &#61; multiWrapper.getFiles(inputName);if (files !&#61; null && files.length > 0) {List acceptedFiles &#61; new ArrayList<>(files.length);List acceptedContentTypes &#61; new ArrayList<>(files.length);List acceptedFileNames &#61; new ArrayList<>(files.length);//拼接文件的ContentType属性名String contentTypeName &#61; inputName &#43; "ContentType";//拼接文件名的属性名String fileNameName &#61; inputName &#43; "FileName";for (int index &#61; 0; index if (acceptFile(action, files[index], fileName[index], contentType[index], inputName, validation)) {acceptedFiles.add(files[index]);acceptedContentTypes.add(contentType[index]);acceptedFileNames.add(fileName[index]);}}if (!acceptedFiles.isEmpty()) {Map newParams &#61; new HashMap<>();//把文件添加到值栈中newParams.put(inputName, new Parameter.File(inputName, acceptedFiles.toArray(new UploadedFile[acceptedFiles.size()])));//把文件的ContentType添加到值栈中newParams.put(contentTypeName, new Parameter.File(contentTypeName, acceptedContentTypes.toArray(new String[acceptedContentTypes.size()])));//把文件名添加到值栈中newParams.put(fileNameName, new Parameter.File(fileNameName, acceptedFileNames.toArray(new String[acceptedFileNames.size()])));ac.getParameters().appendAll(newParams);}}} else {if (LOG.isWarnEnabled()) {LOG.warn(getTextMessage(action, "struts.messages.invalid.file", new String[]{inputName}));}}} else {if (LOG.isWarnEnabled()) {LOG.warn(getTextMessage(action, "struts.messages.invalid.content.type", new String[]{inputName}));}}}return invocation.invoke();}}

推荐阅读
  • 本文介绍了解决java开源项目apache commons email简单使用报错的方法,包括使用正确的JAR包和正确的代码配置,以及相关参数的设置。详细介绍了如何使用apache commons email发送邮件。 ... [详细]
  • 开发笔记:spring boot项目打成war包部署到服务器的步骤与注意事项
    本文介绍了将spring boot项目打成war包并部署到服务器的步骤与注意事项。通过本文的学习,读者可以了解到如何将spring boot项目打包成war包,并成功地部署到服务器上。 ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • 从零学Java(10)之方法详解,喷打野你真的没我6!
    本文介绍了从零学Java系列中的第10篇文章,详解了Java中的方法。同时讨论了打野过程中喷打野的影响,以及金色打野刀对经济的增加和线上队友经济的影响。指出喷打野会导致线上经济的消减和影响队伍的团结。 ... [详细]
  • 如何在文本中运行Java程序
    本文介绍了在文本中运行Java程序的步骤,包括创建文本文档、修改后缀、打开DOS命令窗口、编译和运行程序。通过这些步骤,可以在文本中成功运行Java程序并输出结果。 ... [详细]
  • 本文介绍了在sqoop1.4.*版本中,如何实现自定义分隔符的方法及步骤。通过修改sqoop生成的java文件,并重新编译,可以满足实际开发中对分隔符的需求。具体步骤包括修改java文件中的一行代码,重新编译所需的hadoop包等。详细步骤和编译方法在本文中都有详细说明。 ... [详细]
  • 本文讨论了在shiro java配置中加入Shiro listener后启动失败的问题。作者引入了一系列jar包,并在web.xml中配置了相关内容,但启动后却无法正常运行。文章提供了具体引入的jar包和web.xml的配置内容,并指出可能的错误原因。该问题可能与jar包版本不兼容、web.xml配置错误等有关。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • 本文介绍了禅道作为一款国产开源免费的测试管理工具的特点和功能,并提供了禅道的搭建和调试方法。禅道是一款B/S结构的项目管理工具,可以实现组织管理、后台管理、产品管理、项目管理和测试管理等功能。同时,本文还介绍了其他软件测试相关工具,如功能自动化工具和性能自动化工具,以及白盒测试工具的使用。通过本文的阅读,读者可以了解禅道的基本使用方法和优势,从而更好地进行测试管理工作。 ... [详细]
author-avatar
黑m泽猫咪2009
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有