<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    JAVA流通橋

    JAVA啟發者

    統計

    留言簿(3)

    AJAX相關網址

    Eclipse相關網址

    Hibernate

    java相關網址

    LINUX相關網址

    webwork相關網址

    友好鏈接

    閱讀排行榜

    評論排行榜

    Pluto初始化流程

    Pluto初始化流程

    關鍵字: ? Pluto Portal 門戶????


    一、初始化流程

    ? //Servlet初始化
    ? Pluto.PortalImpl.Servlet.init()

    ???? // ServiceManager初始化
    ???? ServiceManager.init()

    ??????? ConfigService.init()? // 配置服務

    ??????? LogService.init()? // 日志服務

    ??????? FactoryManagerService.init()? // 工廠管理器

    ??????? PortletDefinitionRegistryService.init()? // Portlet定義注冊表

    ??????? PortletEntityRegistryService.init()? // Portlet實體注冊表

    ??????? PageRegistryService.init() // Page注冊表

    ??????? //注,以上服務都讀取同名的properties配置文件.

    ???? // 初始化Portlet容器, 容器實現類在ConfigService.properties中指定
    ???? PortletContainerFactory.getPortletContainer().init()

    二、請求處理流程

    ? Pluto.PortalImpl.Servlet.doGet()

    ??? 1. 創建PortalEnvironment;

    ??? 2. 查找ActionWindow;

    ??? 2a. 如找到ActionWindow, 則為Action
    ??????????? 執行PortletContainer.processPortletAction();
    ??????????? 重定向輸出.

    ??? 2b. 找不到ActionWindow, 則為Render, 讀取Page定義。
    ??????????? RootFragment root = PageRegistry.getRootFragment();
    ??????????? root.service(servletRequest, servletResponse);

    ??? 3. 處理完畢;

    ? // 處理Fragment, RootFragment與Pageregistry.xml文件關聯, 后者定義了頁面的布局
    ? Pluto.portalImpl.Aggregation.RootFragment.service()

    ??? // 服務前置處理。
    ??? 1. preService(request, response);

    ??? // 包含與當前fragment同名的jsp文件,當前為RootFragment。
    ??? 2. RequestDispatcher rd = getServletConfig().getServletContext().
    ??????????????????????????????? getRequestDispatcher(BASE_ROOT+jspName);
    ?????? rd.include(request, response);

    ??? // 服務后置處理
    ??? 3. postService(request, response);

    ? // Pageregistry.xml
    ? 〈portal〉? // 對應RootFragment
    ??? 〈fragment name="navigation"
    ??????? class="org.apache.Pluto.portalImpl.aggregation.navigation.TabNavigation"〉
    ??? 〈/fragment〉

    ??? 〈fragment name="test" type="page"〉? // 對應PageFragment
    ??????? 〈navigation〉
    ??????????? 〈title〉Test〈/title〉
    ??????????? 〈description〉...〈/description〉
    ??????? 〈/navigation〉

    ??????? 〈fragment name="row" type="row"〉? // 對應RowFragment
    ??????????? 〈fragment name="col1" type="column"〉?? // 對應ColumnFragment
    ??????????????? 〈fragment name="p1" type="portlet"〉?? // 對應PortletFragment
    ??????????????????? 〈property name="portlet" value="3.1"/〉
    ??????????????? 〈/fragment〉
    ??????????????? 〈fragment name="p2" type="portlet"〉? // 對應PortletFragment
    ??????????????????? 〈property name="portlet" value="4.1"/〉
    ??????????????? 〈/fragment〉
    ??????????? 〈/fragment〉
    ??????? 〈/fragment〉
    ??? 〈/fragment〉
    ? 〈/portal〉

    ?? // 上面的層次結構十分清楚,其中fragment與Fragment的子類對應,上面的定義中包括RootFragment,
    ??????? PageFragment, RowFragment, ColumnFragment和PortletFragment,除了PortletFragment外,
    ??????? 其它Fragment的處理大致上是一樣的,
    ?? Iterator childIterator = fragment.getChildFragments().iterator();

    ?? // 遍歷子fragment, 并調用其服務方法。
    ?? while (childIterator.hasNext()) {
    ?????? Fragment subfragment = (Fragment)childIterator.next();
    ?????? if (subfragment instanceof AbstractNavigationFragment)
    ?????? {
    ?????????? subfragment.service(request, response);
    ?????????? break;
    ?????? }
    ? }

    三、Portal處理流程

    ? 先來看看Portlet的初始化, 主要是從配置文件中讀取Portlet定義。
    ? PortletFragment.init()

    ????? // 讀取Portlet的實體Id, 在pageregistry.xml中由portlet屬性指定.
    ????? String portletEntityId = getInitParameters().getString("portlet");

    ????? // 讀取Portlet實體. portlet實體在portletentityregistry.xml中定義.
    ????? PortletEntity portletEntity = PortletEntityRegistry.getPortletEntity(...);

    ????? // portletentityregistry.xml
    ????? 〈portlet-entity-registry〉
    ??????? 〈application id="3"〉? // 對應PortletApplicationEntity
    ?????????? 〈definition-id〉testsuite〈/definition-id〉
    ?????????? 〈portlet id="1"〉? // 對應PortletEntity
    ????????????? 〈definition-id〉testsuite.TestPortlet1〈/definition-id〉
    ????????????? 〈preferences〉
    ????????????????? 〈pref-name〉TestName4〈/pref-name〉
    ????????????????? 〈pref-value〉TestValue4〈/pref-value〉
    ????????????????? 〈read-only〉true〈/read-only〉
    ????????????? 〈/preferences〉
    ????????? 〈/portlet>
    ?????? 〈/application>
    ?????? 〈application id="4"〉
    ????????? 〈definition-id>testsuite〈/definition-id〉
    ????????? 〈portlet id="1"〉
    ????????????? 〈definition-id>testsuite.TestPortlet2〈/definition-id〉
    ????????????? 〈preferences〉
    ????????????????? 〈pref-name〉TestName4〈/pref-name〉
    ????????????????? 〈pref-value〉TestValue4〈/pref-value〉
    ????????????????? 〈read-only〉true〈/read-only〉
    ????????????? 〈/preferences〉
    ????????? 〈/portlet〉
    ?????? 〈/application〉
    ???? 〈/portlet-entity-registry〉
    ????? //要注意這里的applicationid和portletid與pageregistry中的portletid的對應關系。

    ? // Portlet服務
    ? PortletFragment.service()

    ????? //load protlet
    ????? PortletContainer.portletLoad(...)

    ??????? // 1.取得PortletDefinition, 從portletentityregistry中定義的application中讀取portlet定義.
    ??????? PortletDefinition def = portletWindow.getPortletEntity().getPortletDefinition();

    ??????? // portlet.xml
    ??????? 〈portlet-app〉?? // 對應PortletApplicationDefinition
    ?????????? 〈portlet〉???? // 對應PortletDefinition
    ????????????? 〈description〉TestSuiteDescription〈/description〉
    ????????????? 〈portlet-name〉TestPortlet1〈/portlet-name〉
    ????????????? 〈display-name〉Test Portlet #1〈/display-name〉

    ????????????? 〈portlet-class〉org.apache.Pluto.portalImpl.portlet.TestPortlet〈/portlet-class〉

    ????????????? 〈init-param>
    ????????????????? 〈name〉config〈/name〉
    ????????????????? 〈value〉/WEB-INF/testsuite-config.xml〈/value〉
    ????????????? 〈/init-param〉

    ????????????? 〈supports〉
    ????????????????? 〈mime-type〉text/html〈/mime-type〉
    ????????????????? 〈portlet-mode〉VIEW〈/portlet-mode〉
    ????????????????? 〈portlet-mode〉EDIT〈/portlet-mode〉
    ????????????????? 〈portlet-mode〉HELP〈/portlet-mode〉
    ????????????? 〈/supports〉

    ????????????? 〈portlet-info〉
    ??????????????????? 〈title〉Test Portlet #1〈/title〉
    ??????????????????? 〈short-title〉Test #1〈/short-title〉
    ??????????????????? 〈keywords〉Test,Testing〈/keywords〉
    ????????????? 〈/portlet-info>

    ????????????? 〈security-role-ref〉
    ????????????????? 〈role-name〉PlutoTestRole〈/role-name〉
    ????????????????? 〈role-link〉tomcat〈/role-link〉
    ????????????? 〈/security-role-ref〉
    ?????????? 〈/portlet〉
    ??????? 〈portlet-app〉

    ??????? // 2.取得PortletInvoker
    ??????? PortletInvoker invoker = PortletInvokerAccess.getPortletInvoker(def);

    ??????? // 3.執行load操作
    ??????? invoker.load(renderRequest, renderResponse)

    ????? // render Portlet
    ????? PortletContainer.renderPortlet(...);

    ??????? // 1. 取得PortletInvoker
    ??????? PortletInvoker invoker = PortletInvokerAccess.getPortletInvoker(...);

    ??????? // 2. 執行render操作。
    ??????? invoker.render(renderRequest, renderResponse);

    ????? // 處理Title, support modes,

    ? // Portlet調用.
    ? ProtletInvoker.invoke(...)

    ????? // 取得Portlet應用的dispatcher.
    ????? ServletDefinition servletDefinition = portletDefinition.getServletDefinition();
    ????? ServletContext servletContext = servletConfig.getServletContext();
    ????? RequestDispatcher dispatcher = servletDefinition.getRequestDispatcher(servletContext);

    ????? // 設置屬性, METHOD_ID為別對應load, render和action。
    ????? servletRequest.setAttribute(Constants.METHOD_ID, methodID);
    ????? servletRequest.setAttribute(Constants.PORTLET_REQUEST, portletRequest);
    ????? servletRequest.setAttribute(Constants.PORTLET_RESPONSE, portletResponse);

    ????? // 調用Portlet?
    ????? dispatcher.include(servletRequest, servletResponse);

    四、Portlet處理流程

    ? 在Portlet應用的web.xml中,定義了PortletServlet為Portlet的Servlet,它由dispatch方法統一進行請求處理.

    ? PortletServlet.dispatch(...)

    ???? // 設置portletConfig.
    ???? request.setAttribute(org.apache.Pluto.Constants.PORTLET_CONFIG, portletConfig);

    ???? Integer method_id = (Integer)request.getAttribute(Constants.METHOD_ID);
    ???? if (method_id == Constants.METHOD_RENDER)
    ???? {
    ???????? renderRequest = (RenderRequest)request.getAttribute(Constants.PORTLET_REQUEST);
    ???????? renderResponse = (RenderResponse)request.getAttribute(Constants.PORTLET_RESPONSE);

    ???????? // prepare container objects to run in this webModule
    ???????? prepareRenderRequest(renderRequest, request);
    ???????? prepareRenderResponse(renderResponse, request, response);

    ???????? portletClass.render(renderRequest,renderResponse);
    ???? }
    ???? else if (method_id==org.apache.Pluto.Constants.METHOD_ACTION)
    ???? {
    ???????? actionRequest = (ActionRequest)request.getAttribute(Constants.PORTLET_REQUEST);
    ???????? actionResponse = (ActionResponse)request.getAttribute(Constants.PORTLET_RESPONSE);

    ???????? // prepare container objects to run in this webModule
    ???????? prepareActionRequest(actionRequest, request);
    ???????? prepareActionResponse(actionResponse, request, response);

    ???????? portletClass.processAction(actionRequest,actionResponse);
    ???? }
    ???? else if (method_id == org.apache.Pluto.Constants.METHOD_NOOP)
    ???? {
    ???????? //nothing to do
    ???? }
    ???? //注: portletClass即為portlet的具體實現類。

    ???? 至此,請求就由portlet進行處理了。

    從上面的流程可以看出,Pluto就是將請求分派到頁面上的各個portlet,portlet根據method執行相應操作,

    最后由Pluto將它們處理的結果按特定布局進行顯示。

    posted on 2007-03-27 17:11 朱巖 閱讀(419) 評論(0)  編輯  收藏 所屬分類: Portal文章

    主站蜘蛛池模板: 亚洲精品456人成在线| 亚洲AV日韩AV天堂一区二区三区 | 丁香亚洲综合五月天婷婷| 亚洲av成人一区二区三区| 1000部啪啪毛片免费看| 亚洲精选在线观看| 久久久久成人精品免费播放动漫| 亚洲成在人线av| 久久久久久久99精品免费| 久久久久久久亚洲Av无码| 国产99视频精品免费专区| 亚洲av午夜福利精品一区| 日韩视频免费在线观看| 77777_亚洲午夜久久多人| 亚洲第一网站免费视频| 中文字幕在线观看亚洲视频| 成年丰满熟妇午夜免费视频| 亚洲av无码av在线播放| 亚洲成年看片在线观看| 全黄大全大色全免费大片| 久久久无码精品亚洲日韩蜜桃| 69式互添免费视频| 亚洲午夜理论片在线观看| 国产成人无码a区在线观看视频免费| 高潮毛片无遮挡高清免费视频| 久久亚洲色一区二区三区| 免费视频成人手机在线观看网址| 亚洲福利秒拍一区二区| 免费高清资源黄网站在线观看| 欧洲美女大片免费播放器视频 | 亚洲一区中文字幕久久| 亚洲免费综合色在线视频| 日本激情猛烈在线看免费观看| 亚洲日本一区二区三区在线| 99久9在线|免费| 亚洲精品无码成人| 亚洲va无码va在线va天堂| 免费中文熟妇在线影片| jizz在线免费观看| 亚洲一区二区三区免费在线观看| 免费播放特黄特色毛片|