【问题标题】:Session etc in Java ServletsJava Servlet 中的会话等
【发布时间】:2012-04-12 15:31:03
【问题描述】:

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

  • 在应用程序上下文中,我有一个产品的 ArrayList(模型类称为产品)

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    您可以将排名存储在会话中的地图中,以产品 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/控制器中:

    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、stars、cmets、productId、userId
    用户: id, name, email, etc...

    如果您使用数据库,请使用 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 显示内容。

    玩得开心!

    【讨论】:

    • 感谢您的详尽回复...我现在没有使用任何特定的 MVC 框架,只是普通的 Servlets/JSP 等。
    猜你喜欢
    • 2013-12-06
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    • 2010-12-04
    相关资源
    最近更新 更多