gpt4 book ai didi

java - ADF AF :showPrintablePageBehavior sends all subsequent navigation commands to a new window

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:27:26 24 4
gpt4 key购买 nike

我有一个打印图标,可以呈现表单的可打印版本。

<af:link id="printButton" icon="/images/printer.png">
<af:showPrintablePageBehavior/>
</af:link>

这部分工作正常,但在您关闭由 <af:showPrintablePageBehavior/> 创建的选项卡后任何重定向到新页面的尝试都会创建一个新的浏览器选项卡。

执行重定向的按钮是这样定义的,

<af:button text="Search" action="#{backing.searchAction}" 
partialSubmit="false" immediate="true" id="ab1" />

public String searchAction() {
return "search"
}

"search"是导航规则,定义在 faces-config.xml 中如果您不调用 <af:showPrintablePageBehavior/>,则可以正常工作在点击按钮之前。

我试过使用 ExternalContext.redirect(page) .我也试过定义 targetFrame属性为 _self_parent对于 <af:button> .错误行为与这些方法中的每一种都是一致的。

最佳答案

在您的示例中,万恶之源是 immediate="true"属性。如果您只是删除它,您的问题就会得到解决。

但是,为了解释原因,让我们首先从 <af:showPrintablePageBehaviour> 开始。组件和 trinidad-config.xml文件(嵌套在 WEB-INF 文件夹中)。

trinidad-config.xml文件列出了一个元素,称为 <output-mode> .默认情况下,它不存在,但您可以手动添加。该元素支持三个值:

  • "default" (或 null ):默认输出模式
  • "printable" : 适合可打印页面的输出模式
  • "email" : 适合通过电子邮件发送页面内容的输出模式

为了将页面内容显示为可打印的,output-mode更改(通常由底层框架)为 "printable" .所以,每次你点击你的<af:link>组件,<output-mode>值设置为 "printable" .

关于 trinidad-config.xml 的好处就是允许我们在里面使用EL表达式,也就是说我们可以动态改变<output-mode>的值元素。例如,可以从 @ManagedBean 中读取值:

 <output-mode>#{printableBehaviorBean.outputMode}</output-mode>

been 本身可以是一个完全简单的 ( @RequestScoped ) bean。请注意,我使用注释而不是基于 XML 的配置,因为您提到您使用的是 ADF 12c,它构建在 JSF-2 之上。

@RequestScoped
@ManagedBean(name = "printableBehaviorBean")
public class PrintableBehaviorBean {
private String outputMode;

public void setOutputMode(String outputMode) {
this.outputMode = outputMode;
}

public String getOutputMode() {
return outputMode;
}
}

然后,我们可以这个bean 注入(inject)到另一个bean 中,这将帮助我们导航到"search"Search 时的 Activity 按钮被按下。该 bean 将有一个嵌套的 @ManagedProperty成员,它将持有前面 printableBehaviorBean 的一个实例 bean 。此外,navigationBean会介绍一个search()方法,我们将从 Search 中引用按钮的 action属性。

这里的技巧是在实际返回导航结果之前,我们将更改 outputMode 的值printableBehaviorBean中的属性(property).请记住,这个新值将覆盖现有的 <output-mode>值,如果 <output-mode>值先前设置为 "printable" , 它将恢复为 "default" (每次我们点击 Search 按钮时都会发生这种情况)。

@RequestScoped
@ManagedBean(name = "navigationBean")
public class NavigationBean {

@ManagedProperty(name = "printableBehaviorBean", value="#{printableBehaviorBean}")
private PrintableBehaviorBean printableBehaviorBean;

public void setPrintableBehaviorBean(PrintableBehaviorBean printableBehaviorBean) {
this.printableBehaviorBean = printableBehaviorBean;
}

public PrintableBehaviorBean getPrintableBehaviorBean() {
return printableBehaviorBean;
}

public String search() {
printableBehaviorBean.setOutputMode("default");
return "search";
}

}

最后,Search按钮定义将稍微更改为:

<af:button text="Search" action="#{navigationBean.search}" immediate="true" id="ab1" />

现在,另一个有趣的问题是“为什么删除 immediate="true" 可以解决问题?

A UICommandimmediate="true" 装饰的组件将使框架跳过“流程验证”、“更新模型值”和“调用应用程序”JSF 生命周期阶段(即第 3、4 和 5 阶段)。我对您的问题的假设是,在“调用应用程序”阶段之前,ADF 实现检查 命令组件是否装饰有 <af:showPrintablePageBehaviour>组件,如果是,则它以编程方式更改 <output-mode> 的值元素。既然你有 immediate="true""Search" 上按钮,此值将保留为 "printable" .这就是为什么当您返回表单时,它会触发一个新标签。

因此,总而言之,或者删除 immediate="true"属性、按照我建议的 bean 的解决方法。

关于java - ADF AF :showPrintablePageBehavior sends all subsequent navigation commands to a new window,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30311034/

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