




已阅读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=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 公司股合同样本样本
- 交强险投保合同样本
- 健身培训合同样本
- 代课合同样本
- 公路交工检测合同标准文本
- 公众号托管合同样本
- 东莞工厂宿舍租赁合同样本
- 供货维修合同样本
- 供购合同样本
- 义乌劳务合同标准文本
- 奔驰事故留修专员年终总结
- 患者隐私保护培训课件
- 四川凉山州人民政府办公室考调所属事业单位工作人员2人高频重点提升(共500题)附带答案详解
- 分包单位负责人岗位责任制度模版(3篇)
- 2023年高考化学试卷(河北)(解析卷)
- 2025年国家信息中心招聘15人高频重点提升(共500题)附带答案详解
- 基于STM32单片机的人体感应灯设计
- 教学课件英语人教版2024版七年级初一上册Unit 1 You and Me Section A1a1d2
- 学前儿童语言教育与活动指导-期末试卷(二)
- 畜牧业边境管理办法
- 基于单片机的步进电机控制系统的设计【毕业论文】
评论
0/150
提交评论