mardi 24 mars 2015

How to link one individual object selected from a collection of objects to a jsp page?


First, this is some code snippet from my ControllerServlet (if you need to see more, no problem, just ask):



package controller;


import cart.ShoppingCart;
import wishlist.Wishlist;
import entity.Category;
import entity.Product;
import java.io.IOException;
import java.util.Collection;
import javax.ejb.EJB;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import session.CategoryFacade;
import session.ProductFacade;

public class ControllerServlet extends HttpServlet {


@EJB
private CategoryFacade categoryFacade;
@EJB
private ProductFacade productFacade;

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

String userPath = request.getServletPath();
HttpSession session = request.getSession();
Category selectedCategory;
Product selectedProduct;
Collection<Product> categoryProducts;



// if category page is requested
if (userPath.equals("/category")) {

// get categoryId from request
String categoryId = request.getQueryString();

if (categoryId != null) {

// get selected category
selectedCategory = categoryFacade.find(Short.parseShort(categoryId));

// place selected category in session scope
session.setAttribute("selectedCategory", selectedCategory);

// get all products for selected category
categoryProducts = selectedCategory.getProductCollection();

// place category products in session scope
session.setAttribute("categoryProducts", categoryProducts);
}


// if product page is requested
if (userPath.equals("/product")) {

// get productId from request
String productId = request.getQueryString();

if (productId != null) {

// get selected product
selectedProduct = productFacade.find(Short.parseShort(productId));

// place selected product in session scope
session.setAttribute("selectedProduct", selectedProduct);
}}


Alright on to the issue.


I'm trying to link a product to its own jsp page from the category it comes from. In other words, create a product page for a given product coming from its given category. So far, the linkage works fine but there are three main scenarios i'm facing when calling different codes:


1-The blank scenario: Whenever I use <c:forEach var="product" items="${selectedProduct}" varStatus="iter"></c:forEach>, the product page returns blank where the data for the selected product is supposed to be, like this:


enter image description here


2-The multiplication scenario with all the details: Whenever I use <c:forEach var="product" items="${categoryProducts}" varStatus="iter"></c:forEach>, the product page seems to think that it needs to display all the products from the given category as if it was a category page like this: enter image description here


3-The multiplication scenario with no details: Whenever I use <c:forEach var="product" items="${categoryProducts}" varStatus="iter"></c:forEach>, and call the statements in the table like this:



- ${selectedProduct.name}
- ${selectedProduct.price}
- ${selectedProduct.description}


instead of:



- ${product.name}
- ${product.price}
- ${product.description}


The product page returns like this: enter image description here


This is the product.jsp (if you need to see the other jsps like category.jsp, no problem):



<table style="text-align: left; width: 100%; height: 172px;" border="0"
cellpadding="0" cellspacing="0">

<c:forEach var="product" items="${selectedProduct}" varStatus="iter">

<tbody>
<tr>
<td colspan="1" rowspan="6" style="vertical-align: top;">product_gallery<br>
</td>
<td colspan="1" rowspan="6" style="vertical-align: top;"><img class="img" src="${initParam.productBigImagePath}${product.name}.jpg"><br>
</td>
<td style="vertical-align: top;">${product.name}<br>
</td>
<td style="vertical-align: top;"><br>
</td>
</tr>
<tr>
<td style="vertical-align: top;">$ ${product.price}</td>
<td style="vertical-align: top;"><br>
</td>
</tr>
<tr>
<td style="vertical-align: top;"><br>
</td>
<td style="vertical-align: top;"><br>
</td>
</tr>
<tr>
<td style="vertical-align: top;"><br>
</td>
<td style="vertical-align: top;"><br>
</td>
</tr>
<tr>
<td colspan="2" rowspan="1" style="vertical-align: top;">${product.description}</td>
</tr>
<tr>
<td style="vertical-align: top;"><form action="addToWishlist" method="post"><br><br> <input
name="productId" value="${product.id}" type="hidden">

<input class="submit" value="<fmt:message key='AddToWishlist'/>" type="submit"> </form><br>
</td>
<td style="vertical-align: top;"><form action="addToCart" method="post"><br><br>

<input name="productId"
value="${product.id}" type="hidden"> <input class="submit" value="<fmt:message key='AddToCart'/>"
type="submit">


</form></td>
</tr>
<tr>
<td style="vertical-align: top;"><br>
</td>
<td style="vertical-align: top;"><br>
</td>

<td colspan="2" rowspan="1" style="vertical-align: top;"><ul><li style="background-color: rgb(198, 255, 201); width:100%; text-align:center; border-radius:2em;"><a href="${value}"><fmt:message key='ContinueShopping'/></a></li>
</ul><br>
</td>
</tr>
</tbody>
</c:forEach>
</table>


I have been trying several code combinations so far with no success... All I want is to display one product per product page... I'm going a bit crazy over all this so any help is welcome! :)




EDIT BASED ON REQUEST


Product.java:



package entity;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Collection;
import java.util.Date;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.Lob;
import javax.persistence.ManyToMany;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;

/**
*
* @author PC
*/
@Entity
@Table(name = "product")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "Product.findAll", query = "SELECT p FROM Product p"),
@NamedQuery(name = "Product.findById", query = "SELECT p FROM Product p WHERE p.id = :id"),
@NamedQuery(name = "Product.findByName", query = "SELECT p FROM Product p WHERE p.name = :name"),
@NamedQuery(name = "Product.findByPrice", query = "SELECT p FROM Product p WHERE p.price = :price"),
@NamedQuery(name = "Product.findByDescription", query = "SELECT p FROM Product p WHERE p.description = :description"),
@NamedQuery(name = "Product.findByLastUpdate", query = "SELECT p FROM Product p WHERE p.lastUpdate = :lastUpdate")})
public class Product implements Serializable {
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 45)
@Column(name = "price")
private BigDecimal price;
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Integer id;
@Basic(optional = false)
@NotNull
@Lob
@Size(min = 1, max = 16777215)
@Column(name = "name")
private String name;
@Lob
@Size(max = 2147483647)
@Column(name = "description")
private String description;
@Basic(optional = false)
@NotNull
@Column(name = "last_update")
@Temporal(TemporalType.TIMESTAMP)
private Date lastUpdate;
@JoinColumn(name = "category_id", referencedColumnName = "id")
@ManyToMany(mappedBy = "productCollection")
private Collection<Category> categoryCollection;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "product")
private Collection<OrderedProduct> orderedProductCollection;


/**
*
*/
public Product() {
}

/**
*
* @param id
*/
public Product(Integer id) {
this.id = id;
}

/**
*
* @param id
* @param name
* @param price
* @param lastUpdate
*/
public Product(Integer id, String name, BigDecimal price, Date lastUpdate) {
this.id = id;
this.name = name;
this.price = price;
this.lastUpdate = lastUpdate;
}

/**
*
* @return
*/
public Integer getId() {
return id;
}

/**
*
* @param id
*/
public void setId(Integer id) {
this.id = id;
}

/**
*
* @return
*/
public String getName() {
return name;
}


/**
*
* @param name
*/
public void setName(String name) {
this.name = name;
}


/**
*
* @return
*/
public String getDescription() {
return description;
}

/**
*
* @param description
*/
public void setDescription(String description) {
this.description = description;
}

/**
*
* @return
*/
public Date getLastUpdate() {
return lastUpdate;
}

/**
*
* @param lastUpdate
*/
public void setLastUpdate(Date lastUpdate) {
this.lastUpdate = lastUpdate;
}

/**
*
* @return
*/
@XmlTransient
public Collection<Category> getCategoryCollection() {
return categoryCollection;
}

/**
*
* @param categoryCollection
*/
public void setCategoryCollection(Collection<Category> categoryCollection) {
this.categoryCollection = categoryCollection;
}

/**
*
* @return
*/
@XmlTransient
public Collection<OrderedProduct> getOrderedProductCollection() {
return orderedProductCollection;
}

/**
*
* @param orderedProductCollection
*/
public void setOrderedProductCollection(Collection<OrderedProduct> orderedProductCollection) {
this.orderedProductCollection = orderedProductCollection;
}

@Override
public int hashCode() {
int hash = 0;
hash += (id != null ? id.hashCode() : 0);
return hash;
}

@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof Product)) {
return false;
}
Product other = (Product) object;
return !((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id)));
}

@Override
public String toString() {
return "entity.Product[ id=" + id + " ]";
}

public BigDecimal getPrice() {
return price;
}

public void setPrice(BigDecimal price) {
this.price = price;
}
}




Aucun commentaire:

Enregistrer un commentaire