在Liferay中实现视图层的最佳实践是什么? 以及如何使用“ liferay-search container-row”显示来自两个表的记录?
接下来我将解释我在项目中所做的事情,以便您对我的问题和我在说什么有一个正确的认识。
我使用了服务构建器,并获得了 PERSISTENCE 和 SERVICE 层
我使用了 service.xml 并创建了2个实体。
然后,在xxxLocalServiceImpl中,我创建了用于更新,添加,删除...的必要方法。
然后在 presentation 层(视图)中,使用名为xxx-WEB的mvc-portlet模板添加了一个新的liferay模块(因此,现在我有了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">
由于我只能使用一个 Model 来获取表数据,所以无法显示另一表中的数据。
所以我要做的是将另一个实体(作者)暴露给另一个实体(音乐)。
我去了 MusicImpl类,一个创建了Author类型的属性以及getter和setters方法。
然后在 addMusicAndAuthor方法的 MusicLocalServiceImpl 中,我为此音乐设置了作者,例如:music.setAuthor(author)。>
此后,为了能够显示我的JSP中的所有数据,我需要覆盖 MovieLocalService的 getter , getMusics(int开头, int end)。
我在 override 中所做的就是获取所有电影,并且我为每部电影设置了作者
代码:
@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 的类带有 getter和setters ,这样,我将无需覆盖,因此我不应该进行覆盖。
但这对我来说意义不大,因为我已经有了一个视图层,而liferay已经在API中为我创建了该模型,对吗?还是我错过了什么? 有没有另一种方式可以显示两个表中的数据而没有该替代?做我朋友告诉我的事情有意义吗?
非常感谢!