在之前的question中,BalusC给了我很好的建议,一个按钮代替commandButton对非ajax导航有用。特别是它更新http:位置中的目标地址,这对用户为页面添加书签很有用。
在我遇到问题之前,我试图利用这些信息。在一个按钮中我试图使用outcome =“#{backing.something}”来找出它给我一个null结果。这看起来像一个计时问题,因为action =“#{}”仅在按下按钮时被评估,而结果显然需要一个固定的字符串,在页面加载时会被检查。
所以我用ajax =“false”回到commandButton。这有一个问题,我的导航地址是我来自的页面,而不是我导航到的页面。这是用户的错误书签。
我感谢我在学习练习中获得的所有帮助。 伊兰
答案 0 :(得分:3)
<h/p:button outcome>
不是要调用bean操作方法,而是直接包含结果字符串。其中的任何EL都会立即作为值表达式进行评估。因此,当您打开包含<h/p:button>
。
在您的特定情况下,基本上有两种方法可以在导航上调用bean操作方法。如果您需要在之前调用导航,并且每次最终用户重新打开/重新加载GET请求时都不想重新调用该操作,那么将其设置为POST-Redirect-GET请求。这是在查询字符串语法中将faces-redirect=true
添加到结果值的问题。
E.g。
<p:commandButton action="#{bean.submit}" ... />
与
public String submit() {
// ...
return "nextpage?faces-redirect=true";
}
这样,POST后浏览器将被重定向到目标页面,因此最终用户将看到目标URL反映在地址栏中。
或者,如果您需要在每次最终用户重新打开/重新加载GET请求时调用操作,请在(post)构造函数或请求/视图作用域支持bean的preRenderView
侦听器方法中执行该作业。 / p>
E.g。
<p:button outcome="nextpage" ... />
与
@ManagedBean
@RequestScoped
public class NextpageBacking {
public NextpageBacking() {
// In constructor.
}
@PostConstruct
public void onPostConstruct() {
// Or in postconstructor (will be invoked after construction AND injection).
}
public void onPreRenderView() {
// Or before rendering the view (will be invoked after all view params are set).
}
// ...
}
需要在nextpage
<f:event type="preRenderView" listener="#{nextpageBacking.onPreRenderView}" />