一个Portlet可能需要创建引用该Portlet本身的URL。例如:当用户对一个引用Portlet的URL进行操作时(点击链接或提交表单),这种行为将针对Portlet的门户产生一个新的客户端请求。这些URLs被称为Portlet?URLs。?Portlet API定义了PortletURL与ResourceURL接口。?Portlet必须通过使用PortletURL或ResourceURL的对象来创建Portlet的URL。下面是PortletURL扩展了BaseURL的一些方法:
void write(java.io.Writer out, boolean escapeXML); void setWindowState (WindowState windowState); void setPortletMode (PortletMode portletMode); PortletMode getPortletMode (); WindowState getWindowState (); void removePublicRenderParameter(String name);
ResourceURL创建的链接,用户点击时,将导致ResourceServingPortlet接口的serveResource方法被调用。资源URL可以通过RenderResponse与ResourceResponse上的createResourceURL方法创建。例如:
?
ResourceURL URL= renderResponse.createResourceURL();
现在,您可以在URL上设置参数,方法就像你在portlet URL设置参数一样。您在serveResource方法调用时接收并使用这些参数。为了明确标识资源,您还可以在资源URL上设置一个额外的资源ID。如果您扩展了GenericPortlet,在serveResource方法调用中,你可以转发这个资源ID。此外,您还可以把你的资源的路径设置为ID。
?
url.setResourceID("WEB-INF/portlet-ext.xml");
在这种情况下,GenericPortlet自动分发到用户界面视图,通过包括portlet标记库,在界面文件中可以利用portlet的状态信息。
ResourceURL不能设置新的呈现参数,portlet模式,或窗口的状态。发生此限制,因为serveResource调用不生成一个完整的新的门户页面,但他们返回serveResource的响应。因此,门户页面不会有机会更新页面的其他部分,在那,这个信息可能被编码。此外,静态资源,如打包在portlet WAR文档包中的GIF?文件,一般应引用静态资源的网址,例如,response.encodeURL(request.getContextPath()+" /images/my-image.gif")。这是因为静态资源使用portlet的serveResource方法会造成不必要的性能开销。
?