Liferay portlet - 将字符串数组从actionRequest传递给renderPhase

时间:2013-05-16 07:59:27

标签: java jsp liferay portlet

我在Liferay门户网站上有一个portlet,我从.jsp页面调用动作。我想将一个String数组传递给另一个.jsp页面,在那里将显示该数组。但是,根本没有传递任何值。

我可以传递一些String values using String something = (String)prefs.getValue("something", "something");,但这对数组不起作用。

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

<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页面?我猜这只适用于字符串,但使用对象肯定会很酷!

感谢您的回答!

3 个答案:

答案 0 :(得分:4)

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

 actionRequest.setAttribute("messages", messagesObject);

您可以使用

渲染到specpic jsp

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

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

在jsp部分,您可以使用 jstl c:foreach

访问此值

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

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

试试这个 如果您有任何问题,请告诉我

答案 1 :(得分:0)

可以将java对象放在Portlet会话中:

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

然后你可以在另一个jsp页面中获取这个对象:

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

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

我不知道这是不是一个好方法:) 希望这会有所帮助。

答案 2 :(得分:0)

查看此page。 LifeRay文档是关于将信息从Action阶段传递到Render阶段的文档。

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

获取它

这对于portlet来说是相当标准的,在我看来,它比使用会话更受欢迎,尽管链接说明了这一点。使用会话意味着您必须确保不会向会话添加太多内容并导致portlet容器的大量内存开销。对于一个用户而言,它可能没有多少内存,但对于一个庞大而繁忙的站点,它可以快速加起来并使您的服务器瘫痪,或者需要您需要比您的站点真正需要的更多硬件。

本文还提到使用init参数自动将所有动作参数复制到渲染动作作为另一个可行的选项。