Java 你最喜欢哪个选项?

Java 你最喜欢哪个选项?,java,model-view-controller,servlets,jstl,Java,Model View Controller,Servlets,Jstl,我需要显示一个电影列表,这些电影是按照在系统中注册的日期以及用户对它们的评论量排序的。例如: 评论标题|注册日期| 角斗士| 02-01-2010 | 30 矩阵| 01-02-2010 | 20 它是一个遵循MVC的web应用程序。因此,我有一个对象Movie,有一个MovieManager接口,用于检索/持久化数据库中的数据,还有一个servlet RecentlyAddedMovies.java,它转发到一个.jsp来呈现列表。我将通过展示一个例子来解释我的问题,我正在做另一个类似的任务:

我需要显示一个电影列表,这些电影是按照在系统中注册的日期以及用户对它们的评论量排序的。例如:

评论标题|注册日期| 角斗士| 02-01-2010 | 30 矩阵| 01-02-2010 | 20

它是一个遵循MVC的web应用程序。因此,我有一个对象Movie,有一个MovieManager接口,用于检索/持久化数据库中的数据,还有一个servlet RecentlyAddedMovies.java,它转发到一个.jsp来呈现列表。我将通过展示一个例子来解释我的问题,我正在做另一个类似的任务:放映顶级电影

关于电影经理:

/**
 * Returns a collection of the x best-ranked movies
 * @param x the amount of movies to return
 * @return A collection of movies
 * @throws SQLException
 */
public Collection<Movie> getTopX(int x) throws SQLException;
listMovies.jsp的位置类似于:

<c:forEach var="movie" items="${movies}">
    ...
    <c:out value="${movie.title}"/>     
    ...
</c:forEach>
top5问题和我试图解决的问题之间的区别在于,对于top5问题,我需要在视图中显示的所有数据都是电影对象的一部分,因此MovieManager只返回了一组电影。现在,MovieManager必须检索一个有序的电影、评论列表。Movie对象有一个相关联的注释集合,但当然,它缺少一个具有该集合长度的实例变量。我想到了以下几件事:

a创建一个MovieView对象或类似的对象,该对象仅由MVC的视图和控制器层使用,而MVC不属于仅用于轻松检索和显示信息的模型的一部分。此MovieView对象将有一个标题、registerDate和注释,因此该对象看起来如下所示:

     /**
     * Returns a collection of the x most recently added movies
     * @param x the amount of movies to return
     * @return A collection of movies
     * @throws SQLException
     */
    public Collection<Movie2> getXRecentlyAddedMovies(int x) throws SQLException;
jsp文件:

<c:forEach var="movie2" items="${movies2}">
        ...
        <c:out value="${movie2.title}"/>    
        <c:out value="${movie2.registerDate}"/>
        <c:out value="${movie2.noOfComments}"/>     
        ...
  </c:forEach>
b添加到电影拥有的集合中,空评论实际上不需要从数据库检索所有评论数据,以便评论的Collection.size将显示电影拥有的评论数。这听起来很可怕

c向Movie对象添加一个实例字段noOfComments和setter和getter,这将有助于处理此类情况,即使仅从对象的角度来看,它是一个冗余字段,因为它已经有一个.sized的集合

d使MovieManager检索一些结构,例如映射或双组件数组的集合,或类似的结构,这些结构将包含一个Movie对象和相关的注释数,并使用JSLT对其进行迭代并相应地显示。

首先:您应该使用列表,而不是集合,因为集合的迭代顺序不能保证


第二:我更喜欢选项D,但我建议使用某种类型的泛型Pair类,而不是两元素数组。

它是按日期排序的,所以SortedSet更适合。仅当需要基于索引的访问时才应使用列表。Set语义通常更适合imo。我对Set没有意见,但TreeSet不如ArrayList那么快,这真是一个遗憾;如果你可以按照你需要的顺序构建列表,那么在一个紧密的循环中,这个折衷是值得的。不过,公平地说,这种情况可能不是这样。
<c:forEach var="movie2" items="${movies2}">
        ...
        <c:out value="${movie2.title}"/>    
        <c:out value="${movie2.registerDate}"/>
        <c:out value="${movie2.noOfComments}"/>     
        ...
  </c:forEach>