Мне нужно показать список фильмов, упорядоченных по дате их регистрации в системе и количеству комментариев, сделанных пользователями о них. Например:
Заголовок | Дата регистрации | Количество комментариев
Гладиатор | 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 итерирует по нему и отображает его соответственно.