如何在jsf页面中显示数据后销毁会话

时间:2013-11-22 16:44:19

标签: jsf session

我有这个问题:我正在制作这个精彩的教程The NetBeans E-commerce Tutorial 。但是,不是像在JSP中那样使用它,而是制作一个JSF版本。只是为了在构建这样的应用程序中的逻辑。

在某些部分中,ControllerServlet.java具有以下代码:

int orderId = orderManager.placeOrder(name, email, phone, address, cityRegion, ccNumber, cart);

                // if order processed successfully send user to confirmation page
                if (orderId != 0) {

                    // dissociate shopping cart from session
                    cart = null;

                    // end session
                    session.invalidate();

                    // get order details
                    Map orderMap = orderManager.getOrderDetails(orderId);

                    // place order details in request scope
                    request.setAttribute("customer", orderMap.get("customer"));
                    request.setAttribute("products", orderMap.get("products"));
                    request.setAttribute("orderRecord", orderMap.get("orderRecord"));
                    request.setAttribute("orderedProducts", orderMap.get("orderedProducts"));

                    userPath = "/confirmation";

                // otherwise, send back to checkout page and display error

如您所见,作者使会话无效,以便允许其他采购订单。我创建了一个具有会话范围的Managed Bean,以便在整个会话期间保存可用的数据。但是,当我尝试清理会话时,如作者所做的那样,我无法收到确认数据。

然后,我创建了一个不同的托管bean,以便有一个处理订单(CartManagerBean),另一个用于呈现确认(ConfirmationMBean)。我只是将confirmatioBean注入cartBean以传递orderId,这是呈现数据所必需的。在confirmationBean中,我创建了一个cleanUp()方法,使会话无效。

但总是没有呈现数据。所以如果有人能告诉我该怎么做,我会很感激。

以下是我的cartBean代码中将数据传递给确认bean的部分:

...
@ManagedProperty(value ="#{confirmationBean}")
private ConfirmationMBean confirmationBean;
...
public String  makeConfirmation() {
    FacesContext fc = FacesContext.getCurrentInstance();
    if (!cartMap.isEmpty()) {
        int orderId = orderManager.placeOrder(name, email, phone, address, credicard, cartMap);

        // if order processed successfully send user to confirmation page
        if (orderId != 0) {
            // get order details
            confirmationBean.setOrderId(orderId);

            // dissociate shopping cart from session
             cartMap.clear();

            // end session
            //fc.getExternalContext().invalidateSession();
        }
    }

   return "confirmation";
}

如您所见,我评论了使会话无效的部分。以下是我为ConfirmationMBean实现的代码:

@ManagedBean(name = "confirmationBean")

@SessionScoped public class ConfirmationMBean实现Serializable {

private Customer customer;
private List<OrderedProduct> orderedProducts;
private CustomerOrder orderRecord;
private List<Product> products;
private int orderId;

@EJB
private OrderManager orderManager;

public void cleanUp(){
    FacesContext fc = FacesContext.getCurrentInstance();
    fc.getExternalContext().invalidateSession();
}

private void init(){
    Map<String, Object> orderMap = orderManager.getOrderDetails(orderId);

    customer = (Customer) orderMap.get("customer");
    orderRecord = (CustomerOrder) orderMap.get("orderRecord");
    orderedProducts = (List<OrderedProduct>) orderMap.get("orderedProducts");
    products = (List<Product>) orderMap.get("products");
}

public Customer getCustomer() {
    return customer;
}

public void setCustomer(Customer customer) {
    this.customer = customer;
}

public List<OrderedProduct> getOrderedProducts() {
    return orderedProducts;
}

public void setOrderedProducts(List<OrderedProduct> orderedProducts) {
    this.orderedProducts = orderedProducts;
}

public CustomerOrder getOrderRecord() {
    return orderRecord;
}

public void setOrderRecord(CustomerOrder orderRecord) {
    this.orderRecord = orderRecord;
}

public List<Product> getProducts() {
    return products;
}

public void setProducts(List<Product> products) {
    this.products = products;
}

public int getOrderId() {
    return orderId;
}

public void setOrderId(int orderId) {
    this.orderId = orderId;
    init();
    cleanUp();
}

}

如您所见,当前一个bean设置orderId时,将从数据库中请求数据,并填充要在facelet中显示的变量。 ¿我在哪里或如何使用cleanUp方法以获得与教程相同的结果?

提前致谢。

1 个答案:

答案 0 :(得分:1)

将bean调用请求范围中的操作而不是会话范围,并将所需的会话范围bean作为(托管)属性。

@ManagedBean
@RequestScoped
public class SubmitConfirmationBean {

    @ManagedProperty("#{cartBean}")
    private CartBean cartBean;

    // ...
}

并通过#{submitConfirmationBean.cartBean...}而不是#{cartBean...}引用它。

或者,将所需的会话范围bean显式地放在请求范围中,使其与您使会话无效的操作方法相同:

externalContext.getRequestMap().put("cartBean", cartBean);

这样,#{cartBean...}将引用请求作用域,而不是会话作用域新重新创建,因为您销毁了会话。无论如何,下一个请求都会丢失请求范围的请求。