如何将XHTML页面重定向到相同的请求范围



由于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中的通信 - 处理获取请求参数

最新更新