view.jsp和render方法的基本Liferay实现策略

问题描述 投票:0回答:1

请告诉我Liferay的基本实施政策。我正在制作评论列表的小部件,那么我应该将搜索的一个功能和最初显示的列表功能之类的另一个功能分开吗?如果它们被划分,虽然它将在屏幕上完全显示,但我认为在划分它和不划分的情况下,实现完全不同。我在1个jsp上实现了两个函数作为view.jsp,现在没有分离函数。我应该单独制作这个jsp,即使两者显示完全相同吗?现在最麻烦的是portlet类的render方法。我使用render方法获取要在列表中显示的数据,但此数据不用于portlet中的其他函数。渲染方法通过portlet中显示的任何屏幕,不是吗?因此,我认为我可以通过搜索来分隔jsp并通过调用list 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中设置的数据结果用于搜索和列表函数。但是,它不用于其他功能,例如显示详细数据的详细功能和注册数据的注册功能。这个结果对于详细的功能或注册功能不是必需的,我认为这样的实现是不好的。所以请告诉我如何正确或正确地更改实施。

java jsp liferay portlet
1个回答
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都将工作。

我认为值得提出的问题是,是否在渲染阶段进行实际搜索,或者是否应在行动阶段完成搜索。

期望是动作处理程序执行实际工作,但渲染应该只呈现结果。我们的想法是,如果页面刷新100次,则表示您没有完成100次搜索,只进行了一次初始搜索,其中包含100次相同结果集的渲染。

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

也就是说,我认为人们也可以争辩说,在你的情况下应该是相同的状态是搜索标准,如果搜索结果由其他用户改变,则更新的结果是预期的结果。

© www.soinside.com 2019 - 2024. All rights reserved.