1 | publicvoid build( RequestContext context ){//取得requested page ContentPage page=context.getPage(); //取得 root fragment ContentFragment root = page.getRootContentFragment(); //aggregate及render各個PortletQ基本上render的結果都寫到context?/font> aggregateAndRender(root, context, page); //結果寫入response context.getResponse().getWriter().write(root.getRenderedContent()); } |
1 | protectedvoid aggregateAndRender( ContentFragment f, RequestContext context, ContentPage page ){ Iterator children = f.getContentFragments().iterator(); while (children.hasNext()){ ContentFragment child = (ContentFragment) children.next(); //遞迴 aggregateAndRender(child, context, page); }// 開始真正做render的動作,基本上render的結果都寫到context?/font> renderer.render(f, context); //renderer是org.apache.jetspeed.aggregator.impl.PortletRendererImpl//加上decoration addStyle(context, f.getDecorator(),ContentFragment.PORTLET); } |
1 request送至server後由JetspeedServlet(org.apache.jetspeed.JetspeedServlet)接收
2 JetspeedServlet透過Jetspeed(org.apache.jetspeed.Jetspeed)取得ComponentManagerQ然後透過ComponentManager取得RequestContextComponent(org.apache.jetspeed.request.JetspeedRequestContextComponent)
3 RequestContextComponent會針這個request建立一個RequestContext(org.apache.jetspeed.JetspeedRequestContext)Q並且讓這個request和新建的RequestContext能互相參?
4 呼叫Engine(org.apache.jetspeed.JetspeedEngine)的service()ҎQ這個方法會把剛剛徏立的RequestContext傛_Q這樣後面的元件才能?
5 在service()Ҏ中,Engine會依據request的目標URL來取得相應的Pipeline(org.apache.jetspeed.pipelineJetspeedPipeline)來處理。Pipeline使用了chain of responsibility的patternQ是׃堆Valve(org.apache.jetspeed.pipeline.valve.Valve)串v來的
6 各個Valve依序埯Q其中某些Valve會和Container動作Q某些Valve會負責產生要response的portal頁面。在這個過E中QContiner會執行相關的PortletQ並結果返回至PipelineQ也是Valve chain中?
7 產生的portal頁面傛_iuserQ流E結?/font>
1 | package sample; import java.io.IOException; import javax.portlet.ActionRequest; import javax.portlet.ActionResponse; import javax.portlet.GenericPortlet; import javax.portlet.PortletException; import javax.portlet.PortletRequestDispatcher; import javax.portlet.PortletSession; import javax.portlet.RenderRequest; import javax.portlet.RenderResponse; publicclass EchoPortlet extends GenericPortlet{protectedvoid doView(RenderRequest renderRequest, RenderResponse renderResponse)throws PortletException, IOException { renderResponse.setContentType("text/html"); String jspName = "/jsp/echo.jsp"; PortletRequestDispatcher rd = getPortletContext().getRequestDispatcher(jspName); rd.include(renderRequest, renderResponse); } /* (non-Javadoc) * @see javax.portlet.GenericPortlet#processAction(javax.portlet.ActionRequest, javax.portlet.ActionResponse) */publicvoid processAction(ActionRequest actionRequest, ActionResponse actionResponse) throws PortletException, IOException { PortletSession session=actionRequest.getPortletSession(); session.setAttribute("LAST_TYPED_STRING",actionRequest.getParameter("input")) ; }} |
1 | <%@ page language="java" session="true" import="javax.portlet.PortletSession"%> <%@ taglib uri='/WEB-INF/portlet.tld' prefix='portlet'%> <portlet:defineObjects/> <portlet:actionURL var="action" /> <p></p> <% PortletSession portletSession=renderRequest.getPortletSession(); String lastTypedString=(String)portletSession.getAttribute("LAST_TYPED_STRING"); if(lastTypedString!=null&&lastTypedString.length()>0){ %> The string you typed is:<b><%=lastTypedString%></b> <br/> <%}%> <form action="<%=action%>" method="post"> <input type="text" name="input" id="input" /> <input type="submit" value="submit" /> </form> <p></p> |
1 | <?xml version="1.0" encoding="UTF-8"?> <portlet-app id="sample"> <portlet id="EchoPortlet"> <portlet-name>Echo Portlet</portlet-name> <portlet-class>sample.EchoPortlet</portlet-class> <expiration-cache>30</expiration-cache> <supports> <mime-type>text/html</mime-type> <portlet-mode>view</portlet-mode> </supports> <supported-locale>en-US</supported-locale> <portlet-info> <title>EchoPortlet</title> <short-title>EchoPortlet</short-title> <keywords>EchoPortlet</keywords> </portlet-info> </portlet> </portlet-app> |
1 | <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <display-name>Sample</display-name> </web-app> |
1 | <?xml version="1.0" encoding="UTF-8"?> <page id="/Sample.psml" hidden="false" version=""> <title>Sample</title> <short-title>Sample</short-title> <defaults layout-decorator="tigris" portlet-decorator="tigris"/> <fragment id="P-1082c720c8c-10000" type="layout" name="jetspeed-layouts::VelocityTwoColumns"> <fragment id="28825252" type="portlet" name="sample::EchoPortlet"> <property layout="TwoColumns" name="row" value="0" /> <property layout="TwoColumns" name="column" value="0" /> </fragment> </fragment> </page> |
public void doView (RenderRequest request,
RenderResponse response) throws PortletException, IOException {
response.setContentType("text/html");
String jspName = getPortletConfig().getInitParameter("jspView");
PortletRequestDispatcher rd =
getPortletContext().getRequestDispatcher(jspName);
rd.include(request,response);
}
<%@ page session="false" %>
<%@ page import="javax.portlet.*"%>
<%@ page import="java.util.*"%>
<%@ taglib uri='/WEB-INF/tld/portlet.tld' prefix='portlet'%>
<portlet:defineObjects/>
Hello,<br>
I am the bookmark portlet.<br>
<br>
Current Portlet Mode: <%=portletRequest.getPortletMode()%><br>
Current Window State: <%=portletRequest.getWindowState()%><br>
<br>