您最喜欢哪个选项?

时间:2010-04-05 18:15:37

标签: java model-view-controller servlets jstl

我需要显示按照系统中注册日期排序的电影列表以及用户对其进行评论的数量。 E.g:

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

这是一个遵循MVC的Web应用程序。所以,我有一个对象“Movie”,有一个MovieManager接口,用于检索/持久化数据到数据库,以及一个servlet RecentAddedMovies.java,它转发到.jsp来呈现列表。我将通过展示我如何做另一个类似任务的例子来解释我的问题:显示排名靠前的电影。

关于MovieManager:

/**
 * 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;

servlet:

public class Top5 extends HttpServlet{

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        MovieManager movManager = JDBCMovieManager.getInstance();
        try {
            req.setAttribute("movies", movManager.getTopX(5));
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        req.getRequestDispatcher("listMovies.jsp").forward(req, resp);  

    }
}

listMovies.jsp有一些类似的地方:

<c:forEach var="movie" items="${movies}">
    ...
    <c:out value="${movie.title}"/>     
    ...
</c:forEach>

top5问题与我试图解决的问题之间的区别在于,使用top5的东西我需要在视图中显示“Movie”对象的一部分,所以MovieManager只返回了一个Collection电影。现在,MovieManager必须检索 ordered 列表(Movie,#comments)。 Movie对象有一个与Comment相关联的集合,当然,它缺少一个具有该集合长度的实例变量。我想到了以下几点:

a)创建一个MovieView对象或类似的东西,仅用于MVC的“视图”和“控制器”层,它不是“模型”的一部分,仅用于轻松检索和信息显示。这个MovieView对象将有一个标题,registerDate和#of Comments,所以事情看起来像这样:

     /**
     * 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)向“电影”对象添加一个带有setter和getter的实例字段noOfComments,这将有助于这种类型的情况,即使仅从对象的角度来看,它是一个冗余字段,因为它已经有一个“.size()”的集合。

d)使MovieManager检索一些结构,如Map或双组件数组的集合或类似的东西,它将包含Movie对象和相关的注释数量,并使用JSLT迭代它并相应地显示它。

1 个答案:

答案 0 :(得分:0)

首先:您应该使用List,而不是Collection,因为Collection的迭代顺序无法保证。

第二:我更喜欢Option D之类的东西,但是我建议使用某种通用的Pair类来代替两元素数组。