返回顶部
首页 > 资讯 > 精选 >AJAX+JSF组件实现高性能的文件上载(4)
  • 208
分享到

AJAX+JSF组件实现高性能的文件上载(4)

2023-06-03 07:06:57 208人浏览 安东尼
摘要

ajax+jsF组件实现高性能的文件上载(4)[@more@]四、处理AJAX请求 AJAX请求的生成是在这个组件的解码方法中处理的。我们需要检查这是否是一个实际的AJAX请求(为了区别于正常的编译行为),然后基于由ProgreSSMoni

ajax+jsF组件实现高性能的文件上载(4)

[@more@]四、处理AJAX请求

AJAX请求的生成是在这个组件的解码方法中处理的。我们需要检查这是否是一个实际的AJAX请求(为了区别于正常的编译行为),然后基于由ProgreSSMonitorFileItemFactory类的SessionUpdatingProgressObserver实例设置在会话中的值把一个XML响应发送回客户端。

public void decode(FacesContext context, UIComponent component) {

 UIFileUpload input = (UIFileUpload) component;

 //检查是否这是一个上传进度请求,或是一个实际的上传请求.

 ExternalContext extContext = context.getExternalContext();

 Map parameterMap = extContext.getRequestParameterMap();

 String clientId = input.getClientId(context);

 Map requestMap = extContext.getRequestParameterMap();

 if(requestMap.get(clientId) == null){

return;//什么也不做,返回

 }

 if(parameterMap.containsKey(PROGRESS_REQUEST_PARAM_NAME)){

//这是一个在该文件请求中的得到进度信息的请求.

//得到该进度信息并把它生成为XML

httpservletResponse response =

(HttpServletResponse)context.getExternalContext().getResponse();

//设置响应的头信息

response.setContentType("text/xml");

response.setHeader("Cache-Control", "no-cache");

try {

 ResponseWriter writer = FacesUtils.setupResponseWriter(context);

 writer.startElement("progress", input);

 writer.startElement("percentage", input);

 //从会话中获得当前进度百分数(由过滤器所设置).

 Double progressCount = (Double)extContext.getSessionMap().

 get("FileUpload.Progress." +input.getClientId(context));

 if(progressCount != null){

writer.writeText(progressCount, null);

 }else{

writer.writeText("1", null);//我们还没有收到上传

 }

 writer.endElement("percentage");

 writer.startElement("clientId", input);

 writer.writeText(input.getClientId(context), null);

 writer.endElement("clientId");

 writer.endElement("progress");

} catch(Exception e){

 //做一些错误记录...

}

}else{

 //正常的译码请求.

...

五、 正常的译码行为

在正常的编译期间,文件上传生成器从请求属性中检索FileItem,正是在此处它被过滤器所设置,并且更新该组件的值绑定。然后,该会话中的进度被更新到100%,这样在页面上的javascript就可以把组件送入第3个阶段。

//正常的译码请求.

if(requestMap.get(clientId).toString().equals("file")){

try{

 HttpServletRequest request = (HttpServletRequest)extContext.getRequest();

 FileItem fileData = (FileItem)request.getAttribute(clientId);

 if(fileData != null) input.setSubmittedValue(fileData);

 //现在我们需要清除与该项相关的任何进度

 extContext.getSessionMap().put(

"FileUpload.Progress." + input.getClientId(context),new Double(100));

}catch(Exception e){

 throw new RuntimeException("不能处理文件上传" +" - 请配置过滤器.",e);

}

}

客户端JavaScript负责向服务器发出进度请求并通过不同阶段来移动组件。为了简化处理所有的浏览器特定的XMLHttpRequest对象的问题,我选用了Matt Krause提供的AjaxRequest.js库。该库最大限度地减少我们需要编写的JavaScript代码的数量,同时可以使这个组件正常工作。也许把这部分JavaScript代码打包为该组件的一部分,然后从PhaseListener生成它更好一些,但是,我已经通过定义一个到JSP页面上的JavaScript库的链接来尽力使得它简单。

组件中的getProgressBarJavaScript方法被调用以生成JavaScript。使JavaScript正常工作通常是实现AJAX组件最困难的部分;不过我想,下面的代码已经非常清晰易于理解了。尽管在我的示例中JavaScript是嵌入到Java代码中的,但是把它放到一个外部独立的文件中也许更好一些。在本文中,我只是想使问题更为简单些且只关心本文的主题。下面是一个将由组件生成的JavaScript的示例。其中假定,fileUpload1是被赋值到该文件组件的客户端JSF Id,而uploadFORMhtml表单的Id。

function refreshProgress(){

 // 假定我们正在进入到阶段2.

 document.getElementById('fileUpload1_stage1').style.display = 'none';

 document.getElementById('fileUpload1_stage2').style.display = '';

 document.getElementById('fileUpload1_stage3').style.display = 'none';

 //创建AJAX寄送

 AjaxRequest.post(

 {

//指定正确的参数,以便

//该组件在服务器端被正确处理

'parameters':{ 'uploadForm':'uploadForm',

'fileUpload1':'fileUpload1',

'jsf.component.UIFileUpload':'1',

'ajax.abortPhase':'4' } //Abort at Phase 4.

//指定成功处理相应的回调方法.

,'onSuccess':function(req) {

var xml = req.responseXML;

if( xml.getElementsByTagName('clientId').length == 0) {

 setTimeout('refreshProgress()',200); return;

}

var clientId = xml.getElementsByTagName('clientId');

clientId = clientId[0].firstChild.nodeValue + '_progressBar';

//从XML获取百分比

var percentage =

xml.getElementsByTagName('percentage')[0].firstChild.nodeValue;

var innerSpans =

document.getElementById(clientId).getElementsByTagName('span');

document.getElementById(clientId + 'label').innerHTML

= Math.round(percentage) + '%';

//基于当前进度,设置这些span的式样类。

for(var i=0;i<innerSpans.length;i++){

 if(i < percentage){

innerSpans[i].className = 'active';

 }else{

innerSpans[i].className = 'passive';

 }

}

//如果进度不是100,我们需要继续查询服务器以实现更新.

if(percentage != 100){

 setTimeout('refreshProgress()',400);

} else {

 //文件上传已经完成,我们现在需要把该组件送入到第3个阶段.

 document.getElementById('fileUpload1_stage1').style.display = 'none';

 document.getElementById('fileUpload1_stage2').style.display = 'none';

 document.getElementById('fileUpload1_stage3').style.display = '';

}

 }

});

}

return builder.toString();

六、 结论

我很希望,本文能够在有关如何使得文件上传更具有用户友好性,并且把AJAX和JavaServer Faces用于实现高级用户接口组件的可能性方面引发你的进一步思考。毫无疑问,本文中的方案比较冗长并且有可能得到进一步的改进。我希望你能详细地分析一下本文中所提供的完整的源代码来深入理解本文中所讨论的概念。

--结束END--

本文标题: AJAX+JSF组件实现高性能的文件上载(4)

本文链接: https://lsjlt.com/news/233422.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • AJAX+JSF组件实现高性能的文件上载(4)
    AJAX+JSF组件实现高性能的文件上载(4)[@more@]四、处理AJAX请求 AJAX请求的生成是在这个组件的解码方法中处理的。我们需要检查这是否是一个实际的AJAX请求(为了区别于正常的编译行为),然后基于由ProgressMoni...
    99+
    2023-06-03
  • AJAX+JSF组件实现高性能的文件上载(2)
    AJAX+JSF组件实现高性能的文件上载(2)[@more@]三) ProgressMonitorFileItemFactory类 public class ProgressMonitorFileItemFactory extends Di...
    99+
    2023-06-03
  • AJAX+JSF组件实现高性能的文件上载(3)
    AJAX+JSF组件实现高性能的文件上载(3)[@more@]三、 实现AJAX文件上传组件 实质上,上载组件或者生成一个完整的自已,或者在一个AJAX请求的情况下,只生成部分XML以更新在页面上进度条的状态。为了防止JavaServer ...
    99+
    2023-06-03
  • 如何通过JSF 2实现可重用的Ajax化组件
    本篇文章给大家分享的是有关如何通过JSF 2实现可重用的Ajax化组件,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。我将向您介绍如何实现自动完成组件,它将使用Ajax管理其完成...
    99+
    2023-06-17
  • ztree+ajax实现文件树下载功能
    基于java实现文件树下载,供大家参考,具体内容如下 0.项目准备工作 1.前端用到的插件库: ztree官网 2.后端maven依赖: <dependencies>...
    99+
    2024-04-02
  • Ajax怎么实现文件上传功能
    这篇文章主要介绍“Ajax怎么实现文件上传功能”,在日常操作中,相信很多人在Ajax怎么实现文件上传功能问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Ajax怎么实现文件上传...
    99+
    2024-04-02
  • PHP 与 Ajax:实现实时的文件上传功能
    如何使用 php 和 ajax 实现实时文件上传?在 php 中配置文件上传并设置权限。创建一个服务器端脚本处理上传。使用 jquery 编写一个客户端脚本来处理 ajax 请求。在 h...
    99+
    2024-05-12
    php ajax
  • SpringMVC+Ajax如何实现文件批量上传和下载功能
    小编给大家分享一下SpringMVC+Ajax如何实现文件批量上传和下载功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!上传form:<form ...
    99+
    2023-06-08
  • Ajax如何实现文件下载
    小编给大家分享一下Ajax如何实现文件下载,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!JQuery的ajax函数的返回类型只有xml、text、json、htm...
    99+
    2023-06-08
  • 使用AJAX实现上传文件
    本文实例为大家分享了使用AJAX实现上传文件的具体代码,供大家参考,具体内容如下 需求: 在前端页面选择文件上传到服务器的指定位置 前端代码 <form id="upl...
    99+
    2024-04-02
  • 基于nodejs+express(4.x+)实现文件上传功能
    Nodejs是一个年轻的编程框架,充满了活力和无限激情,一直都在保持着快速更新。基于Nodejs的官方Web开发库Express也在同步发展着,每年升级一个大版本,甚至对框架底层都做了大手术。在Expres...
    99+
    2022-06-04
    文件上传 功能 nodejs
  • 使用fileupload组件实现文件上传功能
    使用fileupload组件实现文件上传功能可以按照以下步骤进行:1. 导入相关文件和库:首先,需要导入jQuery库和fileup...
    99+
    2023-08-14
    fileupload
  • java实现文件上传下载功能
    本文实例为大家分享了java实现文件上传下载的具体代码,供大家参考,具体内容如下 1.上传单个文件 Controller控制层 import java.io.File; imp...
    99+
    2024-04-02
  • SpringMVC实现文件上传下载功能
    目录导入需要的依赖包一、单个文件上传二、多个文件上传三、上传文件列表显示四、文件下载今天遇到文件上传的问题,使用Ajax方式进行提交,服务器一直报错The current reque...
    99+
    2024-04-02
  • Ajax配合Spring如何实现文件上传功能
    这篇文章将为大家详细讲解有关Ajax配合Spring如何实现文件上传功能,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、 需求Web表单页面,可以通过表单上传图片以及其...
    99+
    2024-04-02
  • ajax如何实现无刷新上传文件功能
    这篇文章主要介绍了ajax如何实现无刷新上传文件功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体内容如下<!DOCTYPE HTML><ht...
    99+
    2023-06-08
  • AJAX实现文件上传功能报错Currentrequestisnotamultipartrequest详解
    想做一个文件上传,spring boot配合Ajax来进行。却报错:Current request is not a multipart request 这是错误截图: 当时发生这...
    99+
    2024-04-02
  • AjaxFileUpload如何实现单个文件的Ajax文件上传库
    这篇文章将为大家详细讲解有关AjaxFileUpload如何实现单个文件的Ajax文件上传库,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。jQuery.AjaxFileU...
    99+
    2024-04-02
  • Vue实现文件上传和下载功能
    本文实例为大家分享了Vue实现文件上传和下载功能的具体代码,供大家参考,具体内容如下 1、a标签download属性 在H5中,为a标签新增了一个download属性,来直接文件的...
    99+
    2024-04-02
  • servlet实现文件上传与下载功能
    本文实例为大家分享了servlet实现文件上传与下载的具体代码,供大家参考,具体内容如下 内容 我们分两大模块来进行讲解,即上传的实现,与下载的实现 上传的实现 注意了我们在写上传表...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作