Seam+RichFaces fileUpload 应该引发重新渲染

发布于 2024-12-23 02:47:13 字数 1324 浏览 3 评论 0原文

我正在使用 RichFaces 3.3 和 Seam 2 来开发 Web 应用程序。

我有一个包含以下内容的页面:

<h:form>
<s:div id="myPanel">
  <h:messages/>
  <rich:fileUpload fileUploadListener="#{service.uploadEvent}" maxFilesQuantity="1">
    <a:support event="onuploadcomplete" reRender="myPanel"/>
  </rich:fileUpload>
</s:div>
</h:form>

service.uploadEvent 方法中,我接收文件并添加 FacesMessage 让用户知道文件已成功上传。

实际发生的情况是这样的:

  1. 浏览器请求页面
    • 服务器开始临时会话#1
    • 服务器渲染页面
    • 服务器发送完成的页面并终止会话#1
  2. 客户端启动 AJAX fileUpload 调用
    • 服务器开始临时对话#2
    • 服务器调用service.fileUpload()。此方法将 FacesMessage 添加到对话范围的 FacesMessages 接缝组件。
    • 服务器返回 AJAX 请求的响应并终止会话 #2,包括所有排队的 FacesMessage
  3. 收到“onuploadcomplete”事件,客户端请求重新渲染“myPanel”
    • 服务器开始临时会话#3
    • 服务器呈现页面,为对话 #3 创建一个新的空 FacesMessages
    • 服务器返回 AJAX 请求的响应(其中包含空的 )并终止会话 #3

我可以通过多种方式解决这个问题:

  1. 通过创建一个新的 PAGE 范围的 FacesMessages 组件。
  2. 通过在 service.fileUpload() 中将对话标记为长时间运行,并在执行 fileUploadComplete() 时结束对话。

正确的方法是在与 service.fileUpload() 相同的会话中重新渲染页面。这可能吗?

I am using RichFaces 3.3 and Seam 2 to develop a web application.

I have a page with the following:

<h:form>
<s:div id="myPanel">
  <h:messages/>
  <rich:fileUpload fileUploadListener="#{service.uploadEvent}" maxFilesQuantity="1">
    <a:support event="onuploadcomplete" reRender="myPanel"/>
  </rich:fileUpload>
</s:div>
</h:form>

In the service.uploadEvent method, I receive the file and add a FacesMessage to let the user know the file uploaded succesfully.

What actually happens is this:

  1. The browser requests the page
    • The server starts temporary conversation #1
    • The server renders the page
    • The server sends the completed page and kills conversation #1
  2. The client launches an AJAX fileUpload call
    • The server starts temporary conversation #2
    • The server calls service.fileUpload(). This method adds a FacesMessage to the Conversation-scoped FacesMessages seam component.
    • The server returns the response for the AJAX request and kills conversation #2, including all queued FacesMessages.
  3. The 'onuploadcomplete' event is received, the client requests a reRender of 'myPanel'
    • The server starts temporary conversation #3
    • The server renders the page, creates a new empty FacesMessages for conversation #3
    • The server returns the response for the AJAX request (which contains an empty <h:messages/>) and kills conversation #3

I can solve this in a number of ways:

  1. By creating a new FacesMessages component which is PAGE-scoped.
  2. By marking the conversation as long-running in service.fileUpload() and ending it upon doing fileUploadComplete().

The proper way would be to reRender the page in the same conversation as service.fileUpload(). Is this possible?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

_畞蕅 2024-12-30 02:47:13

这只能通过使用自定义 StatusMessages 组件并将其范围限定在重新渲染上仍然可用的上下文(例如页面或长时间运行的对话)来解决。

This can only be solved by using a custom StatusMessages component and scoping it to a context which will still be available on Rerender (e.g. PAGE or longrunning CONVERSATION).

你穿错了嫁妆 2024-12-30 02:47:13

您是否尝试过用 替换 ?当 AJAX 操作创建新的 FacesMessage 时,它​​效果很好。请参阅http://docs.jboss.org/richfaces/latest_3_3_X/ en/devguide/html/rich_messages.html

Have you tried replacing <h:messages /> with <rich:messages />? It works well when AJAX actions create new FacesMessages. See http://docs.jboss.org/richfaces/latest_3_3_X/en/devguide/html/rich_messages.html

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文