2013-11-22 68 views
0

我有这个问题:我正在制作这个奇妙的教程The NetBeans E-commerce Tutorial。但是,不要像所介绍的那样在JSP中创建它,而是创建一个JSF版本。只是为了理解构建这样的应用程序的逻辑。如何在数据呈现在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 

正如你所看到的,笔者无效的会议,以允许其他采购订单。我制作了一个带有会话范围的托管Bean,以便在整个会话期间保持数据的可用性。但是,当我尝试清理会话时,就像作者在教程中所做的那样,我无法收到确认数据。

然后,我创建了一个不同的托管bean,以便有一个托管bean来处理订单(CartManagerBean),另一个托管bean提供确认(ConfirmationMBean)。我只是将confirmmatioBean注入到cartBean中以传递orderId,这是呈现数据所必需的。在confirmationBean中,我做了一个cleanUp()方法,使session失效。

但总是不显示数据。所以如果有人能告诉我该怎么做,我会感激。

这里是数据传递给确认Bean的我cartBean的代码部分:

... 
@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 公共类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,从数据库中请求数据,并填充变量以显示在facelet中。 ¿为了获得与本教程相同的结果,我在哪里或者如何使用cleanUp方法?

在此先感谢。

回答

1

将bean放在请求范围而不是会话范围中调用操作,并获取期望的会话作用域bean作为(托管)属性。

@ManagedBean 
@RequestScoped 
public class SubmitConfirmationBean { 

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

    // ... 
} 

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

另外,明确提出所需的会话在同样的动作方法的要求范围,因为你在哪里会话无效范围的bean:

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

这样的#{cartBean...}将把请求范围的一个,而不是会话的范围是新创建在那一点,因为你破坏了会议。无论如何,请求范围的请求会被下一个请求丢失。

+0

感谢BalusC,我按照您的建议改变了代码,但这种方式我没有找到发送orderId的方法,它将所有数据显示在确认页面中。我得到了一个N​​ullPointerException,我必须获取orderId值来从数据库请求数据。我还在工作,如果我找到解决方案,我会在这里发布 –

+0

也许你改变太多了?它只应用于** **提交按钮,使会话无效,而不是所有其他方法/视图!另外,我无法确定在最后一页显示哪个bean时,在无效期间。这也很可能意味着你保留'ConfirmationBean'而不是'CartBean'。你的问题不清楚。 – BalusC

+0

没错,我想保留'ConfirmationBean',但这个bean使用'CartBean'中生成的orderId值。那么,我怎样才能将这个值从一个bean传递给另一个呢? –