gpt4 book ai didi

JSF在文件输入ajax后没有重定向请求

转载 作者:行者123 更新时间:2023-12-05 06:42:35 25 4
gpt4 key购买 nike

我在 JSF 2.2 中有一个表单:

<h:form enctype="multipart/form-data">
<h:outputLabel>title *</h:outputLabel>
<h:inputText value="#{bean.title}" required="" />

<h:outputLabel>Image *</h:outputLabel>
<h:inputFile value="#{bean.picutreFile}" a:accept="image/*">
<f:ajax listener="#{bean.uploadPicture}" />
</h:inputFile>

<h:commandLink action="#{bean.save}">
Save
</h:commandLink>
</h:form>

功能:

public String save() {
return "/index?faces-redirect=true";
}

public void uploadPicture() {
// Do nothing
}

但是在我选择图像并接到uploadPicture的电话之后功能,save函数无法重定向页面。它调用save但是重定向不起作用,只能刷新当前页面。

如果我跳过文件上传,它会正常重定向。我怎样才能让它发挥作用?

编辑
我注意到如果我删除 ajax <f:ajax listener="#{bean.uploadPicture}" />它按预期工作。但我必须有那个 ajax,因为我想在上传后显示图像。

编辑 2
我可以看到在调用 ajax 之后,JSF 使用 partial-response 在页面底部创建了一个奇怪的 iframe标记在它的主体中,当我按“保存”时,那个 iframe 被重定向到目的地。这是为什么??

最佳答案

我转载了。我确实同意这种行为令人困惑且不直观,但我不会说这是 JSF 实现中的错误,因为您实际上是将 ajax 与常规请求混合在一起,这首先是错误的。另请参阅此相关问题 httpError: The Http Transport returned a 0 status code .

正确的方法是要么使命令链接也成为ajax链接,

<h:commandLink action="#{bean.save}">
Save
<f:ajax execute="@form" />
</h:commandLink>

删除<f:ajax>来自 <h:inputFile> (并在 save() 中执行上传处理)。

<h:inputFile value="#{bean.picutreFile}" a:accept="image/*" />

顺便说一句,您看到的 iframe 是在文件上传期间模拟异步行为的古老技巧,早在 XHR2 / FormData API 之前就已经发明了被标准化。这种方法在 JSF 2.2 开发期间比 XHR2 更受青睐,因为它在 Web 浏览器(尤其是 MSIE)中具有更好的向后兼容性。另见 a.o. How to make Asynchronous(AJAX) File Upload using iframe?

关于JSF在文件输入ajax后没有重定向请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36623750/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com