JSF页面仅在辅助bean处于会话作用域时加载数据

时间:2014-08-07 04:54:57

标签: spring jsf primefaces

这是我的admin_order_search.xhtml页面,其中有一个<p:dataTable> 我正试图用微粒打电话给admin_view_order.xhtml页面 order对象

<p:column>
   <f:facet name="header">
     <h:outputText value="View" />
   </f:facet>

   <p:commandButton action="admin_view_order?faces-redirect=true" id="view" value="View Info" update="dataTable" actionListener="#{viewOrderController.loadOrder(order)}" />

</p:column>

这是我的“admin_view_order.xhtml”

<h:form id="orderViewForm">
    <p:growl id="growl" showDetail="true" autoUpdate="true" sticky="false" />           

    <p:outputLabel value="#{viewOrderController.order.orderId}"></p:outputLabel>
    <p:outputLabel value="#{viewOrderController.order.customerName}"> </p:outputLabel>

</h:form>

并听到我的“ViewOrderController.java”页面

@Component
@ManagedBean
@ViewScoped
public class ViewOrderController implements Serializable{
    private static final long serialVersionUID = 1L;
    private Order order;

    public void loadOrder(Order order){
        System.out.println("ID : "+order.getOrderId());
        System.out.println("Name : "+order.getCustomerName());
        this.order = order;
    }

    public Order getOrder() {
        return order;
    }

    public void setOrder(Order order) {
        this.order = order;
    }
}

问题是admin_view_order.xhtml显示订单详细信息,仅当我的ViewOrderController位于@SessionScoped但我希望它位于ViewScoped

请让我知道怎么做?

2 个答案:

答案 0 :(得分:0)

为什么你想让Controller成为ViewScoped?

离开视图(导航到admin_view_order.xhtml)后,将使用控制器的新实例。因此,之前所做的更改(在loadOrder中设置顺序)已经消失。

答案 1 :(得分:0)

还有另外一种方法,就是通过GET请求传递参数(例如,您可以将 admin_order_search.xhtml 中的订单对象的ID传递给,然后恢复此ID和通过使用此id搜索对象,在您的支持bean中使用它。

这可以通过使用视图参数

来实现

1 - 传递对象的id(在按钮内添加下面的标签)

<f:param name="id" value="#{viewOrderController.order.orderId}" /> 

2 - 之后,在您的admin_view_order.xhtml页面中,捕获视图参数并加载该订单的信息:

<f:metadata>
    <f:viewParam name="id" value="#{viewOrderController.newOrderId}" />
    <f:event type="preRenderView" listener="#{viewOrderController.loadOrder}"/>
</f:metadata>

请注意我添加了一个attribut(newOrderId)来将order.orderId放入其中