Какой вариант вам нравится больше всего? - PullRequest
0 голосов
/ 05 апреля 2010

Мне нужно показать список фильмов, упорядоченных по дате их регистрации в системе и количеству комментариев, сделанных пользователями о них. Например:

Заголовок | Дата регистрации | Количество комментариев
Гладиатор | 02-01-2010 | 30
Матрица | 01-02-2010 | 20

Это веб-приложение, которое следует за MVC. Итак, у меня есть объект «Movie», есть интерфейс MovieManager, который используется для извлечения / сохранения данных в базе данных, и сервлет 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;

Сервлет:

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>

Разница между проблемой топ-5 и проблемой, которую я пытаюсь решить, состоит в том, что с топ-5 все данные, которые мне нужно было показать в представлении, где находится часть объекта «Кино», поэтому MovieManager просто вернул коллекцию Фильмы. Теперь MovieManager должен получить упорядоченный список (Movie, # of 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 () было показано количество комментариев к фильму. (Это звучит ужасно для меня)

в) Добавьте к объекту «Фильм» поле экземпляра noOfComments с установщиком и получателем, которые помогут в случаях такого типа, даже если, если смотреть только с точки зрения объекта, это избыточное поле, поскольку оно уже имеет Коллекция, способная на ".size ()".

d) Заставить MovieManager получить некоторую структуру, например Карту или Коллекцию из двухкомпонентного массива или что-то подобное, которая будет содержать как объект Movie, так и соответствующее количество комментариев, а JSLT итерирует по нему и отображает его соответственно.

1 Ответ

0 голосов
/ 05 апреля 2010

Первый: вы должны использовать List, а не Collection, потому что порядок итерации Collection не гарантирован.

Во-вторых: я предпочитаю что-то вроде варианта D, но вместо двухэлементного массива я бы предложил какой-то обобщенный класс Pair.

...