我有这个问题:我正在制作这个奇妙的教程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方法?
在此先感谢。
感谢BalusC,我按照您的建议改变了代码,但这种方式我没有找到发送orderId的方法,它将所有数据显示在确认页面中。我得到了一个NullPointerException,我必须获取orderId值来从数据库请求数据。我还在工作,如果我找到解决方案,我会在这里发布 –
也许你改变太多了?它只应用于** **提交按钮,使会话无效,而不是所有其他方法/视图!另外,我无法确定在最后一页显示哪个bean时,在无效期间。这也很可能意味着你保留'ConfirmationBean'而不是'CartBean'。你的问题不清楚。 – BalusC
没错,我想保留'ConfirmationBean',但这个bean使用'CartBean'中生成的orderId值。那么,我怎样才能将这个值从一个bean传递给另一个呢? –