我正在尝试仅使用名为view.jsp
的JSP文件在liferay中创建portlet。我需要的是:
当portlet加载时,我想调用我生成数组的自定义Java类。
我需要将该数组传递给view.jsp
。
怎么做?
答案 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()
,并有两个参数:RenderRequest
和RendertResponse
。此外,它抛出一些异常并将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>
这是我机器中此代码的结果:
答案 1 :(得分:3)
你的问题很模糊,我建议对portlet开发进行一些介绍,因为它似乎是对基础架构/规范的基本理解。
尝试通过提供一些指示来回答您的问题 - 如果它们也过于模糊而道歉:
当然这与您正在使用的portlet框架不同 - 上面提到的方法来自底层的portlet规范(即JSR-286)
答案 2 :(得分:2)
您可以通过多种方式执行此操作:
1)您可以使用renderRequest.setAttribute("my-array", array);
2)您可以将数据放入会话
request.getPortletSession().setAttribute("my-array", array);
在第二种情况下,不要忘记在不再需要时从会话中删除元素。