`
billy_zh
  • 浏览: 61750 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

liferay portlet配置文件介绍

阅读更多

portlet.xml

portlet定义描述文件,它描述portlet的类型,支持Mode, preferenes和role等,遵循JSR168标准实现,以便于移植(需要针对性的做一些小改过)。

下面是一个简单的定义:

 〈portlet〉
  〈portlet-name〉2〈/portlet-name〉
  〈display-name〉My Account〈/display-name〉
  〈!-- portlet的实现类 --〉
  〈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标准中,定义了view/edit/help三种模式,
liferay对其进行了扩展,增加了config/about/preview/print等模式。

liferay-portlet.xml

liferay的portlet定义描述文件,是liferay对portlet.xml的扩展描述,允许我们对portlet的呈现、功能和行为进行更深入的定制。
它与com.liferay.portal.model.Portlet类对应,

下面是一个较为详细的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的请求应该限制在这个路径下
private String _strutsPath; 

// 配置路径,即action定义
private String _configurationPath;

// portlet实现类
private String _portletClass;

// lucene索引类
private String _indexerClass;

// scheduler类
private String _schedulerClass;

// portletURL处理类
private String _portletURLClass;

// friendURL插件
private String _friendlyURLPluginClass;

// 默认的preferences
private String _defaultPreferences;

// preferences的验证类
private String _prefsValidator;

// 是否实例化,为true时可添加多个portlet到layout上
private boolean _instanceable;

// 是否为系统portlet,
private boolean _system;

// 初始化参数
private Map _initParams;

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

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

// PortletInfo
private PortletInfo _portletInfo;

// 是否静态portlet, 静态portlet不能移动.
private boolean _staticPortlet;

// 是否为开始的静态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
   // 移去不应该包括的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();
   // 初始化参数处理...

   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) {
    // 设置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的方式发布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的实现类,它必须遵循JSR168标准,直接或间接的从javax.portlet.GenericPortlet继承。

相关文章:

  • liferay中的图片处理
  • 使用liferay中的struts+tiles来开发portlet(一)
  • Liferay中外部war方式整合portlet的处理流程
  • liferay中layout的处理
  • 分享到:
    评论
    3 楼 coral0212 2007-06-19  
    那是当然不能用了
    2 楼 lingran 2007-03-21  
    初来乍到,向各位高手请教一个问题,怎样把新的portlet直接放到liferay原有的portlet列表里?(不用auto deploy)
    我参考的是liferay二次开发指南,用官网上给的sample-dao-portlet作例子

    我在liferay的webapps\ROOT\html\portlet下新建文件夹sample-dao-portlet-4.1.2,然后把sample-dao-portlet-4.1.2.war里的view.jsp和error.jsp复制过去
          我把sample-dao-portlet-4.1.2.war里classes里的com文件夹和connection-pool.properties复制到webapps\ROOT\WEB-INF\classes下面
          在webapps\ROOT\WEB-INF\web.xml里新增:
       <servlet>
    <servlet-name>sample_dao_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.dao.portlet.DAOPortlet</param-value>
    </init-param>
    <load-on-startup>0</load-on-startup>
    </servlet>
    <servlet-mapping>
    <servlet-name>sample_dao_portlet</servlet-name>
    <url-pattern>/sample_dao_portlet/*</url-pattern>
    </servlet-mapping>

         在webapps\ROOT\WEB-INF\portlet.xml里新增:
    <portlet>
    <portlet-name>sample_dao_portlet</portlet-name>
    <display-name>Sample DAO Portlet</display-name>
    <portlet-class>com.sample.dao.portlet.DAOPortlet</portlet-class>
    <expiration-cache>0</expiration-cache>
    <supports>
    <mime-type>text/html</mime-type>
    </supports>
    <portlet-info>
    <title>Sample DAO Portlet</title>
    <short-title>Sample DAO Portlet</short-title>
    <keywords>Sample DAO Portlet</keywords>
    </portlet-info>
    <security-role-ref>
    <role-name>administrator</role-name>
    </security-role-ref>
    <security-role-ref>
    <role-name>guest</role-name>
    </security-role-ref>
    <security-role-ref>
    <role-name>power-user</role-name>
    </security-role-ref>
    <security-role-ref>
    <role-name>user</role-name>
    </security-role-ref>
    </portlet>
      
        在webapps\ROOT\WEB-INF\liferay-portlet.xml里新增:
    <portlet>
    <portlet-name>sample_dao_portlet</portlet-name>
    <instanceable>false</instanceable>
    </portlet>

        在webapps\ROOT\WEB-INF\liferay-display.xml里新增:
    <category name="category.test">
    <portlet id="sample_dao_portlet" />
    </category>

       结果是,我在add content里能看到这个portlet,我新增以后,只出来的标题“Sample DAO Portlet”,然后我看tomcat的后台提示,是这样的:INFO [DAOPortlet:58] Initializing portlet
       这是什么意思?我是有哪步作的不对吗?
    1 楼 pikachu 2006-12-25  
    谢谢张老三同学的发言。从此结束了Pikachu 一人独角戏的尴尬局面

    下面谁再继续呢?

    相关推荐

      liferay portlet 开发实例

      本文将基于提供的文件信息,深入解析Liferay Portlet开发的核心概念、流程及实践示例。 ### Liferay Portlet开发概览 Liferay Portlet开发主要涉及以下几个关键目录:`portalext-impl\src`, `ext-service\src`,...

      Liferay portlet 工程示例代码

      一旦portlet开发完成,可以通过部署war文件到Liferay Server来发布portlet。Liferay会自动识别并安装portlet。 7. **Liferay Service Builder** 用于创建和操作Liferay的数据模型,自动生成服务接口、实现、DAO和...

      liferay portlet demo

      7. **portlet配置**:portlet.xml文件是portlet的主要配置文件,定义portlet的行为、显示选项、MVC控制器等。 8. **部署与调试**:在Liferay环境下部署portlet,学习如何在控制台注册portlet,以及如何通过日志和...

      liferay portlet 站内消息组件

      在Liferay Portal环境中,portlet是构建用户界面的基本模块,它提供了与用户交互的功能。"Liferay Portlet 站内...通过message-portlet这个压缩包,我们可以期待找到所有实现这些功能的源代码、配置文件和其他资源。

      liferay portlet开发参考手册

      此外,还会讨论Portlet的配置文件,如portlet.xml,以及如何通过它来定义Portlet的行为和属性。 开发Portlet时,理解MVC模式至关重要。书中会深入解析Liferay中的MVCPortlet,包括Controller、Model、View和...

      liferay portlet开发

      Liferay Portlet开发中涉及到的关键配置文件主要有两个:`Portlet.xml` 和 `liferay-portlet.xml`。 - **Portlet.xml**:此文件定义了Portlet的基本属性,包括其名称、版本、依赖等信息。该文件遵循JSR 286标准,...

      liferay portlet

      liferay-portlet.xml文件则更专注于Liferay特定的配置,例如默认用户组、portlet是否支持多个实例、portlet的显示设置以及权限控制。它允许开发者指定portlet在Liferay环境中的具体行为和可见性。 liferay-display....

      Liferay-Portlet-SDK5.2.3.rar_liferay_liferay sdk_portlet

      - **Portlet配置**:portlet可以通过portlet首选项允许用户个性化设置。 **总结** Liferay Portlet SDK 5.2.3是一个强大的工具集,为开发者提供了构建Liferay Portal平台上的portlet应用所需的一切。通过学习和使用...

      用struts1.X实现liferay portlet插件(HelloWorld)

      6. **配置文件**:struts-config.xml和portlet.xml是两个重要的配置文件。前者定义了Struts1的动作映射,后者描述了portlet的元数据,如portlet名称、显示模式等。 7. **部署和测试**:完成开发后,portlet需要打包...

      liferay_portlet对象详解

      - EDIT:编辑模式,允许用户修改 Portlet 的配置或设置。 - HELP:帮助模式,显示与 Portlet 功能相关的帮助信息。 开发者可以根据需求扩展这些模式,创建自定义的 Portlet 模式。 3. 窗口状态(Window States)...

      liferay-portlet-development

      《Liferay Portlet 开发——全面指南》:深入解析与实战技巧 本书旨在为开发者提供一份详尽的Liferay Portlet开发指南,涵盖从基础知识到实际应用的全面内容。Liferay是一款开源的企业级门户平台,它支持高度定制化...

      liferay-portlet-development-guide-4.3

      4. **Portlet部署**:学习如何打包和部署portlet到Liferay Portal服务器,包括portlet.xml配置文件的编写和portlet JAR包的构建。 5. **Portlet渲染**:理解portlet的视图渲染机制,包括JSP、FreeMarker或Velocity...

      liferay一个简单的portlet

      在Liferay中,Portlet可以通过Java API和XML配置文件来定义其行为和外观。Portlets可以是任何类型的Web应用,如新闻显示、日历、论坛等,它们能够独立工作,也可以与其他Portlets协同。 创建Liferay Portlet的过程...

      liferay-spring-portlet

      8. **portlet配置**:portlet的配置通常涉及portlet.xml文件,其中包含了portlet的元数据、安全设置和MVC端点定义等。 通过深入学习和理解这个项目,开发者可以掌握如何在Liferay中创建和部署Spring Portlet,了解...

      liferay开发文档.pdf

      Liferay 配置文件介绍 Liferay 的配置文件是portal平台的核心组件,负责管理portal的各个方面。配置文件包括portal.properties、portlet.properties、liferay.properties等。 * Liferay 配置文件的种类 + portal....

      liferay开发配置资料(全)

      portlet配置通常在portlet部署后通过portlet实例进行。 开发Liferay应用时,需要熟悉Java和JSF(JavaServer Faces)、Portlet API、MVCPortlet等技术。Liferay提供了Service Builder工具,帮助开发者自定义服务,...

      liferay 使用struts2 开发portlet

      - 在`Struts2Study-portlet/docroot/WEB-INF/src`目录下创建`struts.xml`配置文件。该文件定义了Portlet的行为,如以下示例所示: ```xml &lt;!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD ...

      liferay_使用struts2开发portlet

      本文将详细介绍如何在Liferay环境下搭建基于Struts2的Portlet开发环境,并通过实例演示具体的开发过程。 #### 二、准备工作 1. **开发工具与资源准备** - **Eclipse Liferay IDE**: 下载并安装`eclipse_Liferay_...

      liferay的那些东西

      通过研究这些文件,你可以深入了解Liferay Portlet的开发流程,包括构建环境的设置、portlet的基本结构、配置文件的解析以及Liferay的内部运作机制。这将有助于你提升在Liferay平台上的开发技能,更好地满足项目需求...

      liferay 权限文件说明

      ### Liferay权限文件说明 #### 一、概述 在Liferay平台中,权限管理是非常重要的一个环节,它确保了系统的安全性和数据的访问...同时,了解这些配置文件的具体含义也有助于更好地维护和扩展现有的Liferay应用程序。

    Global site tag (gtag.js) - Google Analytics