【问题标题】:Creating liferay portlet - how to pass data to view.jsp from Java class?创建 liferay portlet - 如何将数据从 Java 类传递给 view.jsp?
【发布时间】:2011-10-17 04:04:52
【问题描述】:

我正在尝试仅使用名为view.jsp 的JSP 文件在liferay 中创建portlet。我需要的是:

  1. 当 Portlet 加载时,我想调用自定义 Java 类来生成数组。

  2. 我需要将该数组传递给view.jsp

怎么做?

【问题讨论】:

  • 澄清一下,你是说view.jsp吗?并且你需要页面渲染后的值吗?如果是,为什么?
  • 是的,我的意思是 jsp。我想解析远程xml并将所有数据放入数组,然后将此数组传递给view.jsp。我只是不想在 jsp 本身中编写代码。我想使用java类。

标签: jsp liferay portlet


【解决方案1】:

您的问题很模糊,我建议您对 portlet 开发进行一些介绍,因为它似乎是关于对基础架构/规范的基本理解。

试图通过给出一些指示来回答你的问题 - 如果它们也太模糊,请道歉:

  • init() 是portlet 生命周期的一部分,将在portlet 类加载时调用一次。
  • 您可以通过(例如)在 doView() 中将请求属性添加到您的 RenderRequest 来将值传递给您的视图

当然,这取决于您使用的 portlet 框架 - 上面提到的方法来自底层 portlet 规范(即 JSR-286)

【讨论】:

    【解决方案2】:

    您是否使用 Liferay 的 create.sh 脚本创建了您的 portlet?在这种情况下,我们需要创建一个扩展 MVCPortlet 的新 portlet 类:

    public class ArrayPortlet extends MVCPortlet {
    
    }
    

    此外,您必须更改WEB-INF/portlet.xml 文件以指向其类。将下面的行替换为

     <portlet-class>com.liferay.util.bridges.mvc.MVCPortlet</portlet-class>
    

    通过命名您的 portlet 类:

    <portlet-class>br.com.seatecnologia.arrayportlet.ArrayPortlet</portlet-class>
    

    这只是设置。现在,最酷的部分:代码!您应该创建一个方法来处理 portlet 的视图。此方法应命名为doView(),并有两个参数:RenderRequestRendertResponse。此外,它会引发一些异常并将 portlet 呈现委托给超类方法:

    public void doView(RenderRequest renderRequest, RenderResponse renderResponse)
    throws IOException, PortletException {
        super.doView(renderRequest, renderResponse);
    }
    

    然而,在呈现 portlet 之前,我们创建了我们的数组:

    String[] array = new String[] { "foo", "bar", "baz" };
    

    并将其放入作为参数接收的RenderRequest。您应该为参数命名 - 在这种情况下,名称是 "my-array":

    renderRequest.setAttribute("my-array", array);
    

    这是我们的课程,完成:

    public class ArrayPortlet extends MVCPortlet {
        @Override
        public void doView(RenderRequest renderRequest, RenderResponse renderResponse)
        throws IOException, PortletException {
            String[] array = new String[] { "foo", "bar", "baz" };
            renderRequest.setAttribute("my-array", array);
            super.doView(renderRequest, renderResponse);
        }
    }
    

    我们通过RenderRequest 对象将值传递给JSP。现在,在 JSP 中,我们应该“导入”RenderRequest 实例(以及其他对象),将 &lt;portlet:defineObjects /&gt; 标记添加到 JSP 的开头。在此之后,我们可以通过其名称从renderRequest 对象中获取任何属性。请注意,getAttribute() 方法返回 Object,因此您应该将其返回值转换为正确的类型:

    <portlet:defineObjects />
    <%
    String[] anArrayFromMyPortlet = (String[])renderRequest.getAttribute("my-array");
    %>
    

    现在,您可以随意使用检索到的对象:

    <ul>
    <% for (String string : anArrayFromMyPortlet) { %>
    <li><%= string %></li>
    <% } %>
    </ul>
    

    这是我机器上这段代码的结果:

    【讨论】:

    • 谢谢。这就是我需要的!
    • 使用 JSTL Core 或 Core RT taglibs 将为您的 JSP 页面提供更优雅的解决方案。
    • 这是我在任何主题中见过的最好的liferay教程。他们应该聘请您编写文档、教程、文章、维基、演示、书籍和所有内容。
    • @Nenotlep 令人印象深刻的是,他们的文档对于刚接触 portlet 的人来说是多么糟糕。 100% 同意
    【解决方案3】:

    您可以通过多种方式做到这一点:

    1) 你可以使用renderRequest.setAttribute("my-array", array);

    2) 您可以将数据放入会话中

    request.getPortletSession().setAttribute("my-array", array);

    在第二种情况下,当您不再需要它时,不要忘记从会话中删除您的元素。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-13
      • 1970-01-01
      • 2023-03-27
      • 2019-11-18
      • 1970-01-01
      • 2014-05-25
      • 2014-11-17
      • 1970-01-01
      相关资源
      最近更新 更多