我正在学习Servlets / JSP / MVC,并且对构建一个简单的应用程序有疑问。我有一个人们可以对产品进行投票的网站。
在应用程序上下文中,我有一个Products的ArrayList(模型类叫做Product)
我有一个家庭Servlet,它绘制所有产品(从上下文读取列表,从属性转发到JSP)。这些项目是使用JSTL绘制的。
我有另一个名为ProductRate的servlet,可以在查看产品时调用。在doPost()上应该记录用户给产品的评级(在表单中指定)并将其保存在Session中。
我希望能够加入Home servlet上的信息,不仅可以显示产品信息(存储在应用程序上下文中),还可以显示用户给予的任何投票。如果没有价值,那么我不会显示任何说“感谢您投票的X”或类似内容。
我应该在我的Product model类中添加一个名为“userRating”的字段,并在读取Home Servlet上的列表时,查看为其存储的任何会话值,并将投票值分配给“userRating”模型值?
所以实际上,我有一个应用程序总是使用的固定对象列表,但是当在JSP中绘制它们时,我想要一个很好的干净方式来存储会话中存储的任何信息(投票值),以便处理模型JSP是轻而易举的
答案 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显示内容。
玩得开心!