我正在尝试从 ViewScoped
支持的 View 中打开一个带有 JSF View (在 portlet 中,部署在 Liferay 中)的新浏览器选项卡。 bean 。使用正常的操作重定向会杀死 bean。
我试过提供的方法here和 here , 但不幸的是没有成功。
按钮看起来大致像这样:
<p:commandButton value="#{msg.label}" onclick="target='_blank'"
action="#{sessionScopedBean.action(param)}" ajax="false" />
移动 target='_blank'
对表单属性没有帮助。我试过都返回 null
和 void
没有成功。将 ajax 更改为 true
打破了导航,没有打开新标签,但也没有杀死 ViewScoped
bean 。
action
方法内容如下所示:
public void action(String param) throws IOException {
//some business logic
FacesContext.getCurrentInstance().getExternalContext().redirect("viewName.xhtml");
}
View 不包含像 <c:if test="...">
这样的标签处理程序或 <ui:include src="...">
.它确实包含 <ui:repeat id="..." value="#{viewScopedBean.collection}"
var="..." varStatus="...">
标签,但删除它改变了注意事项。
表格附在 <ui:composition>
中。和 <ui:define>
标签。
我重定向到的 View 与 ViewScoped bean 没有任何关系。有任何想法吗? :)
最佳答案
View 范围中断,因为您使用的重定向操作基本上是指示客户端在给定的 URL 上触发一个全新的 GET 请求。您应该返回 null
或 void
并有条件地在相同 View 中呈现结果。
另见:
您找到的链接中已经给出了解决方案:在重定向之前将感兴趣的数据放在 flash 作用域中,并从与目标 View 关联的 bean 中的 flash 作用域中获取它们。如果由于某种原因这对您不起作用,另一种方法是生成一个唯一的 key (java.util.UUID
也许吧?)并将其作为与某些数据关联的 key 存储在 session 范围中你想保留在重定向的请求中,
String key = UUID.randomUUID().toString();
externalContext.getSessionMap().put(key, data);
然后将该 key 作为重定向 URL 中的请求参数传递
externalContext.redirect("nextview.xhtml?key=" + key);
这样你就可以在与目标 View 关联的bean的postconstruct中获取数据:
String key = externalContext.getRequestParameterMap().get("key");
Data data = (Data) externalContext.getSessionMap().remove(key);
// ...
关于java - JSF/Primefaces - 命令按钮 : open new browser tab without ViewScoped bean getting killed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18592697/