我有这个问题:我正在制作这个精彩的教程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方法以获得与教程相同的结果?
提前致谢。
答案 0 :(得分:1)
将bean调用请求范围中的操作而不是会话范围,并将所需的会话范围bean作为(托管)属性。
@ManagedBean
@RequestScoped
public class SubmitConfirmationBean {
@ManagedProperty("#{cartBean}")
private CartBean cartBean;
// ...
}
并通过#{submitConfirmationBean.cartBean...}
而不是#{cartBean...}
引用它。
或者,将所需的会话范围bean显式地放在请求范围中,使其与您使会话无效的操作方法相同:
externalContext.getRequestMap().put("cartBean", cartBean);
这样,#{cartBean...}
将引用请求作用域,而不是会话作用域新重新创建,因为您销毁了会话。无论如何,下一个请求都会丢失请求范围的请求。