view.jsp和渲染方法的基本Liferay实施策略

时间:2018-08-31 04:45:19

标签: java jsp liferay portlet

请告诉我Liferay的基本实施政策。 我正在制作评论列表,然后我应该分开一个功能(如搜索)和另一个功能(如最初显示的列表功能)吗? 如果将它们分开,尽管它会在屏幕上完全相同地显示, 我认为在分割和不分割的情况下,实现方式完全不同。 我现在以1jsp的形式将这两个功能实现为view.jsp,而没有将它们分开。 即使两个显示完全相同,我也应该单独制作该jsp吗? 现在最麻烦的是Portlet类的render方法。 我正在使用render方法获取要显示在列表中的数据,但是此数据未用于portlet中的其他功能。 render方法通过portlet中显示的任何屏幕,不是吗? 因此,我认为我可以通过搜索和列表来分隔jsp,并通过在列表jsp中调用service在初始视图上显示数据,尽管两者显示的完全相同。 请告诉我这样的基本思维方式?

最诚挚的问候。

嗨。奥拉夫。

这是我的示例来源。 view.jsp

<%@ include file="/init.jsp" %>

<portlet:actionURL var="searchURL" name="search"></portlet:actionURL>

<aui:form action="<%=searchURL %>" name="<portlet:namespace />fm">

    <div class="search-form">
        <span class="aui-search-bar">
            <aui:input inlineField="<%= true %>" label="name"
            name="authorName" size="30" title="search" type="text"
            />

            <aui:input inlineField="<%= true %>" label="content"
            name="content" size="1" title="search" type="text"
            />

            <aui:button type="submit" value="search" />
        </span>
    </div>
</aui:form>

<jsp:useBean id="lresult" class="java.util.ArrayList"
    type="java.util.List" scope="request" />

<liferay-ui:search-container>
    <liferay-ui:search-container-results results="<%= lresult %>" />

<liferay-ui:search-container-row
    className="com.liferay.service.model.Results" modelVar="results" indexVar="i">

    <liferay-ui:search-container-column-text property="authorName" name="name" />

    <liferay-ui:search-container-column-text property="rating" name="rating" />

    <liferay-ui:search-container-column-text property="content" name="content" />

    <portlet:renderURL var='detailUrl'>
        <portlet:param name='action' value='detail' />
        <portlet:param name='id' value='<%= results.getId() %>' />
        <portlet:param name="jspPage" value="/detail.jsp" />
    </portlet:renderURL>
    <a href='<%=detailUrl %>}'>detail</a>

</liferay-ui:search-container-row>

<liferay-ui:search-iterator />

</liferay-ui:search-container>

这是porltet java源代码。 ResultsListPortlet.java

public class ResultsListPortlet extends MVCPortlet {

    private String authorName = "%";
    private String content = "%";

    public void detail(ActionRequest request, ActionResponse response) {
        try {
            String id = ParamUtil.getString(request, "id");
            Results result = _resultsLocalService.findBysearchResult(id);

            renderRequest.setAttribute("result", result);
        }
        catch (Exception e) {
        }
    }

    public void search(ActionRequest request, ActionResponse response) {
        try {
            authorName = ParamUtil.getString(request, "authorName");
            content = ParamUtil.getString(request, "content");
        }
        catch (Exception e) {
        }
    }

    @Override
    public void render(RenderRequest renderRequest, RenderResponse renderResponse)
            throws IOException, PortletException {

        try {
            List<Results> results = _resultsLocalService.findBysearchResults(authorName,
                    content, 0, 20, null, false);
            authorName = "%";
            content = "%";

            renderRequest.setAttribute("lresult", results);
        }
        catch (Exception e) {
            throw new PortletException(e);
        }

        super.render(renderRequest, renderResponse);
    }

    @Reference(unbind = "-")
    protected void setResultsService(ResultsLocalService resultsLocalService) {
        _resultsLocalService = resultsLocalService;
    }
    private ResultsLocalService _resultsLocalService;
}

在render方法中的renderRequest中设置的数据结果用于搜索和列表功能。 但是,它不用于其他功能,例如用于显示详细数据的详细功能和用于注册数据的注册功能。 这对于详细功能或注册功能不是必需的,我认为这样的实现是不好的。 因此,请告诉我如何正确或正确地更改实现。

1 个答案:

答案 0 :(得分:0)

您永远不想使用成员变量在操作和渲染阶段之间保存值。

将调用portlet类来满足所有用户的服务请求,因此这些成员变量将不断更改,并且结果将不是您想要的。

确保它在本地就可以使用,因为您没有用户针对开发系统进行测试,只是您自己,因此成员字段是安全的。

执行此操作的通常方法是使用请求属性。您可以在操作阶段进行设置,而在渲染阶段进行检索。

因此,您将拥有:

public void search(ActionRequest request, ActionResponse response) {
   try {
      authorName = ParamUtil.getString(request, "authorName");
      content = ParamUtil.getString(request, "content");

      request.setAttribute("authorName", authorName);
      request.setAttribute("content", content);
   } catch (Exception e) {
      // you always want to at least log an exception, even if you plan on ignoring.
   }
}

在render()方法中,您可以提取这些值String authorName = GetterUtil.getString(renderRequest.getAttribute("authorName"));以完成搜索。

这使值不会存储在成员字段中,并且无论有多少用户点击了portlet,它都将起作用。

我认为值得提出的问题是在渲染阶段进行实际搜索还是在动作阶段完成搜索。

期望动作处理器可以完成实际的工作,但是render应该只渲染结果。这样的想法是,如果页面刷新100次,则您没有完成100次搜索,只有一次初始搜索具有100个结果相同的结果集。

不是动作请求目标的portlet应该重新渲染与以前的渲染相同的结果;渲染不应有副作用。由于您的搜索结果可能会在其他portlet中的其他用户(可能是管理员)的渲染调用之间发生变化,因此您的结果可能会发生变化,这违反了规范的精神。

也就是说,我想也可以认为,您的情况应该是相同的状态是搜索条件,即如果其他用户更改了搜索结果,则更新的结果就是预期的结果。