我在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页面?我猜这只适用于字符串,但使用对象肯定会很酷!
感谢您的回答!
答案 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参数自动将所有动作参数复制到渲染动作作为另一个可行的选项。