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

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

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

    Junky's IT Notebook

    統(tǒng)計

    留言簿(8)

    積分與排名

    WebSphere Studio

    閱讀排行榜

    評論排行榜

    liferay portlet配置文件介紹

    關(guān)鍵字:   liferay 配置文件    

    portlet.xml

    portlet定義描述文件,它描述portlet的類型,支持Mode, preferenes和role等,遵循JSR168標(biāo)準(zhǔn)實現(xiàn),以便于移植(需要針對性的做一些小改過)。

    下面是一個簡單的定義:

     〈portlet〉
      〈portlet-name〉2〈/portlet-name〉
      〈display-name〉My Account〈/display-name〉
      〈!-- portlet的實現(xiàn)類 --〉
      〈portlet-class〉com.liferay.portlet.StrutsPortlet〈/portlet-class〉
      〈init-param〉
       〈name〉view-action〈/name〉
       〈value〉/my_account/view〈/value〉
      〈/init-param〉
      〈expiration-cache〉0〈/expiration-cache〉
      〈supports〉
       〈mime-type〉text/html〈/mime-type〉
      〈/supports〉
      〈resource-bundle〉com.liferay.portlet.StrutsResourceBundle〈/resource-bundle〉
     〈/portlet〉

    在JSR168標(biāo)準(zhǔn)中,定義了view/edit/help三種模式,
    liferay對其進行了擴展,增加了config/about/preview/print等模式。

    liferay-portlet.xml

    liferay的portlet定義描述文件,是liferay對portlet.xml的擴展描述,允許我們對portlet的呈現(xiàn)、功能和行為進行更深入的定制。
    它與com.liferay.portal.model.Portlet類對應(yīng),

    下面是一個較為詳細(xì)的liferay-portlet定義:
     〈portlet〉
      〈portlet-name〉19〈/portlet-name〉
                    〈!-- struts路徑 --〉
      〈struts-path〉message_boards〈/struts-path〉
                    〈!-- 配置路徑 --〉
      〈configuration-path〉/message_boards/edit_configuration〈/configuration-path〉
                    〈!-- lucene索引類 --〉
      〈indexer-class〉com.liferay.portlet.messageboards.util.Indexer〈/indexer-class〉
                    〈!-- url處理類 --〉
      〈portlet-url-class〉com.liferay.portlet.messageboards.MBFriendlyPortletURL〈/portlet-url-class〉
                    〈!-- 友好url插件類 --〉
      〈friendly-url-plugin-class〉com.liferay.portlet.messageboards.MBFriendlyURLPortletPlugin〈/friendly-url-plugin-class〉               
      〈preferences-unique-per-layout〉false〈/preferences-unique-per-layout〉
      〈use-default-template〉false〈/use-default-template〉
      〈restore-current-view〉false〈/restore-current-view〉
      〈private-request-attributes〉false〈/private-request-attributes〉
     〈/portlet〉

    portlet類中常用的屬性:

    // strtus 路徑,對portlet的請求應(yīng)該限制在這個路徑下
    private String _strutsPath; 

    // 配置路徑,即action定義
    private String _configurationPath;

    // portlet實現(xiàn)類
    private String _portletClass;

    // lucene索引類
    private String _indexerClass;

    // scheduler類
    private String _schedulerClass;

    // portletURL處理類
    private String _portletURLClass;

    // friendURL插件
    private String _friendlyURLPluginClass;

    // 默認(rèn)的preferences
    private String _defaultPreferences;

    // preferences的驗證類
    private String _prefsValidator;

    // 是否實例化,為true時可添加多個portlet到layout上
    private boolean _instanceable;

    // 是否為系統(tǒng)portlet,
    private boolean _system;

    // 初始化參數(shù)
    private Map _initParams;

    // portlet支持的模式
    private Map _portletModes;

    // portlet支持的語言
    private Set _supportedLocales;

    // PortletInfo
    private PortletInfo _portletInfo;

    // 是否靜態(tài)portlet, 靜態(tài)portlet不能移動.
    private boolean _staticPortlet;

    // 是否為開始的靜態(tài)portlet.
    private boolean _staticPortletStart;

    portlet解析

     com.liferay.portal.service.impl.PortletLocalServiceImpl

     public void initEAR(String[] xmls) {
      String scpId = PortletServiceImpl.class.getName() + "." + _SHARED_KEY;

      Map portletsPool = (Map)SimpleCachePool.get(scpId);

      if (portletsPool == null) {
       portletsPool = CollectionFactory.getSyncHashMap();
       SimpleCachePool.put(scpId, portletsPool);
      }

      try {
       List servletURLPatterns = _readWebXML(xmls[4]);

       Set portletIds =
        _readPortletXML(xmls[0], portletsPool, servletURLPatterns);
       portletIds.addAll(
        _readPortletXML(xmls[1], portletsPool, servletURLPatterns));

       Set liferayPortletIds =
        _readLiferayPortletXML(xmls[2], portletsPool);
       liferayPortletIds.addAll(
        _readLiferayPortletXML(xmls[3], portletsPool));

       // Check for missing entries in liferay-portlet.xml
       // 檢查在liferay-portlet中丟失的portlet實體...

       // Remove portlets that should not be included
       // 移去不應(yīng)該包括的portlet實體...
      }
      catch (Exception e) {
       _log.error(StackTraceUtil.getStackTrace(e));
      }
     }

     // 解析portlet.xml
     private Set _readPortletXML(
       String servletContextName, String xml, Map portletsPool,
       List servletURLPatterns)
      throws DocumentException, IOException {

      Set portletIds = new HashSet();

      if (xml == null) {
       return portletIds;
      }

      SAXReader reader = SAXReaderFactory.getInstance();

      Document doc = reader.read(new StringReader(xml));

      Element root = doc.getRootElement();

      Set userAttributes = new HashSet();

      Iterator itr1 = root.elements("user-attribute").iterator();
      // 用戶屬性處理...

      itr1 = root.elements("portlet").iterator();

      while (itr1.hasNext()) {
       Element portlet = (Element)itr1.next();

       String portletId = portlet.elementText("portlet-name");

       if (servletContextName != null) {
        portletId =
         portletId + Portlet.WAR_SEPARATor + servletContextName;
       }

       portletId = PortalUtil.getJsSafePortletName(portletId);

       if (_log.isDebugEnabled()) {
        _log.debug("Reading portlet " + portletId);
       }

       portletIds.add(portletId);

       Portlet portletModel = (Portlet)portletsPool.get(portletId);

       if (portletModel == null) {
        portletModel = new Portlet(
         new PortletPK(portletId, _SHARED_KEY));

        portletsPool.put(portletId, portletModel);
       }

       if (servletContextName != null) {
        portletModel.setWARFile(true);
       }

       if (servletURLPatterns != null) {
        portletModel.setServletURLPatterns(servletURLPatterns);
       }

       portletModel.setPortletClass(portlet.elementText("portlet-class"));

       Iterator itr2 = portlet.elements("init-param").iterator();
       // 初始化參數(shù)處理...

       Element expirationCache = portlet.element("expiration-cache");
       // cache過期處理...

       itr2 = portlet.elements("supports").iterator();
       // 支持模式處理...

       Set supportedLocales = portletModel.getSupportedLocales();
         // 支持語言處理...

         // 資源
       portletModel.setResourceBundle(
        portlet.elementText("resource-bundle"));

       Element portletInfo = portlet.element("portlet-info");
         // portlet-info處理...

       Element portletPreferences = portlet.element("portlet-preferences");
       // preferences處理...

     
       Set unlikedRoles = portletModel.getUnlinkedRoles();
       itr2 = portlet.elements("security-role-ref").iterator();
       // role處理...

       portletModel.getUserAttributes().addAll(userAttributes);
      }

      return portletIds;
     }

     // 解析liferay-portlet.xml
     private Set _readLiferayPortletXML(
       String servletContextName, String xml, Map portletsPool)
      throws DocumentException, IOException {

      Set liferayPortletIds = new HashSet();

      if (xml == null) {
       return liferayPortletIds;
      }

      SAXReader reader = SAXReaderFactory.getInstance();

      Document doc = reader.read(new StringReader(xml));

      Element root = doc.getRootElement();

      Map roleMappers = new HashMap();

      Iterator itr1 = root.elements("role-mapper").iterator();
      // role-mapper處理...

      Map customUserAttributes = new HashMap();

      itr1 = root.elements("custom-user-attribute").iterator();
      // 定制用戶屬性處理...

      Map friendlyURLPlugins = _getFriendlyURLPlugins();

      itr1 = root.elements("portlet").iterator();

      while (itr1.hasNext()) {
       Element portlet = (Element)itr1.next();

       String portletId = portlet.elementText("portlet-name");

       if (servletContextName != null) {
        portletId =
         portletId + Portlet.WAR_SEPARATor + servletContextName;
       }

       portletId = PortalUtil.getJsSafePortletName(portletId);

       if (_log.isDebugEnabled()) {
        _log.debug("Reading portlet extension " + portletId);
       }

       liferayPortletIds.add(portletId);

       Portlet portletModel = (Portlet)portletsPool.get(portletId);

       if (portletModel != null) {
        // 設(shè)置portlet屬性...

        // 處理FriendURL插件
        portletModel.setFriendlyURLPluginClass(GetterUtil.getString(
         portlet.elementText("friendly-url-plugin-class"),
         portletModel.getFriendlyURLPluginClass()));

        if (Validator.isNull(
          portletModel.getFriendlyURLPluginClass())) {

         friendlyURLPlugins.remove(portletId);
        }
        else {
         friendlyURLPlugins.put(
          portletId, portletModel.getFriendlyURLPluginClass());
        }

        // 綁定role.
        portletModel.getRoleMappers().putAll(roleMappers);
        portletModel.linkRoles();

        portletModel.getCustomUserAttributes().putAll(
         customUserAttributes);
       }
      }

      return liferayPortletIds;
     }

    從上面的代碼可看出,liferay將portlet的描述定義存儲在一個Map中.

    liferay-display.xml

    portlet的類別定義文件,下面是一個簡單的例子:

     〈category name="category.admin"〉
      〈portlet id="9" /〉
      〈portlet id="40" /〉
      〈portlet id="79" /〉
      〈portlet id="80" /〉
     〈/category〉

    要注意的是,在portlet.xml/liferay-portlet.xml/liferay-display.xml三個文件中的portlet-name, portlet-id必須是一致的。

    liferay-layout-templates.xml

    layout模板定義文件.

    liferay-look-and-feel.xml

    主題定義文件.

    portlet的web.xml

    如果以war的方式發(fā)布portlet,那么它的web.xml也要進行一些特定的說明,

    下面是liferay中sample-jsp-portlet示例的web.xml:
    〈web-app〉
     〈display-name〉sample-jsp-portlet〈/display-name〉
     〈context-param〉
      〈param-name〉company_id〈/param-name〉
      〈param-value〉liferay.com〈/param-value〉
     〈/context-param〉
     〈listener〉
      〈listener-class〉com.liferay.portal.kernel.servlet.PortletContextListener〈/listener-class〉
     〈/listener〉
     〈servlet〉
      〈servlet-name〉sample_jsp_portlet〈/servlet-name〉
      〈servlet-class〉com.liferay.portal.kernel.servlet.PortletServlet〈/servlet-class〉
      〈init-param〉
       〈param-name〉portlet-class〈/param-name〉
       〈param-value〉com.sample.jsp.portlet.JSPPortlet〈/param-value〉
      〈/init-param〉
      〈load-on-startup〉0〈/load-on-startup〉
     〈/servlet〉
     〈servlet-mapping〉
      〈servlet-name〉sample_jsp_portlet〈/servlet-name〉
      〈url-pattern〉/sample_jsp_portlet/*〈/url-pattern〉
     〈/servlet-mapping〉
     〈taglib〉
      〈taglib-uri〉http://java.sun.com/portlet〈/taglib-uri〉
      〈taglib-location〉/WEB-INF/tld/liferay-portlet.tld〈/taglib-location〉
     〈/taglib〉
    〈/web-app〉
    上面的listener是必須的,它用于通知liferay進行熱部署,
    portlet-class指定Portlet的實現(xiàn)類,它必須遵循JSR168標(biāo)準(zhǔn),直接或間接的從javax.portlet.GenericPortlet繼承。

    相關(guān)文章:

  • liferay中的圖片處理
  • 使用liferay中的struts+tiles來開發(fā)portlet(一)
  • Liferay中外部war方式整合portlet的處理流程
  • liferay中l(wèi)ayout的處理
  • posted on 2007-05-31 14:09 junky 閱讀(2167) 評論(0)  編輯  收藏 所屬分類: portal

    主站蜘蛛池模板: 99爱免费观看视频在线| 国产在线一区二区综合免费视频| 亚洲精品无码久久久久YW| 亚洲成AV人片在WWW| 国产成人综合亚洲一区| a级毛片免费观看在线| 一个人免费视频观看在线www | 97在线免费视频| 最近免费中文字幕大全免费| 野花高清在线观看免费完整版中文| 日韩免费一区二区三区| 亚洲性在线看高清h片| 久久久久亚洲AV无码永不| 亚洲综合国产成人丁香五月激情| 鲁啊鲁在线视频免费播放| 亚在线观看免费视频入口| 成人免费无码大片A毛片抽搐| 国产a v无码专区亚洲av| 亚洲视频一区调教| 亚洲av乱码中文一区二区三区| 久久www免费人成看国产片| 91九色视频无限观看免费| 在线免费观看国产视频| 亚洲精品成人片在线播放| 亚洲人成高清在线播放| 香港一级毛片免费看| 国产精品免费AV片在线观看| 成人片黄网站A毛片免费| 亚洲天堂免费在线视频| 亚洲色成人网一二三区| 日韩亚洲翔田千里在线| 日韩电影免费观看| 永久中文字幕免费视频网站| 亚洲色成人网站WWW永久| 亚洲香蕉免费有线视频| 特级毛片aaaa级毛片免费| 99久久精品免费视频| 四虎永久免费网站免费观看| 91天堂素人精品系列全集亚洲| 亚洲av永久无码| 蜜桃AV无码免费看永久|