我有一个显示数据表的JSP页面(page1.jsp)。表格中还有如下按钮:
<h:column>
<f:facet name="header" >
<h:outputText value=""/>
</f:facet>
<h:commandButton value="Show items" action="#{firstBean.displayItems}" immediate="true" />
</h:column>
豆子:
public void displayItems() throws IOException {
MyClass theClass = (MyClass) dataTable.getRowData();
String theId = theClass.getIdentityNumber();
// ...
}
当我们点击按钮时,我想移动到另一个JSP页面(page2.jsp)。在第2页,还有一个数据表。该表是通过调用名为“facade”的bean和一个参数(String-id)创建的。即按下按钮时,我想转到JSP第2页,此页面将根据以下调用显示数据表:
myList = facade.getDeliveriesById(theId);
所以第2页依赖于第1页的内容,要么是字符串id,要么可以某种方式设置列表?
我想问题是:
在JSF(带数据)中从一个页面转到另一个页面的正常方法是什么?
答案 0 :(得分:2)
在JSF 1.x中,通常的方法是返回String
作为导航案例结果。
public String displayItems() throws IOException {
MyClass theClass = (MyClass) dataTable.getRowData();
String theId = theClass.getIdentityNumber();
return "page2";
}
与faces-config.xml
中的以下条目结合使用:
<navigation-rule>
<navigation-case>
<from-outcome>page2</from-outcome>
<to-view-id>/page2.jsf</to-view-id>
</navigation-case>
</navigation-rule>
然后转到page2.jsf
。
在JSF 2.x上,您不需要faces-config.xml
。只需返回没有扩展名的确切文件名,例如"page2"
然后JSF会自动找到正确的视图。这称为implicit navigation。
更新:您似乎每页都有一个“控制器”bean,并且您希望在这些bean之间共享数据而不引用其中的其他 bean页。很合理。这可以通过将数据拆分到另一个托管bean中来实现,该托管bean将作为托管属性注入两个“控制器”bean中。
E.g。
public class ControllerBean1 {
private DataBean dataBean;
public String submit() {
MyClass theClass = (MyClass) dataTable.getRowData();
String theId = theClass.getIdentityNumber();
dataBean.setTheId(theId);
return "page2";
}
// ...
}
并且
public class ControllerBean2 {
private DataBean dataBean;
// ...
}
您可以在page2
中访问它,如下所示:
<h:outputText value="#{controllerBean2.dataBean.theId}" />
在JSF 1.x中,您需要在faces-config中通过<managed-property>
注入它。您可以在this article中找到示例。在JSF 2.x中,您只需使用@ManagedProperty
注释托管属性即可。 在以后的问题中,请提及您正在使用的JSF版本。通过这种方式,我们可以在没有噪音的情JSF 2.x在如何处理事物方面存在很多差异(改进)。