2010-04-05 4 views
0

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

Наименование | Регистрация | Количество комментариев
Гладиатор | 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 имеет коллекцию Comment, но, конечно же, ей не хватает переменной экземпляра с длиной этой коллекции. В голову пришло следующее:

a) Создайте объект MovieView или что-то в этом роде, которое используется только слоем «Вид» и «Контроллер» 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> 

б) Добавить в коллекцию фильм есть, пустые комментарии (нет фактической необходимости извлекать все данные комментариев из базы данных), чтобы в коллекции collection.size() было указано количество комментариев, которые есть в этом фильме. (Это звучит ужасно для меня)

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

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

ответ

0

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

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

+0

Он упорядочен по дате, поэтому SortedSet подходит лучше. Списки должны использоваться только при необходимости доступа на основе индексов. Набор семантики обычно подходит лучше imo. – whiskeysierra

+0

У меня нет говядины с 'Set', но это облом, что' TreeSet' не так быстро, как 'ArrayList'; если вам удастся согнать «Список» в том порядке, в котором он вам нужен, компромисс может стоить этого в плотном цикле. Справедливости ради, скорее всего, это не в этом случае. –