创建liferay portlet - 如何将数据从Java类传递给view.jsp?

时间:2011-08-01 03:55:42

标签: jsp liferay portlet

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

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

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

  3. 怎么做?

3 个答案:

答案 0 :(得分:39)

您是否使用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实例(以及其他对象),将<portlet:defineObjects />标记添加到JSP的开头。在此之后,我们可以通过其名称从renderRequest对象获取任何属性。请注意,方法getAttribute()返回Object,因此您应将其返回值强制转换为正确的类型:

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

现在,您只需按照自己的意愿使用检索到的对象:

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

这是我机器中此代码的结果:

enter image description here

答案 1 :(得分:3)

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

尝试通过提供一些指示来回答您的问题 - 如果它们也过于模糊而道歉:

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

当然这与您正在使用的portlet框架不同 - 上面提到的方法来自底层的portlet规范(即JSR-286)

答案 2 :(得分:2)

您可以通过多种方式执行此操作:

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

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

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

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