jQuery+struts2 实现文件的异步上…

今天准备开始搞搞项目的核心部分——数据导入。
数据导入之前要准备好数据的上传,struts2为我们准备了很方便的上传方法:
直接通过表单把文件上传到Action中,需要修改表单method为post,enctype为multipart/form-data,然后构建一个文件输入域和一个按钮
action="upload" method="post" enctype="multipart/form-data"  id="uploadform">
在Action中:

public class UploadAction extends ActionSupport {
private File upload;
private String uploadFileName;
private String uploadContentType;
private String savePath;

public File getUpload() {
return upload;
}

public void setUpload(File upload) {
this.upload = upload;
}

public String getUploadFileName() {
return uploadFileName;
}

public void setUploadFileName(String uploadFileName) {
this.uploadFileName = uploadFileName;
}

public String getUploadContentType() {
return uploadContentType;
}

public void setUploadContentType(String uploadContentType) {
this.uploadContentType = uploadContentType;
}

public String getSavePath() {
return ServletActionContext.getServletContext().getRealPath(
"/WEB-INF/" + savePath);
}

public void setSavePath(String savePath) {
this.savePath = savePath;
}

public String execute() throws Exception {
try {
FileInputStream fis = new FileInputStream(getUpload());

FileOutputStream fos = new FileOutputStream("c:\\TEMP" + "\\"
+ getUploadFileName());
int c = -1;
while ((c = fis.read()) != -1) {
fos.write(c);
}
fis.close();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
ServletActionContext.getResponse().getWriter().print("true");
ServletActionContext.getResponse().getWriter().close();

return null;
}
}

这三个属性private File upload;
private String uploadFileName;
private String uploadContentType;分别封装表单里的文件内容,文件名,文件类型,由struts自动转换。
Action中的execute用fileinputstream和fileoutputstream来操作文件,其余的部分和配置跟普通action相似。

第二部分:要实现异步上传,即上传时不跳转页面,上传成功后直接在当前页面提示成功。
项目中我使用的js框架式jQuery,jQuery为异步传输提供了很好的封装。要实现表单的异步提交,一般需要使用到jQuery.form.js 插件 Jquery.form.js
在网上查找了相关资料后了解到:
1)这个插件需要jQuery1.5以上;
2)这个插件主要通过ajaxSubmit和ajaxForm两种方式来实现表单的异步提交,但是要注意不能同时使用两种方式。

1.         $(“form1”).ajaxSubmit(options)

1)         ajaxSubmitjQuery表单插件核心函数。非常灵活,因为它依赖于事件机制,只要有事件触发就能使用ajaxSubmit()提交表单,eg:超链接、图片、按钮的click事件。

2)         options参数是

a)         一个函数,则为表单提交成功后调用的回调函数,即,options={success:function}

b)         options参数是一个集合,一个参数键值对

键名

描述

type

(默认为表单的method属性值,若未设置取GET

请求的类型,例如:POSTGETPUTPROPFIND。大小写不敏感。

url

(默认取表单的action属性值,若未设置默认取window.location.href

请求的URL地址,可以为绝对地址也可以为相对地址。

data

(对象成员必须包含namevalue属性)提供额外数据对象,通过$.param()函数返回序列化后的字符串,稍后会拼接到表单元素序列化的字符串之后。

extraData

(此参数无需外部提供,由内部处理)

此参数是data在进行序列化成字符串之前的一个拷贝,只用于在表单包含并且是老浏览器。

因为在老浏览器中文件上传文件我们需要通过来模拟异步提交,此时extraData会转变为元素包含在表单中,被一起提交到服务器。

dataType

一般不需自己设置。参数作用请看:jQuery.ajax()-dataType

traditional

如果你想要用传统的方式来序列化数据,那么就设置为true。请参考$.param()深度递归详解

delegation

(适用于ajaxFormajaxForm支持Jquery插件的委托方式(需要Jquery v1.7+),所以当你调用ajaxForm的时候其表单form不一定存在,但动态构建的form会在适当的时候调用ajaxSubmitEg

        $('#myForm').ajaxForm({ 
            delegation: true,
            target: '#output'
        });  

replaceTarget

(默认:false)与target参数共同起作用,True则执行replaceWirh()函数,false则执行html()函数

target

提供一个Html元素,在请求成功并且未设置dataType参数,则将返回的数据replaceWith()html()掉对象原来的内容,再遍历对象调用success回调函数。

    if (!options.dataType && options.target) {
        var oldSuccess = options.success || function(){};
        callbacks.push(function(data) {
            var fn = options.replaceTarget ? 'replaceWith' : 'html';
            $(options.target)[fn](data).each(oldSuccess, arguments);
        });
    }

includeHidden

在请求成功后,若设置执行clearForm()函数清空表单元素则会根据includeHidden设置决定如何清空隐藏域元素。

1)         传递true,表示清空表单的所有隐藏域元素。

2)         传递字符串,表示清空特殊匹配的隐藏域表单元素,eg$('#myForm').clearForm('.special:hidden'),清空class属性包含special值的隐藏域

clearForm

请求成功时触发(同success),并用options. includeHidden做为回调函数参数。

回调函数:$form.clearForm(options.includeHidden);

resetForm

请求成功时触发(同success)。

回调函数:$form.resetForm()

semantic

布尔值,指示表单元素序列化时是否严格按照表单元素定义顺序。

在序列化只有元素会放在序列化字符串的最后,若semantic=true,则会按照它的定义顺序进行序列化。

若你服务器严格要求表单序列化字符串的顺序,则使用此参数进行控制。

iframe

(默认:false)若有文件上传'input[type=file]:enabled[value!=""]',指示是否应该使用标签(在支持html5文件上传新特性的浏览器中不会使用iframe模式)

iframeTarget

指定一个现有的元素,否则将自动生成一个元素以及name属性值。若现有的元素没有设置name属性,则会自动生成一个name

iframeSrc

元素设定src属性值

 

回调函数

beforeSerialize

提供在将表单元素序列化为字符串之前,处理表单元素的回调函数。

签名:function(form,options)

函数说明:当前表单对象、options参数集合

返回值:返回false,表示终止表单提交操作。

beforeSubmit

提供在执行表单提交之前,处理数据的回调函数。

签名:function(a,form,options)

函数说明:通过formToArray(options.semantic, elements)返回的表单元素数组、当前表单对象、options参数集合

返回值:返回false,表示终止表单提交操作。

3)         $(“form1”).ajaxSubmit(options) 内部直接或模拟jQuery.ajax(options)异步提交,所以也直接支持jQuery.ajax(options)所能处理的参数,并且支持jQuery.ajax(options)过程中所触发的5局部事件6全局事件

4)         $(“form1”).ajaxSubmit(options) 内部将内部直接调用jQuery.ajax(options)返回的jqxhr对象或模拟的jqxhr对象进行了缓存,所以我们可以通过$(“#form1”).data(‘jqxhr’)获取到本次提交生成的jqxhr对象。

5)         更多jQuery.ajax()函数介绍请看:触碰jQueryAJAX异步详解

 

ajaxSubmit函数处理流程:

1)         根据

处理 url type 参数以及 success iframeSrc 等参数。

2)         触发beforeSerialize()回调函数

3)         序列化data参数和表单元素

4)         触发beforeSubmit()回调函数

5)         根据type参数处理options.dataoptions.url参数

6)         注册resetForm()clearForm()回调函数

7)         注册将返回数据加载到options.target指定的元素上的回调函数

8)         注册success回调函数,若有options.target则循环该元素,并为每个子元素注册success回调函数

9)         处理文件上传元素

a)         不包含文件元素,直接调用jQuery.ajax()函数。

b)         包含文件元素,并且不支持XMLHttpRequest Level 2提供的文件上传新特性window.FormData。则通过IFrame模拟表单异步提交

                                       i.              调用fileUploadIframe()函数。

                                     ii.              根据options. iframeTarget设置决定是创建一个元素还是使用现有的元素

                                    iii.              模拟xhr对象以及jQuery.ajax()过程,以支持xhr对象返回和ajax事件触发

                                    iv.              设置

target 指向 元素、encodingenctype“multipart/form-data”method”post” 值等等

                                     v.              处理options.extraData元素并添加到

元素中。

                                    vi.              调用

submit() 事件。(同步提交,但因为 target 指向 标签,所以刷新的是中的内容,以此模拟异步提交)

c)         包含文件元素,并且支持XMLHttpRequest Level 2提供的新特性,则调用fileUploadXhr()函数,通过FormData()对象将数据传递给options.data参数,再调用jQuery.ajax(options)函数异步提交表单。并且XMLHttpRequest Level 2的新特性还支持进度条提示功能。(更多新特性请看:XMLHttpRequest Level 2 使用指南

10)     将内部jqxhr缓存起来,以供访问。$form.removeData('jqxhr').data('jqxhr', jqxhr);

11)     返回表单元素本身,以便符合jQuery的链式操作模式。

2.         $(“form1”).ajaxForm(options)

是对$(“any”).ajaxSubmit(options)函数的一个封装,适用于表单提交的方式(注意,主体对象是

),会帮你管理表单的 submit 和提交元素( [type=submit],[type=image] )的 click 事件。在出发表单的 submit 事件时:阻止 submit() 事件的默认行为(同步提交的行为)并且调用 $(this).ajaxSubmit(options) 函数。

ajaxForm支持Jquery插件的委托方式(需要Jquery v1.7+


需要注意的是ajaxForm()并不是直接提交表单,而是为提交表单做异步的准备。 ajaxForm()

增加所有需要的事件监听函数,为AJAX提交表单做好准备。ajaxForm不能提交表单。在document的ready函数中,使用 ajaxForm来为AJAX提交表单进行准备。ajaxForm接受0个或1个参数。这个单个的参数既可以是一个回调函数,也可以是一个Options 对象。

是否可链接(Chainable):可以。

实例:

1 $('#myFormId').ajaxForm();

ajaxSubmit()

马上由AJAX来提交表单。大多数情况下,都是调用ajaxSubmit来对用户提交表单进行响应。ajaxSubmit接受0个或1个参数。这个单个的参数既可以是一个回调函数,也可以是一个Options对象。

是否可链接(Chainable):可以。

实例:

1 //绑定表单提交事件处理器
2 $('#myFormId').submit(function() {
3     // 提交表单
4     $(this).ajaxSubmit();
5     // 为了防止普通浏览器进行表单提交和产生页面导航(防止默认提交)返回false
6     return false;
7 });
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值