Java Servlets中的会话等

时间:2012-03-29 00:41:56

标签: java model-view-controller jsp servlets jstl

我正在学习Servlets / JSP / MVC,并且对构建一个简单的应用程序有疑问。我有一个人们可以对产品进行投票的网站。

  • 在应用程序上下文中,我有一个Products的ArrayList(模型类叫做Product)

  • 我有一个家庭Servlet,它绘制所有产品(从上下文读取列表,从属性转发到JSP)。这些项目是使用JSTL绘制的。

  • 我有另一个名为ProductRate的servlet,可以在查看产品时调用。在doPost()上应该记录用户给产品的评级(在表单中指定)并将其保存在Session中。

我希望能够加入Home servlet上的信息,不仅可以显示产品信息(存储在应用程序上下文中),还可以显示用户给予的任何投票。如果没有价值,那么我不会显示任何说“感谢您投票的X”或类似内容。

我应该在我的Product model类中添加一个名为“userRating”的字段,并在读取Home Servlet上的列表时,查看为其存储的任何会话值,并将投票值分配给“userRating”模型值?

所以实际上,我有一个应用程序总是使用的固定对象列表,但是当在JSP中绘制它们时,我想要一个很好的干净方式来存储会话中存储的任何信息(投票值),以便处理模型JSP是轻而易举的

1 个答案:

答案 0 :(得分: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>

在你的POST servlet / controller中:

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,userId
用户: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显示内容。

玩得开心!