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

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

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

    Terry.Li-彬

    虛其心,可解天下之問(wèn);專其心,可治天下之學(xué);靜其心,可悟天下之理;恒其心,可成天下之業(yè)。

      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      143 隨筆 :: 344 文章 :: 130 評(píng)論 :: 0 Trackbacks
     

    先前的文章提到/c/*的請(qǐng)求都是交給MainServlet處理的,現(xiàn)在分析對(duì)于不同的/c/*,例如/c/layout或者/c/update_layout等請(qǐng)求是怎么傳遞到不同的action去的呢。

    下面以顯示 Add Content 為例進(jìn)行分析,Add Content 窗口其實(shí)是一個(gè)在 portlet-custom.xml 中定義的名為87的portlet。點(diǎn)擊Add Content鏈接會(huì)產(chǎn)生一個(gè)Reqest,開始整個(gè)處理的流程。

    1. Request的生成。

    當(dāng)時(shí)頁(yè)面的源文件中有關(guān)的代碼為:
    <li class="add-content">
    <a href="javascript: void(0);" onclick="LayoutConfiguration.toggle('10102', '87', '');">Add Content</a>
    </li>

    點(diǎn)擊add content調(diào)用的是LayoutConfiguration.toogle()。

    layout_configuratioin.js
    var LayoutConfiguration = {
      toggle : function (plid, ppid, doAsUserId) {
      var url = themeDisplay.getPathMain() + "/portal/render_portlet?p_l_id=" + plid + "&p_p_id=" +ppid + "&doAsUserId=" + doAsUserId + "&p_p_state=exclusive";
      AjaxUtil.update(url, popup, {onComplete: function(){
                   LayoutConfiguration.init();
                   Liferay.Util.addInputType();
                   Liferay.Util.addInputFocus();}
      });};
      /*總之是會(huì)生成一個(gè)Ajax請(qǐng)求發(fā)送到服務(wù)器,過(guò)程以后可以分析 */

    用Wireshark捕捉到的Request數(shù)據(jù)如下,知道請(qǐng)求中含有/c/portal/render_portlet字段,那自然會(huì)送入 MainServlet處理了。

    2. MainServlet.service()

    /* 這里是Request首先到達(dá)的地方*/

    ServletContext ctx = getServletContext();
    req.setAttribute(WebKeys.CTX, ctx);
    PortletRequestProcessor portletReqProcessor = PortletRequestProcessor.getInstance(this, moduleConfig);
    ctx.setAttribute(WebKeys.PORTLET_STRUTS_PROCESSOR, portletReqProcessor);
    callParentService(req, res);
    /* 調(diào)用ActionServlet.service(),由于在ActionServlet中沒(méi)有覆蓋service方法,所以 MainServlet 的super.service() 追溯到HttpServlet 的service方法 */

    3. HttpServlet.service()

    if (method.equals(METHOD_GET)) { ,,,
    } else if (method.equals(METHOD_POST)) {
      doPost(req, resp);
    } else if (method.equals(METHOD_PUT)) {
      doPut(req, resp); 
    } else if (method.equals(METHOD_DELETE)) {
      doDelete(req, resp);
    } else if (method.equals(METHOD_OPTIONS)) {
      doOptions(req,resp);
    } else if (method.equals(METHOD_TRACE)) {
      doTrace(req,resp);
    }

    /* 在 service 中,根據(jù)http的類型,分別調(diào)用 doPost, doGet, doPut, ...,由于ActionServlet中實(shí)現(xiàn)了doPost等方法,所以MainServlet.service()方法會(huì)傳遞到 ActionServlet中的doPost等方法。*/

    4. ActionServlet.doPost()

    process(request, response);

    /* 在另外ActionServlet的不同方法中,例如doGet(),doPut(),都調(diào)用了process()方法。*/


    5. ActionServlet.process()

    ModuleConfig config = getModuleConfig(request);
    RequestProcessor processor = getProcessorForModule(config);
    if (processor == null) {
      processor = getRequestProcessor(config);
    }
    processor.process(request, response);

    /* 最終傳遞到對(duì)應(yīng)的Request Processor 的process()方法中去,也就是PortalRequestProcessor.process() */


    6. PortalRequestProcessor.process()

    public void process(HttpServletRequest req, HttpServletResponse res)
      throws IOException, ServletException {
      String path = super.processPath(req, res); //path = “/portal/render_portlet”
      ActionMapping mapping = (ActionMapping)moduleConfig.findActionconfig(path);
      super.process(req, res);
      /*由于TilesRequestProcessor中沒(méi)有定義process()方法,所以調(diào)用 RequestProcessor.process() */
    }


    7. RequestProcessor.process()

    public void process(HttpServletRequest request, HttpServletResponse response)
      throws IOException, ServletException {

      String path = processPath(request, response);
      //這里path = “/portal/render_portlet”.

      ActionMapping mapping = processMapping(request, response, path);
      //這里找到在struts-config.xml中定義的關(guān)于上面path的mapping.

      Action action = processActionCreate(request, response, mapping);
      //這里生成了RenderPortletAction.

      ActionForward forward = processActionPerform(request, response, action, form, mapping);

      processForwardConfig(request, response, forward);
    }

    至此,每個(gè)由 MainServlet 傳遞來(lái)的 Request 都能到達(dá)對(duì)應(yīng)的 Action,例如 LayoutAction,RenderPortletAction,UpdateLayoutAction,由這些 Action 最終完成 Layout 和 Portlet 的呈現(xiàn)。這里對(duì)應(yīng)的action是RenderPortletAction(由下面的struts-config.xml中定義)。

    下面以RenderPortletAction為例說(shuō)明進(jìn)一步的action過(guò)程。在struts-config.xml這個(gè)文件中定義了action class, forward path。

    <action path="/portal/layout" type="com.liferay.portal.action.LayoutAction">
      <forward name="portal.layout" path="portal.layout" />
    </action>

    <action path="/portal/update_layout" type="com.liferay.portal.action.UpdateLayoutAction" />

    <action path=“/portal/render_portlet” type=“com.liferay.portal.action.RenderPortletAction”>
      <forward name=“/portal/render_portlet” path=“/portal/render_portlet.jsp”/>
    </action>
    <!-- 這里定義了由RenderPortletAction來(lái)處理”/portal/render_portlet”,而且最后要forward到” /portal/render_portlet.jsp”。所以最后會(huì)把render_portlet.jsp包含到response的頁(yè)面當(dāng)中-- >

    那render_portlet.jsp又是如何實(shí)現(xiàn)最終把a(bǔ)dd content這個(gè)portlet顯示出來(lái)的呢,下回接著分析。


     

    Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=2177383

    posted on 2008-03-14 14:12 禮物 閱讀(1171) 評(píng)論(0)  編輯  收藏 所屬分類: Liferay
    主站蜘蛛池模板: 国产在线观看免费av站| 色费女人18女人毛片免费视频 | 国产成人麻豆亚洲综合无码精品| 中文字幕亚洲天堂| 亚洲日本中文字幕| 国产日本亚洲一区二区三区| 丰满亚洲大尺度无码无码专线| yellow免费网站| 99ee6热久久免费精品6| 成年女人男人免费视频播放| 亚洲欧洲中文日韩av乱码| 久久久久亚洲AV成人无码网站 | 亚洲处破女AV日韩精品| 亚洲午夜在线一区| 最新亚洲人成无码网www电影| 抽搐一进一出gif免费视频| 24小时在线免费视频| 日韩激情淫片免费看| 亚洲午夜久久久久久久久电影网| 亚洲国语在线视频手机在线| 久久精品熟女亚洲av麻豆| 日本不卡免费新一区二区三区| 久久精品免费一区二区喷潮| 亚洲综合区小说区激情区| 亚洲精品视频在线观看免费| 色窝窝亚洲AV网在线观看| 国产精品网站在线观看免费传媒| av大片在线无码免费| 亚洲综合色成在线播放| 亚洲videos| 中文字幕免费观看视频| 免费无码精品黄AV电影| 在线亚洲97se亚洲综合在线| 亚洲人成77777在线观看网| 精品免费久久久久国产一区| 我们的2018在线观看免费高清| 久久久久国产亚洲AV麻豆| 77777午夜亚洲| 免费日本一区二区| 四虎永久在线精品视频免费观看| 久久久无码精品亚洲日韩按摩 |