2

我在 Liferay 门户上有一个 portlet,我从 .jsp 页面调用操作。我想将一个字符串数组传递给另一个将显示该数组的 .jsp 页面。但是,根本没有传递任何值。

我可以通过一些String values using String something = (String)prefs.getValue("something", "something");,但这不适用于数组。

这是我调用 actionRequest 的view.jsp(我只会显示部分代码,否则会太长):

<portlet:actionURL var="loadMessages" name="loadMessages">
    <portlet:param name="jspPage" value="/view.jsp" />
</portlet:actionURL>

这是我的 Java 类中的 loadMessages() 函数

public void loadMessages(ActionRequest actionRequest, ActionResponse actionResponse)
    throws IOException, PortletException {

        manager.loadFromDB();   
        ArrayList<Message> messagesObject = manager.getMessages();

        // we must save our messages as strings     
        String[] messages = new String[messagesObject.size()];

        for (int i=0; i<messagesObject.size(); i++) {
            String msg = "";
            Message message = messagesObject.get(i);

            msg += message.getMsgid() + "\n"; 
            msg += message.getSender() + "\n"; 
            msg += message.getReceiver() + "\n"; 

            messages[i] = msg;
        }

        // save
        if (messages != null) {
            actionRequest.setAttribute("messages", messages);   
            System.out.println(messages.length + " messages loaded!");
        }

    }

到目前为止,这工作正常:我收到“加载了 x 条消息!” 消息。

当我想在我的display.jsp文件中访问这个数组时,问题就来了:

<%
String[] messages = (String[])renderRequest.getAttribute("messages");

if (messages == null) {
    System.out.println("NULL MESSAGES");
} else {
    System.out.println(messages[0]);
}
%>

我得到了,我的数组在这里是 NULL 吗?我必须进行哪些更改才能访问我在 actionRequest 阶段保存的数组?

第二个问题:是否可以将 Java 对象传递给 .jsp 页面?我猜这仅适用于字符串,但使用对象肯定会很酷!

感谢您的任何回答!

4

3 回答 3

4

您可以将整个消息列表设置 为属性。

IE

 actionRequest.setAttribute("messages", messagesObject);

您可以使用渲染到特定的jsp

IE

res.setRenderParameter("mvcPath", "jspPath");

或者

res.setRenderParameter("jspPage", "jspPath"); (this one is deprecated now)

在 jsp 部分中,您可以使用jstl c:foreach访问此值

IE

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<c:forEach var="message" items="${messages}">
   <c:out value="${message.sender}"/>
</c:forEach>

试试这个让我知道如果你有任何问题

于 2013-05-16T11:00:25.613 回答
0

It is possible to put java object in the Portlet Session:

<% 
JavaObject javaObject = new JavaObject(); 
renderRequest.getPortletSession().setAttribute("javaObjectAttr", javaObject);
%>

Then you can get this object in another jsp page:

<%
JavaObject javaObject = (JavaObject)portletSession.getAttribute("javaObjectAttr");
pageContext.setAttribute("javaObject", javaObject);
%>

<c:out value="${javaObject.firstName}"/>

I don't know exactly is this a good way or not :)
Hope this helps.

于 2013-05-16T09:17:39.417 回答
0

看看这个页面。它是关于将信息从 Action 阶段传递到 Render 阶段的 LifeRay 文档。

本质上,您可以使用actionResponse.setRenderParameter("key", data);将对象从您的操作方法转发到 doView 方法。在您的 doView 中,您可以使用request.getParameter("key");

这对于 portlet 来说是相当标准的,并且在我看来,它比使用会话更可取,尽管链接上说了什么。使用会话意味着您必须确保不会向会话中添加太多内容并不会导致 portlet 容器的内存开销过大。对于一个用户来说,它可能没有太多的内存,但对于一个大型、繁忙的站点来说,它可以快速增加并使您的服务器瘫痪,或者要求您需要比您的站点实际需要的更多的硬件。

该文章还提到使用初始化参数自动将所有操作参数复制到渲染操作作为另一个可行的选项。

于 2013-05-16T15:26:16.847 回答