从我的bean中的操作,我正在尝试重定向到期望视图参数的另一个页面.在JSF2中这样做的推荐方法是什么?
例如,我的源页面是: http://localhost/page1.xhtml
它有一个调用动作的commandButton:
<h:commandButton value="submit" action="#{myBean.submit}" />
Run Code Online (Sandbox Code Playgroud)
我的bean看起来像:
@ManagedBean
@RequestScoped
public class MyBean {
private int id;
public String submit() {
//Does stuff
id = setID();
return "success";
}
Run Code Online (Sandbox Code Playgroud)
现在,我希望'submit'操作的返回导航到 http://localhost/page2.xhtml?id = 2
我试图在我的导航案例中使用view-param执行此操作,但结果很奇怪.faces-config片段如下所示:
<navigation-rule>
<from-view-id>/page1.xhtml</from-view-id>
<navigation-case>
<from-outcome>success</from-outcome>
<to-view-id>/page2.xhtml</to-view-id>
<redirect>
<view-param>
<name>id</name>
<value>#{myBean.id}</value>
</view-param>
</redirect>
</navigation-case>
</navigation-rule>
Run Code Online (Sandbox Code Playgroud)
奇怪的行为是,即使myBean设置为请求作用域,它只在我第一次加载应用程序时调用myBean.getId(),并为所有后续调用重用相同的值,从而为page2生成不正确的视图参数.
所以我正在寻找一个更好的方法来做到这一点,或者为什么每次都没有从我的bean请求view-param的原因/解决方案.
fdr*_*ger 55
在JSF中传递参数的不直观之处在于,您不会决定要发送什么(在操作中),而是您希望接收的内容(在目标页面中).
当您执行以重定向结束的操作时,将加载目标页面元数据并读取所有必需参数并将其作为参数附加到URL.
请注意,这与任何其他JSF绑定完全相同:您无法从一个位置读取inputText的值并将其写入其他位置.viewParam中定义的值表达式既可用于读取(在重定向之前),也可用于写入(在重定向之后).
用你的bean你只需:
@ManagedBean
@RequestScoped
public class MyBean {
private int id;
public String submit() {
//Does stuff
id = setID();
return "success?faces-redirect=true&includeViewParams=true";
}
// setter and getter for id
Run Code Online (Sandbox Code Playgroud)
如果接收方有:
<f:metadata>
<f:viewParam name="id" value="#{myBean.id}" />
</f:metadata>
Run Code Online (Sandbox Code Playgroud)
它会完全按照你的意愿行事.
dul*_*ule 15
没有更好的解决方案,我发现工作只是在bean返回中构建我的查询字符串:
public String submit() {
// Do something
return "/page2.xhtml?faces-redirect=true&id=" + id;
}
Run Code Online (Sandbox Code Playgroud)
不是最灵活的解决方案,但似乎工作我想要它.
还使用此方法清理构建查询字符串的过程:http://www.warski.org/blog/? p = 185
| 归档时间: |
|
| 查看次数: |
94838 次 |
| 最近记录: |