页面流动作
当一个链接被点击时,提供一个将要执行的指定动作是portlet程序开发者的职责。这个动作能够访问通过请求属性惟一识别内容的ID。它被放置在请求中,如事件处理程序一节中代码示例第22行所示。请求中的ID的属性名称在portlet元数据中进行设置,见Portlet配置一节。
在GroupSpace应用程序中,这个动作包含基于惟一ID从底层内容管理系统中获得特定内容信息所需的逻辑。然后转交给显示关于此内容详细信息的JSP页面。
JSP标记
本框架的最后一部分内容是JSP标记。这种标记让用户能够很容易地在portlet中创建各种JSP页面上的链接。这种标记由两个文件组成:一个JSP2.0 .tag文件,以及一个作为单独的helper类的Java类文件。这个helper类在构建URL时把逻辑分离出来,从而使它可以很容易地在JSP标记外部进行访问。
下面是.tag文件的代码:
<%@ tag import="com.bea.apps.groupspace.taglib.content.ContentDetailsLinkHelper"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%> <%@ attribute name="contentId" type="java.lang.String" required="true"%> <%@ attribute name="contentType" type="java.lang.String" required="true"%> <%@ attribute name="target" type="java.lang.String" required="false"%> <%@ attribute name="replacePath" type="java.lang.String" required="false"%> <fmt:bundle basename="com.bea.apps.groupspace.Common"> <fmt:message key="gsLink_baseMessage" var="gsLink_baseMessage"/> </fmt:bundle> <% String contentId = (String) pageContext.getAttribute("contentId"); String contentType = (String) pageContext.getAttribute("contentType"); String target = (String) pageContext.getAttribute("target"); String replacePath = (String )pageContext.getAttribute("replacePath"); ContentDetailsLinkHelper helper = new ContentDetailsLinkHelper(request, response, contentId, contentType, target, replacePath, null); %> <script type="text/javascript"> var gsLink_detailsEventHandled = <%=request.getAttribute("gsLink_detailsEventHandled")%>; if (gsLink_detailsEventHandled == false) { gsLink_linkNotHandledMessage = "${gsLink_baseMessage}"; } </script> <% if (ContentDetailsLinkHelper.TARGET_OPENER.equals(target)) { %> <a href="#" onclick='javascript:window.opener.location.href="<%=helper.getHref()%>"; return false;'><jsp:doBody/></a> <% } else { %> <a href="<%=helper.getHref()%>"><jsp:doBody/></a> <% } %>
这个标记共有四个属性,但只有两个是必需的。只有内容ID和内容类型是必需的属性。如果要让URL在一个特定的目标窗口中打开,也可以包括一个可选的“target“属性。“replacePath”属性允许用户替换生成的URL中的路径部分。
第10至12行设置了一条消息,当没有发现任何portlet可以处理内容类型时,就会显示这条消息。这在第25行至第31行的JavaScript中进行处理。
第20行指派helper类来生成URL。最后,第32行至第41行用于生成链接的HTML输出。
下面是helper类的代码:
public ContentDetailsLinkHelper(HttpServletRequest request, HttpServletResponse response, String contentId, String contentType, String target, String replacePath, String linkText) { try { AsyncContentContext.push(request).setAsyncContentDisabled(true); this.contentId = contentId; this.contentType = contentType; this.target = target; this.replacePath = replacePath; this.linkText = linkText; PagePresentationContext context = PagePresentationContext.getPagePresentationContext(request); PortletPresentationContext portletContext = PortletPresentationContext.getPortletPresentationContext(request); PostbackURL contentDetailsLink_url = PostbackURL.createPostbackURL(request, response); contentDetailsLink_url.addParameter("gsLink_linkClicked", "true"); contentDetailsLink_url.addParameter("gsLink_contentType", contentType); contentDetailsLink_url.addParameter("gsLink_contentId", contentId); if (context != null && context.getInstanceId() != null) { contentDetailsLink_url.addParameter("gsLink_currentPageId", context.getInstanceId()); } if (portletContext != null && portletContext.getInstanceId() != null) { contentDetailsLink_url.addParameter("gsLink_currentPortletId", portletContext.getInstanceId()); } if (replacePath != null) { contentDetailsLink_url.setPath(replacePath); } href = contentDetailsLink_url.toString(); } finally { AsyncContentContext.pop(request); } } public String getHref() { return href; }
这个类的构造方法用于处理创建URL的逻辑。如果请求是从使用该配置的portlet生成的,则第10行禁用async内容。这一点十分重要,因为链接框架依赖于IPC。这些URL必须作为完整门户请求而产生,这样IPC才能够执行。
POstbackURL 类用于生成基本URL。第23行至第40行添加所有必要的参数到请求中。如果提供了“replacePath”参数,则所生成的URL的路径在第43行代码将被替换。
最后,HTML锚标记的href被创建,并通过getHref属性公开。