由于bean在请求范围中,重定向会创建一个新实例。如果我尝试将bean放在视图范围中,那么我会发现属性名称的错误将比目标视图更窄。
我正在显示一棵树,当用户单击树节点时,例如第二个节点,与该节点相对应的值显示在下一页上。
@ManagedBean
@RequestScoped
public class ThreeSixtyDegreeBean implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
@ManagedProperty(value="#{param.name1}")
private String name;
private String type;
private String typeName;
private List<AttributeDetails> attributeList;
private List<Entity> entityList;
private boolean rendered;
private TreeNode root;
private TreeNode selectedNode;
public void onNodeSelect() {
*selecting Data of the Node selected*
String a=fetchData();
try {
FacesContext.getCurrentInstance().getExternalContext()
.redirect(a);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
其中 a
是xhtml页的名称。
您可以将您的东西藏在新的JSF 2闪存范围中,以在请求之间存放属性。您的onNodeSelect()
现在看起来像这样:
public void onNodeSelect() {
*selecting Data of the Node selected*
FacesContext context = FacesContext.getCurrentInstance();
Flash flash = context.getCurrentInstance().getExternalContext().getFlash(); //prepare jsf flash scope, to store user data pojo for the next view
flash.putNow("myData", fetchData());
try {
FacesContext.getCurrentInstance().getExternalContext()
.redirect(a);
} catch (IOException e) {
e.printStackTrace();
}
}
}
在目标页面上,您可以使用#{flash}
EL表达式检索存储在闪存范围中的数据。它本质上是Map
,因此您只需使用存储的值的键(在我上面使用的示例中" mydata")。要访问它,请使用
#{flash.myData.someMemberVariable}
视图范围也无法正常工作。只要您寄回相同的观点,它就会生存。重定向基本上会创建一个全新的获取请求,并且还将重新创建视图范围。
在这种特殊情况下,您最好在重定向请求中,而不是在回发请求中执行数据初始化。您可以通过创建一个普通的获取链接来做到这一点,其中您可以将必要的信息作为请求参数传递。这样的东西:
<h:link value="#{node.name}" outcome="#{node.viewId}">
<f:param name="someId" value="#{node.someId}" />
<f:param name="name1" value="#{param.name1}" />
</h:link>
,然后在与重定向页面关联的请求范围内的bean中,您可以只使用@ManagedProperty
甚至<f:viewParam>
将请求参数设置为模型值。
另请参见:
- JSF 2.0中的通信 - 处理获取请求参数