2012-03-29 44 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