Liferay:动作阶段后错误的 .jsp,而不是正确的值

Liferay: wrong .jsp after action phase and not the right values

如何在 Liferay 中正确使用动作和渲染阶段,我遇到了很大的麻烦。

我正在使用 for 循环显示对象列表中的不同 link。 现在我想单击其中一个 link 并转到下一个 .jsp。新的.jsp 的内容取决于连接到object/link.

的id

我该怎么做?

到目前为止,我的代码如下所示:

ePfad.jsp

<% EpfadUtil all = new EpfadUtil();
List pfade = all.getEpfad();
for(int i = 0; i < pfade.size(); i++){
    Epfad pfad = (Epfad) pfade.get(i);
    //actionResponse.setRenderParameter("id", String.valueOf(pfad.getEpfadId()));
%>
<a href = "<portlet:actionURL name="showById"><portlet:param name="mvcPath" value="/html/wbm/user/ePfadAnmelden.jsp?id=<%=pfad.getEPfadId() %>" /> </portlet:actionURL>"> <%=pfad.getTitle().getName()%> </a>
<% } %>

WBM_Portlet.java

public class WBM_Portlet extends MVCPortlet {
    public void showById(ActionRequest actionRequest, ActionResponse actionResponse) throws IOException, PortletException {
        PortletPreferences prefs = actionRequest.getPreferences();
        String id = actionRequest.getParameter("id");

        if(id != null) {
            prefs.setValue("id", id);
            prefs.store();
        }
    }
//[...]
}

我的代码不会重定向到右边jsp而且id也不正确

谢谢你,并致以最诚挚的问候。

解决方案:

ePfad.jsp

<portlet:renderURL var="showByIdRenderURL">
    <portlet:param name="mvcPath" value="/html/wbm/user/ePfadAnmelden.jsp" />
    <portlet:param name="id" value="<%=String.valueOf(pfad.getEPfadId()) %>" />
</portlet:renderURL>

<a href="<%=showByIdRenderURL%>"><%=pfad.getTitle().getName() %></a>

WBM_Portlet.java

public void showById(RenderRequest request,
        RenderResponse response) throws IOException, PortletException
        {
            PortletPreferences prefs = request.getPreferences();
            String id = request.getParameter("id");

            if(id != null)
            {
                prefs.setValue("id", id);
                prefs.store();
            }
        }

如果您只想显示另一个 JSP,那么您应该使用渲染阶段而不是动作阶段。所以这里是你如何使用 renderURL:

<portlet:renderURL var="showByIdRenderURL">
    <portlet:param name="mvcPath" value="/html/wbm/user/ePfadAnmelden.jsp %>" />
    <portlet:param name="id" value="<%= String.valueOf(pfad.getEPfadId()) %>" />
</portlet:renderURL>

<a href="<%= showByIdRenderURL %>"><%=pfad.getTitle().getName()%></a>

并且在 render 方法或 doView 方法中,您可以编写逻辑来存储参数 id 中的首选项(请注意上面的 id URL设置为参数,你的做法不对)

如果你仍然想使用动作阶段(不推荐用于此类事情,它更适合表单帖子)那么你可以执行以下操作:

<portlet:actionURL name="showById" var="showByIdActionURL">
    <portlet:param name="mvcPath" value="/html/wbm/user/ePfadAnmelden.jsp %>" />
    <portlet:param name="id" value="<%= String.valueOf(pfad.getEPfadId()) %>" />
</portlet:actionURL>

<a href="<%= showByIdActionURL %>"><%=pfad.getTitle().getName()%></a>

在您的操作方法中:

public void showById(ActionRequest actionRequest, ActionResponse actionResponse) throws IOException, PortletException {
    PortletPreferences prefs = actionRequest.getPreferences();
    String id = actionRequest.getParameter("id");

    if(id != null) {
        prefs.setValue("id", id);
        prefs.store();
    }

   String mvcPath = actionRequest.getParameter("mvcPath");

   // this would tell the render method to show the required JSP
   actionResponse.setRenderParameter("mvcPath", mvcPath); 
}

希望这能回答问题。

但是如果你真的想开发一些实质性的东西并学习,我强烈建议你阅读一些很好的教程,这些教程解释了 portlet 生命周期不同阶段的概念,或者一些好书,比如 Portlets in ActionLiferay in Action,即使通过 stackwiki 链接 - and 也会给你一个更好的主意。