【问题标题】:How can I add a client-side progress listener to a JSF 2.2 ajax request?如何将客户端进度侦听器添加到 JSF 2.2 ajax 请求?
【发布时间】:2013-12-07 19:29:49
【问题描述】:

我正在尝试向JSF2.2 ajax 请求添加客户端进度条。我最想做的是获取请求标头大小并接收POST.状态的更新

我不太了解JS/JQuery,但据我所知,JQuery 必须发起请求才能实现这一点(see here)

有没有办法仅从客户端执行此操作?

如果这不可能,我还有哪些其他(本地)选项?

谢谢,

PS1。虽然这个的主要范围是文件上传进度条,但我希望能够应用于完整的请求大小。 PS2。我知道有一些图书馆免费提供此功能,但我不想使用 ATM。

【问题讨论】:

    标签: javascript jquery jsf jsf-2.2 java-ee-7


    【解决方案1】:

    经过一些研究,这比最初看起来要复杂一些。

    JSF 和多个文件

    首先,JSF 2.2 定义了<h:inputFile> 标签,该标签仅限于单个文件,即不支持HTML5 参数multiple=true。有关详细信息,请参阅this。另一方面,很容易扩展这个标签以允许多个文件,因为上传的文件是从request 获取的,所以它们很容易获得。

    文件在哪里解析和保存?

    所有 JSF 请求都由 FacesServlet 处理,它使用 Servlet 的 3.1 标记 @MultipartConfig 进行注释。这个注释基本上完成了提取和写入上传文件的所有繁重工作。请参阅thisthis

    虽然这非常方便并且可以处理大多数事情,但它没有进度侦听器界面,这意味着您将在文件完全上传后获得文件 (Parts)。我看不到实际拦截的方法,这是一种实现服务器端进度条的干净方法。

    服务器端与客户端进度监听器

    为了实现服务器端进度监听器,您需要自己处理文件并使用pollingWebSockets 通知用户进度。

    对于客户端,您需要编写一个自定义的POST 函数,例如this,或者使用类似this 的库来处理POST,因为大多数浏览器不提供进度信息。基本上,您无需使用浏览器功能进行发布(AFAIK),而是自己处理请求,因此您可以控制传输的字节。这里的问题是FacesServlet 需要一个由jsf.js 函数格式化的请求,而我没有看到一个简单的方法来拦截JS 请求只是为了处理文件上传。

    那我有什么选择?

    我会安全地建议使用提供此功能的现有库。 如果你有时间还想DIY,我认为最好的方法是编写自己的FileUploadServlet '理解'JSONXHR 并使用JQuery 插件来启动上传和提供客户端进度条。

    示例

    我终于决定选择JQuery/blueimp fileupload。详情请参阅 this comment。请注意,这实际上不是正常 JSF 流程的一部分,我开发了一种自定义方式来提供应用程序中的实际部分。

    PS。由于我是新手,因此不要将此答案视为明确的答案,而是作为您自己研究的起点。

    【讨论】:

      【解决方案2】:

      我发现Malsup Form plugin for jQuery 相当简单,并且有很好的文档和演示代码(因此相当容易用于 Ajaxify 进度条),如果你想走 jQuery (Javascript) 路线,它将东西保留在客户端一边。

      (当然,其他插件也存在,比如BlueImp file uploader plugin,它有很多更多可能性,但可能不是那么容易使用。)

      对于“仅限 JSF”的解决方案,BalusC recommends using a JSF component library like Primefaces - 这可能是一个更好的选择 - 建议阅读他的 cmets 和他提供的链接,这些链接解释了偏爱一种技术的原因。

      【讨论】:

        猜你喜欢
        • 2018-01-20
        • 1970-01-01
        • 2013-01-16
        • 2011-09-21
        • 2013-12-06
        • 2016-08-21
        • 1970-01-01
        • 1970-01-01
        • 2022-07-21
        相关资源
        最近更新 更多