【问题标题】:Liferay portlet - passing string array from actionRequest to renderPhaseLiferay portlet - 将字符串数组从 actionRequest 传递到 renderPhase
【发布时间】:2023-03-27 06:40:01
【问题描述】:

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

感谢您的任何回答!

【问题讨论】:

    标签: java jsp liferay portlet


    【解决方案1】:

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

     actionRequest.setAttribute("messages", messagesObject);
    

    你可以渲染到特定的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>
    

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

    【讨论】:

    • 你能给我一个如何在我的jsp文件中获取数组列表的例子吗?它说数组列表“无法解析为类型”...
    • 需要导入jstl标签库.."java.sun.com/jsp/jstl/core"%>"
    • 它说 java.sun.com/jsp/jstl/core" %> 找不到 - 我什至将它作为 taglib 添加到 web.xml conf 文件中......
    • 你的jsp有没有编译错误?如果没有,请尝试运行您的代码并检查您是否收到消息列表
    【解决方案2】:

    可以将 java 对象放入 Portlet Session:

    <% 
    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}"/>
    

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

    【讨论】:

      【解决方案3】:

      看看这个page。这是关于将信息从动作阶段传递到渲染阶段的 LifeRay 文档。

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

      获取它

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

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

      【讨论】:

      • 我已经阅读了本教程 - 我能够以这种方式传递字符串。问题是如何以这种方式传递整个数组。
      • 当我请求这样的数组时:“String[] messages = (String[])renderRequest.getParameter("messages");”,它说它无法将 String 解析为 String[]。请您提供一个可行的示例吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多