java - JSF/Primefaces - 命令按钮 : open new browser tab without ViewScoped bean getting killed

标签 java jsf jsf-2 primefaces liferay

我正在尝试从 ViewScoped 支持的 View 中打开一个带有 JSF View (在 portlet 中,部署在 Liferay 中)的新浏览器选项卡。 bean 。使用正常的操作重定向会杀死 bean。 我试过提供的方法herehere , 但不幸的是没有成功。

按钮看起来大致像这样:

<p:commandButton value="#{msg.label}" onclick="target='_blank'" 
                 action="#{sessionScopedBean.action(param)}" ajax="false" />

移动 target='_blank'对表单属性没有帮助。我试过都返回 nullvoid没有成功。将 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 请求。您应该返回 nullvoid 并有条件地在相同 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/

相关文章:

java - 如何集成 Spring 和 JSF

java - 如何在java中打印0,1,2的字典排列

ajax - 当要阻止的组件通过 AJAX 更新时,PrimeFaces 阻止 UI 不起作用

jsf - 跳过命令按钮上的表单验证

jsf-2 - 使用 CDI 和 JSF 2 的依赖注入(inject)请求参数

java - 找不到命名对象

java - 无法在设计 View 中查看 - NetBeans

java - 如何在 Java 中编写这个正则表达式(单词后跟数字)?

java - 如何求和两个二维数组的乘积?

jsf - 即使 render=false 也会检查 Action/ActionListener 方法