2012-03-29 51 views
1

我正在學習Servlets/JSP/MVC,並對構建簡單應用程序有一個疑問。我有一個網站,人們可以對產品進行投票。Java Servlets中的會話等

  • 在應用程序上下文我有產品的ArrayList(模型類被稱爲產品)

  • 我有一個家的Servlet,吸引了所有的產品(讀取上下文列表,附送屬性JSP)。這些項目使用JSTL繪製出來。

  • 我有另一個名爲ProductRate的servlet,可以在查看產品時調用它。在doPost()應該記錄用戶給產品的評價(在表單中指定)並將其保存在Session中。

我希望能夠加入對家庭的servlet的信息,顯示的不僅是產品信息(存儲在應用程序上下文),而且用戶因爲給它的任何投票。如果沒有價值,那麼我不會顯示任何說「感謝您的X投票」或類似的東西。

我應該向名爲「userRating」的產品模型類添加一個字段,或者在閱讀Home Servlet上的列表時,查看爲其存儲的任何會話值並將投票值分配給「userRating」模型值?

所以實際上,我有一個應用程序始終使用的對象的固定列表,但是在JSP中繪製它們時,我想要一個很好的乾淨方式來結合存儲在會話中的任何信息(投票值),以便處理模型在JSP是一件輕而易舉的

回答

2

你可以在地圖中的排名存儲與產品ID作爲鍵,然後在jsp看起來像會話:

<c:forEach items="${products}" var="product"> 
    <h2>${product.name}</h2> 
    ${product.description} <br/> 
    <c:choose> 
     <c:when test="${not empty ratings[product.id]}"> 
      ${ratings[product.id].stars} <br/> 
      ${ratings[product.id].comments} <br/> 
     </c:when> 
     <c:otherwise> 
      You have not rated this product 
     </c:otherwise> 
    </c:choose> 
</c:forEach> 

在您的文章的servlet /控制器:

Map<Long,Rating> ratings = new HashMap<Long,Rating>(); 
ratings.put(product.getId(),new Rating(1,"I think it's really bad..")); 
session.setAttribute("ratings",ratings); 

如果您有興趣保持用戶的評價或所有產品由Web應用程序管理,我會使用數據庫而不是將數據存儲在配置文件和會話中。考慮下面的數據庫表:

產品:ID,描述等。
評級:ID,明星,評論,productId參數,用戶id
用戶:ID,姓名,電子郵件地址等。 ..

如果您使用數據庫,請使用ORM工具,如Hibernate將您的表映射到對象。與上面所列的表你的對象應該是這樣的:

public class Product { 
    Long id; 
    String description; 
    Set<Rating> ratings; 
} 
public class Rating{ 
    Long id; 
    Integer stars; 
    String comments; 
    User user; 
    Product product; 
} 
public class User { 
    ... 
} 

然後使用Hibernate,你會查詢該產品,並獲得所有與它的對象表單關聯,爲您一起工作的信息。您可以將必要的信息傳遞給視圖。當然,你需要做一些配置來設置休眠狀態。

您提到了MVC。你在使用MVC框架嗎?我會研究Spring MVC或Struts。這將幫助您分離應用程序的各個層次。

你提到的流程似乎是正確的。 Servlet /控制器處理GET請求到主頁面。從數據庫中提取所有產品(或特定產品)以及他們的投票。將它們設置爲參數。 JSP使用JSTL顯示內容。

玩得開心!

+0

謝謝你的詳細回覆...我現在沒有使用任何特定的MVC框架,只是簡單的Servlets/JSP等。 – xingyu 2012-03-29 05:07:19