Festlegen von SearchContainer im Portlet für die Verwendung in JSP mithilfe von EL und JSTL

Ich versuche es zu benutzenSearchContainer in meiner Lebenserwartung. Derzeit muss ich JSP-Scriplets verwenden, um dieErgebnisse im<liferay-ui:search-container-results> Stichworte. Dies ist das bisherige Snippet:

<liferay-ui:search-container emptyResultsMessage="there-are-no-courses" delta="5">
    <liferay-ui:search-container-results>
        <%
            List<Course> tempResults = ActionUtil.getCourses(renderRequest);

            results = ListUtil.subList(tempResults, 
                                   searchContainer.getStart(), 
                                   searchContainer.getEnd());

            total = tempResults.size();
            pageContext.setAttribute("results", results);
            pageContext.setAttribute("total", total);
        %>
    </liferay-ui:search-container-results>

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

    <liferay-ui:search-iterator />

</liferay-ui:search-container>

Jetzt möchte ich diese Scriplets in EL ändern. ichhabe einen Beitrag gefunden in Bezug auf das gleiche Problem, aber das ist mitSpring MVC. Und ich habe keine Ahnung, wo ich die folgende Zeile schreiben soll, wie in der Antwort auf diese Frage in Portlets angegeben:

SearchContainer<Book> searchContainer = new SearchContainer<Book>(renderRequest, renderResponse.createRenderURL(), null, "there are no books");

In kann es nicht in meine Portlet-Aktion schreiben, da der Parameter in meiner Aktion istActionRequest undActionResponse, was die Methode nicht definiertcreateRenderURL(). Wie würde ich das bekommen?PortletURL?

Wo soll ich die obige Erklärung schreiben? Derzeit schreibe ich in derselben Aktion, von der aus ich zu dieser Seite zurückkehre. Mache ich das richtig? Hier ist die Aktion, die ich von derselben Seite aus abfeuere, wie diesearch-container ist in:

public void addCourse(ActionRequest request, ActionResponse response) 
        throws Exception {

    ThemeDisplay themeDisplay = 
            (ThemeDisplay) request.getAttribute(WebKeys.THEME_DISPLAY);

    Course course = ActionUtil.courseFromRequest(request);

    List<String> errors = new ArrayList<String>();

    if (CourseRegValidator.validateCourse(course, errors)) {
        CourseLocalServiceUtil.addCourse(course, themeDisplay.getUserId());
        SessionMessages.add(request, "course-added-successfully");

        // I thought I might put it here.
        // But I don't know what to pass as `PortletURL` in constructor of SearchContainer
    } else {
        SessionErrors.add(request, "fields-required");
    }
}

Ich will das jedes MalCourse hinzugefügt wird, wird es in meinem Suchcontainer auf der gleichen Seite gerendert, von der aus ich das abfeuereaddCourse Aktion.

Und ja, mein Portlet wird erweitertMVCPortlet.

AKTUALISIEREN:

Ok, ich habe ein paar Teile herausgefunden.

Zum ersten Mal, wenn ein Portlet geladen wird, kann ich das überschreibendoView Methode in meinem Portlet, und fügen Sie dann dieSearchContainer imrenderRequest dort, wie ich es in zugreifen habedoView.Aber nochmal, wenn ich weitermacheeditCourse() action, wo ich a macheresponse.setRenderParameter(), um es an eine andere JSP-Seite zu senden. Und auf dieser JSP-Seite feuere ich eineupdateCourse() Aktion.Nun, vonupdateCourse() Aktion, die ich wieder benutzeresponse.setRenderParameter() um es an die ursprüngliche JSP-Seite zu senden, auf der ich es verwendeContainer suchen. Aber jetzt, da es nicht durchgehtdoView() Methode kann ich das nicht erstellenSearchContainer und zur Anfrage hinzufügen.

Gibt es hier eine Abhilfe? So stellen Sie sicher, dass das Attribut, das ich festgelegt haberenderRequest imdoView Methode ist verfügbar inupdateCourse Methode? Ich weiß, das hört sich nicht praktisch an, da es sich um eine völlig neue Anfrage handelt, aber gibt es einen anderen Weg?

Eine Abhilfe, die ich mir vorstellen kann, besteht darin, das Attribut in einem größeren Bereich festzulegen, wie zsession odercontext anstattrenderRequest. Aber ich werde dieses Attribut nirgendwo anders brauchen. Das halte ich nicht für angebracht.

Irgendwelche Eingaben?

Update 2:

Gerade habe ich benutzt:

actionResponse.setPortletMode(PortletMode.VIEW);

anstelle von:

actionResponse.setRenderParameter("jspPage", jspPage);

Und es hat funktioniert, wie es jetzt durchgehtdoView() Methode. Ich wollte nur fragen, ist das der richtige Weg? Was ist der Unterschied zwischen zwei Methoden, wenn wir den Render-Parameter auf dieselbe JSP-Seite setzen?doView Methoden umleiten?

Meine jetzigedoView Methode sieht so aus:

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

    SearchContainer<Course> searchContainer = 
            new SearchContainer<Course>(renderRequest, renderResponse.createRenderURL(), null, "there-are-no-courses");

    searchContainer.setDelta(5);
    List<Course> tempResults = ActionUtil.getCourses(renderRequest);

    List<Course> results = ListUtil.subList(tempResults, 
                                    searchContainer.getStart(), 
                                    searchContainer.getEnd());

    searchContainer.setTotal(tempResults.size());
    searchContainer.setResults(results);

    renderRequest.setAttribute("searchContainer", searchContainer);
    super.doView(renderRequest, renderResponse);
}

Antworten auf die Frage(1)

Ihre Antwort auf die Frage