Liferay关于如何制作视图模型/图层以及如何使用liferay-search-container显示2个表记录的最佳实践

时间:2019-02-28 12:58:05

标签: java liferay liferay-7

在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中为我创建了该模型,对吗?还是我错过了什么? 有没有另一种方式可以显示两个表中的数据而没有该替代?做我朋友告诉我的事情有意义吗?

非常感谢!

0 个答案:

没有答案