Какова лучшая практика для реализации слоя представления в Liferay?И как мне показать записи из двух таблиц, используя «строку-контейнер-поиск liferay»?
Далее я объясню, что я сделал в своем проекте, чтобы вы правильно поняли мой вопрос и что яя говорю о.
Я использовал сервисный конструктор и получил PERSISTENCE и SERVICE слой
, который я использовал service.xml и создал мои 2 сущности.
Затем в xxxLocalServiceImpl я создал необходимые методы для обновления, добавления, удаления ...
И затемдля слоя presentation (просмотр) я добавил новый модуль liferay, используя шаблон портлета mvc под названием xxx-WEB (так что теперь у меня есть xxx-API, xxx-SERVICE и XXX-WEB).
Я все это сделал, поэтому у меня есть три слоя верно?(Модель, контроллер и представление).
Итак, у меня возникла проблема с отображением записей из двух таблиц всего в одной Когда я говорю это, я имею в виду , показывающийданные двух таблиц с использованием Liferay-search-container , поскольку в className
, как показано ниже, я уже определяю модель и не могу определить другую модель для отображения данных из двух таблиц впоиск контейнера.пример: <liferay-ui:search-container-row className="com.liferay.training.xxx.model.xxx" keyProperty="xxx" modelVar="xxx">
Поскольку я могу использовать только одну модель для получения данных таблицы, я не смог показать данные из другой таблицы.
Итак, что я сделал, так это выставил другую сущность (Автор) другой (Музыка).
Я пошел в класс MusicImpl , а создал свойство Author.type, методы getter и setters.
Затем в MusicLocalServiceImpl в методе addMusicAndAuthor Я установил автора для этой музыки пример: music.setAuthor (автор).
После этого для возможности отображения всех данных в моем JSP мне понадобилось переопределить метод получения MovieLocalService , getMusics (int start, int end) .
То, что я сделал в моем переопределении , было выборкой всех фильмов , и длякаждый фильм, который я установил Автор
код:
@Override
public List<Music> getMusics(int startPos, int endPost) {
List<Music> musics = super.getMusics(startPos, endPost);
if ((musics != null && (!musics.isEmpty()))) {
Author author;
for (Music music: musics) {
try {
author = AuthorLocalServiceUtil.getAuthorByMusicId(author.getMusicId());
music.setAuthor(author);
} catch (NoSuchAuthorException e) {
e.printStackTrace();
}
}
}
return musics;
}
И тогда в моем JSP я смог показать де данные изом две таблицы, выполняющие следующее:
<liferay-ui:search-container-results>
<%
int totalMusics = MusicLocalServiceUtil.getMusicsCount();
results = MusicLocalServiceUtil.getMusics(searchContainer.getStart(), searchContainer.getEnd());
searchContainer.setTotal(totalMusics);
searchContainer.setResults(results);
%>
</liferay-ui:search-container-results>
<liferay-ui:search-container-row className="com.liferay.training.musics.model.Music"
keyProperty="musicId" modelVar="currentMusic">
<liferay-ui:search-container-column-text name="Name" property="musicName"/>
<liferay-ui:search-container-column-text name="author" value="<%=currentMusic.getAuthor().getAuthorName() %>"/>
<liferay-ui:search-container-column-jsp align="center" path="/button.jsp"/>
</liferay-ui:search-container-row>
таким образом, я мог бы показать в таблице записи из 2 таблиц.
Но что я хочучтобы узнать, если есть ли другой способ сделать это , потому что друг сказал мне, что может сделать viewmodel и слой представления , он сказал мнечтобы создать пакет для представления модели, я предполагаю, что классы с именами MusicViewModel и AuthorViewModel с геттерами и сеттерами и с этим мне не нужно переопределять, и я не должен этого делать.
но это не имеет особого смысла для меня, так как у меня уже есть слой представления, и liferay уже сделал эту модель для меня в API, верно?или я что-то упустил?Есть ли другой способ показать данные из двух таблиц без этого переопределения?имеет ли смысл делать то, что сказал мне мой друг?
Большое спасибо!