




已阅读5页,还剩25页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
J2EE Web核心技术Web组件与框架开发技术第9 章 Struts2框架的高级应用(第1部分)杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料 Struts2框架不仅提供有对国际化和表单验证等技术的支持,同样也还提供有文件上传、下载,以及防止表单重复提交等实用的技术支持。本章除了重点介绍如何在Struts2框架中实现文件上传(也包括多文件上传和限制上传文件的类型和长度),文件下载并对下载过程进行访问控制以外,也还介绍如何防止表单数据被重复提交,以避免后台程序大量地接收垃圾数据和减少对系统资源的消耗,并给出具体实现的代码示例。 因为表单重复提交(或者称为重复刷新),这是Web应用系统程序中的一个很常见的问题。特别是由于网络状况等原因,用户不知道本次提交是否成功,也会再次提交同一份表单请求。在基于Struts2框架的Web应用系统开发中,不可避免地也会出现表单重复提交的问题 此外,在本章内的最后一小节中,还将系统地介绍如何整合Struts2.X版和Spring3.X版系统,最终达到能够在Struts2框架中应用Spring框架中的控制反转IoC和面向切面编程AoP等技术。 1.1 Struts2框架中的文件上传技术及应用 1.1.1 Web方式的文件上传技术及应用 1、与Web方式文件上传技术有关的一些概念 1)RFC1867(Form-based File Upload in HTML)标准 由于在最初的 Http 协议中并没有提供与上传文件有关的功能,为了能够让浏览器以二进制数据格式向Web服务器程序传送数据,RFC1867标准对标准的HTML表单了如下方面的功能扩展: 1) 为标签元素的type属性增加了一个file选项专用于文件上传。 2) 为标签元素新增accept属性,该属性能够指定可被上传的文件类型或文件格式列表。 另外,RFC1867标准还定义了一种新的MIME类型:multipart/form-data,各个厂商的浏览器都按照此规范将用户指定的上传文件发送到Web服务器。Web服务器端的各种形式的动态程序如PHP、ASP(或者ASP.Net)和JSP等,可以按照此技术规范,解析出用户发杨教授工作室,版权所有,盗版必究, 1/21页 杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料 送的上传文件的数据。 2)多用途互联网邮件扩展协议(MIME) 多用途互联网邮件扩展协议(Multipurpose Internet Mail Extensions,MIME)是目前广泛应用的一种电子邮件技术规范,它说明了如何安排消息格式,并使得消息能够在不同的邮件系统内都能够进行相互交换。 规定MIME类型的主要原因在于Web服务器端程序把输出结果传送到客户端浏览器时,浏览器必须要启动适当的应用程序来处理输出的数据(由于服务器端输出的数据格式是多样化的,浏览器本身不可能也没有必要都去解析这些格式数据)。而MIME格式允许在邮件中包含任意类型的文件:可以包含文本、图象、声音、视频及其它应用程序的特定数据。 设计MIME的最初目的是为了能够在发送电子邮件时附加多媒体数据,让邮件客户端程序能根据数据的类型自动进行处理。目前在HTTP协议中也广泛地提供对MIME类型的支持,它使得基于HTTP协议传输的数据不仅仅是普通的HTML文本,也可以传输多媒体数据。 2、文件上传表单标签中的enctype属性 HTML 标签中的enctype属性主要是用于指定表单中请求数据的编码格式,该属性有如下3个不同的取值: 1) application/x-www-form-urlencoded:这是默认编码方式,它将表单中的各个请求数据被编码为“名称/值”对。 2) multipart/form-data:表单中的各个请求数据被转换为二进制格式的数据,但也会把表单中由文件域(type=file)指定的上传文件的数据内容也封装到请求参数中,然后一起向Web服务器发送。 3) text/plain:表单中的各个请求数据被转换为纯文本格式,其中不含有任何成员域属性名或格式字符。 如果enctype属性的取值为application/x-www-form-urlencoded,该表单也就不能用于实现文件上传功能;只有enctype属性的取值为multipart/form-data,浏览器才会打包上传的文件数据,并完整地传递待上传的文件数据。 3、普通的Web文件上传的实现原理 文件上传是Web应用系统中经常需要提供的一个功能要求,其实现的基本原理是通过为表单标签元素添加enctype=multipart/form-data属性让浏览器将表单提交的各个杨教授工作室,版权所有,盗版必究, 2/21页 杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料 数据都转换为“二进制编码”格式;同时还要求标签元素中的method属性必须取值为post以提高传输数据的容量(Get提交方式下的数据量是有限的)。 在接收此请求的服务器端程序(如Servlet或者Action组件等)中采用二进制IO流技术直接获取上传的文件数据内容。如下为标签元素的代码示例: 在J2EE技术平台中有许多第3方的开源系统或者组件都提供有对文件上传的功能支持,如Apache Commons FileUpload组件等,它们都对文件上传的功能实现提供技术支持。 4、Struts2框架中的文件上传的实现原理 Struts 2框架本身并没有直接提供对文件上传的真正实现,也就是Struts2框架没有自己去处理“multipart/form-data”形式的Http请求,它需要调用其他Http请求解析器,将HTTP请求中的各个表单域中的数据解析出来。它的系统底层其实是通过Apache Commons FileUpload文件上传组件完成真正的功能实现,只是在上层进行包装和简化对FileUpload组件的应用,并屏蔽了不同的上传组件之间在功能实现方面的编程差异。 Struts2框架默认使用的是Common FileUpload组件上传文件,而Commons FileUpload组件通过将HTTP请求的数据(也包括上传文件的数据)保存到一个临时文件夹中,然后Struts2框架使用内带的名称为fileUpload的拦截器将上传的文件绑定到当前的Action类的对象实例中。因此,在Action程序中就能够以本地文件IO操作的形式直接读写通过浏览器上传的各种形式的文件。 为此,需要在Web应用系统中增加两个与Common FileUpload组件有关的系统Jar包文件:commons-fileupload-1.2.1.jar和commons-io-1.4.jar,如图9.1所示。 1.1.2 Web方式文件上传功能实现示例 1、在项目中添加与Commons FileUpload组件有关的JAR包 可以在Apache的官方网站下载Commons FileUpload的系统JAR包,并解包下载的*.zip文件。将其中的commons-fileupload-1.2.1.jar和commons-io-1.4.jar文件添加到项目的WEB-INF/lib目录中。如图9.1所示的最终操作结果。 杨教授工作室,版权所有,盗版必究, 3/21页 杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料 图9.1 在项目中添加与FileUpload组件有关的JAR包 2、在项目中添加一个实现文件上传请求JSP文件 在项目中添加一个upLoadProductImage.jsp文件实现文件上传,该页面为客户关系信息系统中后台产品图像文件的上传的简化版。并设计该JSP页面文件的内容,简化后的最终代码如【例9-1】所示,并注意其中黑体所标识的内容。 【例9-1】实现文件上传请求的JSP文件代码示例 蓝梦集团CRM系统后台产品信息管理的页面 请选择产品的图像文件: 请描述产品图像文件: 请选择保存的图像文件名称的方式: 采用原始的文件名称 采用服务器设定的文件名称 杨教授工作室,版权所有,盗版必究, 4/21页 杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料 在Web表单的标签在被浏览器解析后会产生出一个文本框和一个浏览按钮,操作者单击其中的【浏览】按钮会出现文件选择框,选择需要上传的本地磁盘中的文件,如图9.3所示的页面表单。 3、在项目中添加实现文件上传功能处理的Action程序类 按照图9.2所示的操作结果示图,输入包名称为com.px1987.sshwebcrm.action,选择基类名为com.opensymphony.xwork2.ActionSupport类名,在MyEclipse工具中创建出响应文件上传请求的UpLoadProductImageAction程序类。 图9.2 在项目中添加实现文件上传处理的Action程序类 然后再编程该UpLoadProductImageAction程序类。该类与普通的Action程序类在功能实现的编程方面并没有太大的不同,但需要在该类中提供uploadFile成员属性,这个成员属性对应【例9-1】示例中的upLoadProductImage.jsp页面文件中的文件上传表单域的name属性值,并用于封装文件上传的请求参数。最终的程序代码如【例9-2】示例所示,并注意其中黑体标识的代码。 【例9-2】UpLoadProductImageAction程序类的代码示例 package com.px1987.sshwebcrm.action; import com.opensymphony.xwork2.Action; import org.apache.struts2.ServletActionContext; import java.io.File; import java.io.*; import com.opensymphony.xwork2.ActionSupport; 杨教授工作室,版权所有,盗版必究, 5/21页 杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料 import java.util.*; public class UpLoadProductImageAction extends ActionSupport private static final int BUFFER_SIZE = 16 * 1024 ; private String fileDescriptor; private File uploadFile; /封装上传文件域的属性 private String uploadFileContentType; /封装上传文件类型的属性 private String uploadFileFileName; /封装上传文件名的属性 String fileNameType; private String savePath; /接受依赖注入的属性 public void setSavePath(String value) /接受依赖注入的方法 this.savePath = value; private String getSavePath() throws Exception return ServletActionContext.getRequest().getRealPath(savePath); public UpLoadProductImageAction() private void doFileUpload(File src, File dst) try InputStream in = null ; OutputStream out = null ; try in = new BufferedInputStream(new FileInputStream(src), BUFFER_SIZE); out = new BufferedOutputStream(new FileOutputStream(dst), BUFFER_SIZE); byte buffer = new byte BUFFER_SIZE; while (in.read(buffer) 0 ) out.write(buffer); /将上传文件的内容写入服务器 finally if ( null != in) 杨教授工作室,版权所有,盗版必究, 6/21页 杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料 in.close(); if ( null != out) out.close(); catch (Exception e) e.printStackTrace(); Override public String execute() throws Exception /以服务器的文件保存地址和原文件名建立上传文件输出流 String saveToFileName=null; System.out.print(fileNameType=+fileNameType); if(fileNameType.equals(1) /采用原始的文件名称 saveToFileName=getSavePath()+ + getUploadFileFileName(); else /文件名由系统时间与上传文件的后缀组成 saveToFileName=getSavePath()+/+(new Date().getTime()+ getExtention(uploadFileFileName); doFileUpload(getUploadFile(),new File(saveToFileName); return SUCCESS; private static String getExtention(String fileName) int pos = fileName.lastIndexOf(.); return fileName.substring(pos); 杨教授工作室,版权所有,盗版必究, 7/21页 杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料 public String getFileDescriptor() return fileDescriptor; public void setFileDescriptor(String fileDescriptor) this.fileDescriptor = fileDescriptor; public File getUploadFile() return uploadFile; public void setUploadFile(File uploadFile) this.uploadFile = uploadFile; public String getUploadFileContentType() return uploadFileContentType; public void setUploadFileContentType(String uploadFileContentType) this.uploadFileContentType = uploadFileContentType; public String getUploadFileFileName() return uploadFileFileName; public void setUploadFileFileName(String uploadFileFileName) this.uploadFileFileName = uploadFileFileName; public String getFileNameType() return fileNameType; public void setFileNameType(String fileNameType) this.fileNameType = fileNameType; 杨教授工作室,版权所有,盗版必究, 8/21页 杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料 但值得注意的是,在【例9-2】示例中的UpLoadProductImageAction程序类中还包含有另外的两个成员属性对象:uploadFileFileName和uploadFileContentType。这两个成员属性对象分别用于封装上传文件的文件名、上传文件的文件类型。提供这两个成员属性对象的主要目的是可以在Action程序类中直接获取上传文件的文件名和文件类型。所以Struts2框架直接将Web表单内文件域中包含的上传文件名和文件类型的信息封装到uploadFileFileName和uploadFileContentType成员属性对象中。但要注意这三个成员属性对象在名称上的相互关系。 如果表单中包含有一个name属性为xxx的文件域(),则应该要在对应的Action程序类中提供如下三个不同的成员属性对象来封装与上传文件有关的信息: 1) 类型为File的xxx属性封装了该文件域对应的文件数据内容。 2) 类型为String的xxxFileName属性封装了该文件域对应的上传文件的文件名。 3) 类型为String的xxxContentType属性封装了该文件域对应的文件的文件类型。 因此,在编程实现文件上传处理的Action程序类时,一定要明确这个命名规则和程序要求。另外,还要注意与早期的Struts框架中的文件上传处理实现的不同之处,在Struts框架中将目标对象封装为一个FormFile类型的参数对象,而在Struts2框架中直接就是普通的java.io包中的File类型的文件对象。 在Action程序类中的execute()方法中,可以直接调用getXxx()方法来获取上传文件的文件名、文件类型和文件数据内容。除此之外,在【例9-2】示例中还包含有一个savePath成员属性,该属性的值是通过struts.xml配置文件来设置,从而允许动态设置该成员属性的值,这也就是典型的依赖注入(其作用是将浏览器上传的文件保存到Web应用程序指定的目录中,本示例为系统内的/uploadImages目录)。 因此,在Struts2框架中实现文件上传处理的Action程序类中的各个成员属性可以直接关联上传文件有关的信息和封装HTTP请求参数、封装Action程序的处理结果。此外,在Action程序类中的成员属性还可通过在Struts2配置文件中以配置的形式赋值,接收Struts2框架中的依赖注入的参数,从而允许在配置文件中动态地指定成员属性值。 4、在项目中添加显示上传成功信息的JSP页面 在项目中添加一个显示文件上传功能成功完成信息的showUploadInfo.jsp页面文件,并设计该页面文件的代码,并利用标签获得Action程序返回的成员属性值,最终杨教授工作室,版权所有,盗版必究, 9/21页 杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料 的程序代码如【例9-3】所示,并注意其中黑体标识的标签。 【例9-3】showUploadInfo.jsp页面文件的代码示例 蓝梦集团CRM系统后台产品信息显示页面 5、在struts.xml系统配置文件中配置出该Action组件类 在struts.xml系统配置文件中配置出该Action组件类,为了节省本书的篇幅,下面只附录出与本配置有关的标签内容,其中黑体标识的为依赖注入的参数值: /uploadImages /productManage/showUploadInfo.jsp /productManage/upLoadProductImage.jsp 配置Struts2框架文件上传的Action程序类与配置普通的Action程序类并没有太大的不同,同样也要指定该Action程序类的逻辑名name以及该Action程序的实现类。当然,还应该为该Action程序类配置处理的结果。但与之前的各个Action程序类在配置方面存在的一个区别是在该标签定义中还配置有一个标签元素,该标签元素用于为该Action程序类中定义的savePath成员属性动态分配属性值(请参考第7章7.2.7小节“在配置文件中为拦截器和Action类提供配置参数”中的相关内容)。当然,还需要在项目中的WebRoot站点的根目录中新建出保存上传文件的uploadImages目录,如图9.5所示。 6、部署和测试本功能实现的最终效果 杨教授工作室,版权所有,盗版必究, 10/21页 杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料 部署本项目示例到Tomcat服务器中,并在浏览器中执行upLoadProductImage.jsp页面文件,如图9.3所示。在其中的表单中选择需要上传的文件(本示例选择一个图像文件)和描述该文件,最后单击表单中的【开始上传】按钮。 图9.3 upLoadProductImage.jsp页面文件的执行结果 表单提交后将出现如图9.4所示的处理结果的信息,同时在服务器所在的某个目录下能够看到实际上传后的文件,如图9.5所示。并且文件名称与上传的文件名称保持一致。 图9.4 显示处理结果的信息 当然,如果在图9.3所示的表单中选中其中的【采用服务器设定的文件名称】单选项,本示例也将支持改变上传后的文件名称的功能。上传后的文件名为时间值命名的文件名,文件名称是由系统时间与上传文件的后缀名组合而成。如图9.5所示的文件名。 图9.5 上传后的结果文件信息 但要注意的是,此时上传的文件长度不能太大。也就是不能超过2MB(Struts2框架默认的上传文件的大小是2M),否则会出现如图9.6所示的错误信息。 图9.6 默认上传的文件容量不能超过2MB 7、本示例也可以上传中文文件名的文件 在应用系统开发中,还经常需要上传中文字符命名的文件名。本示例也可以上传中文杨教授工作室,版权所有,盗版必究, 11/21页 杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料 文件名的文件,因为已经在perties文件中增加有如下设置中文编码的属性配置项目:struts.i18n.encoding=GBK,对请求参数内的中文编码进行了转换,Struts2框架同样也就能够处理中文文件名上传的文件,参考第5章中图5.25所示的定义结果示图。在图9.7示图的表单中选择某个中文文件名的文件,然后再上传它。 图9.7本示例也可以上传中文文件名的文件 单击图9.7示图表单内的【开始上传】按钮,系统同样将中文文件名的文件上传到服务器,而且在服务器端Action程序中继续采用原始的中文文件名保存,如图9.8所示。 图9.8 上传中文文件名的文件的结果 1.1.3 限制上传文件的类型及文件大小 【例9-2】中的示例尽管是实现图片上传的功能,但用户实际上是可以上传其它类型的文件。如果在应用系统中需要限制上传文件的类型或者文件的长度,应该怎么实现,比如,只能够上传图像类型的文件等。下文介绍实现此功能的方法及相关的程序代码。 1、首先修改upLoadProductImage.jsp页面 在【例9-1】示例页面中的与标签之间加入标签,用于在页面中显示输出上传过程中所产生出的各种错误信息。同时还要在页面中添加标签库的引用。最终修改后的页面结果如【例9-1】示例页面。 2、然后再修改struts.xml文件中与Action程序配置有关的标签 将struts.xml系统配置文件中与UpLoadProductImageAction程序配置有关的定义项目改为如【例9-4】所示的示例标签,并注意其中黑体标识的标签和描述文件类型的MIME项目。 【例9-4】在struts.xml文件中与Action程序配置有关的标签代码示例 杨教授工作室,版权所有,盗版必究, 12/21页 杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料 image/bmp,image/png,image/x-png, image/gif,image/pjpeg,image/jpeg 5000000 /uploadImages /productManage/showUploadInfo.jsp /productManage/upLoadProductImage.jsp 其中起主要作用的就是名称为fileUpload的拦截器中的allowTypes和maximumSize参数,它们分别设置上传文件的类型和文件长度的最大容量。另外,在配置中还引入默认的拦截器栈defaultStack,它会自动完成对上传文件的大小进行验证等方面的功能,所以一旦上传的文件大小超出了所指定的范围后,将在出错之后系统会自动地跳转到结果名称为“input”的结果视图中。 对本例而言,名称为“input”的结果视图也即是upLoadProductImage.jsp页面。在该页面中由Struts2框架中的标签输出有关的错误信息。 需要注意的是,其中对默认的拦截器栈defaultStack引入的标签不能省略,因为如果只配置对fileUpload拦截器的引用,则项目中的其他的Struts2框架中默认拦截器将失效,Struts2框架系统将不再自动地引入它们,而必须要由开发者自己再明确地指定和引入它们。 3、注意限制上传文件的类型是采用MIME类型描述 在第3章的3.3.2小节中介绍了常见的MIME类型字符串的含义,在Tomcat服务器的web.xml文件中也提供有各种类型文件的MIME的标准字符串,如图9.9所示,直接打开web.xml文件将可以获得某种类型文件的MIME类型字符串。 杨教授工作室,版权所有,盗版必究, 13/21页 杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料 图9.9 Tomcat中的web.xml文件内有各种类型文件的MIME标准字符串 另外,还要注意在微软IE浏览器和其它厂商的浏览器如FireFox之间在MIME类型的支持方面是有差别的。 4、允许上传的文件容量大于2MB 尽管在【例9-4】示例已经设置了fileUpload拦截器的上传文件的最大容量,但上传的最大文件大小仍然要小于2MB。如果允许上传的文件容量要超过2MB,则还需要在struts.xml文件中设置如下的属性常量:。 5、部署本示例并再次执行upLoadProductImage.jsp页面 此时,在表单中选择非图像类型的文件作为上传的文件,如图9.10所示的操作结果,在其中选择了一个HTML格式的页面文件。 图9.10 在表单中选择非图片类型的文件进行上传 然后在图9.10所示的表单中,单击其中的【开始上传】按钮后,将出现如图9.11所示的错误。 图9.11 系统抛出异常和显示出相关的错误信息 当然,图9.11示图中的错误提示信息是Struts 2框架中默认的错误信息,也可以改变这些默认的错误信息而自定义并国际化这些错误信息。这只需要在项目的全局国际化资源文件中加入对应的国际化形式的错误提示信息,就可以实现上面的功能需求。 6、替换Struts2框架中上传过程中的默认错误提示信息 杨教授工作室,版权所有,盗版必究, 14/21页 杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料 首先了解Struts2框架中与上传过程中出现错误有关的各个资源信息的Key键名,从而可以替换Struts2系统中的默认的错误提示信息。 1)struts.messages.error.content.type.not.allowed键名 通过在全局的国际化资源信息文件中加入如下的错误信息可以替换上传过程中文件类型不满足要求时的错误提示:struts.messages.error.content.type.not.allowed=错误信息。在本项目中的国际化全局简体中文资源信息文件中添加如图9.12所示的一条中文错误信息项目,MyEclipse工具将自动地转换为Unicode编码的字符。 图9.12 在全局简体中文资源信息文件中添加一个错误信息项目 同样也在本项目中的国际化全局美式英文资源信息文件中添加如图9.13所示的一条英文错误信息项目。 图9.13 在全局美式英文资源信息文件中添加一个错误信息项目 2)struts.messages.error.file.too.large键名 可以替换文件大小不满足要求时的错误提示信息。 3)struts.messages.error.uploading键名 用于提示上传过程中出现的一般性的错误提示信息。 在本项目示例中,按照图9.12和图9.13所示的资源信息项目,替换Struts2系统中的各个默认的错误提示信息,然后再执行文件上传的upLoadProductImage.jsp页面,并继续按照图9.11示图所示的操作方式选择非图像类的文件,并提交表单。此时将出现在项目中图9.14示图中给定的错误信息,而不是Struts2框架内带的错误信息。 杨教授工作室,版权所有,盗版必究, 15/21页 杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料 图9.14 出现在项目中给定的错误信息 1.1.4 Web方式的多文件上传技术及在项目中的应用 1、在项目中添加一个实现多文件上传的multiFileUpload.jsp页面 【例9-5】示例中的多文件上传的页面和【例9-1】示例中的单一文件上传的JSP页面文件主要的差别在于,在多文件上传的页面中提供有多个上传的文件域。本示例同时提供有4个,注意其中黑体标识的标签,但要求它们的name属性的取值必须要保持一致。 【例9-5】multiFileUpload.jsp页面文件的代码示例 蓝梦集团CRM系统后台产品信息管理的页面 产品图像的描述: 选择第一个产品图像文件: 选择第二个产品图像文件: 选择第三个产品图像文件: 选择第四个产品图像文件: 杨教授工作室,版权所有,盗版必究, 16/21页 杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料 2、在项目中添加一个处理请求的Action程序类 类名称为MultiFileUploadAction类,包名称为com.px1987.sshwebcrm.action,并继承com.opensymphony.xwork2.ActionSupport基类,最终的程序代码示例如【例9-6】所示,并注意其中黑体标识的语句。 【例9-6】MultiFileUploadAction程序类的代码示例 package com.px1987.sshwebcrm.action; import com.opensymphony.xwork2.Action; import org.apache.struts2.ServletActionContext; import java.util.*; import java.io.*; import com.opensymphony.xwork2.ActionSupport; public class MultiFileUploadAction extends ActionSupport public MultiFileUploadAction () 用File数组来封装多个上传文件域对象 private File uploadFiles; /private String uploadFilesFileName; /用String数组来封装多个上传文件名 private String uploadFilesContentType;/用String数组来封装多个上传文件类型 public File getUploadFiles() return uploadFiles; public void setUploadFiles(File uploadFiles) this.uploadFiles = uploadFiles; public String getUploadFilesContentType() return uploadFilesContentType; public void setUploadFilesContentType(String uploadFilesContentType) this.uploadFilesContentType = uploadFilesContentType; 杨教授工作室,版权所有,盗版必究, 17/21页 杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料 public String getUploadFilesFileName() return uploadFilesFileName; public void setUploadFilesFileName(String uploadFilesFileName) thi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度高校学生实习保密责任书
- 2025年大件货物运输合同模板及运输路线规划
- 2025彩钢房智能仓储解决方案合同
- 2025年度智慧城市区域承包运营管理合同
- 2025版地下空间打桩工程合同范本
- 2025版海绵城市铺装工程合作协议
- 2025二手挖机二手挖掘设备买卖合同示范文本
- 2025年太阳能照明系统维护与检修合同
- 2025房地产抵押贷款中介服务合同范本
- 2025年食品加工委托生产产业链整合合作协议
- 科技公司薪资管理制度
- 糖尿病患者围手术期麻醉管理
- 胃肠疾病预防与健康管理
- 2025年云南省中考英语试卷真题(含标准答案及解析)
- 2025年全国新高考英语II卷试题解析及复习备考策略(课件)
- 全球化背景下文化自信的传承与创新
- 合规监督概念课件
- 电力变压器智能数字孪生体的构建与展望
- 无锡金栢精密模具有限公司搬迁项目环评资料环境影响
- 放射防护监测原始记录表模板
- 2025-2030中国奶酪行业市场发展现状及竞争格局与投资前景研究报告
评论
0/150
提交评论