`
hustlong
  • 浏览: 124098 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Liferay中的配置文件

阅读更多
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 权限文件说明

    这一步骤是为了让系统能够读取到配置文件中的属性值,进而根据这些值进行后续的权限控制设置。 ```xml <param-name>portlet_properties <param-value>library-portlet.properties ``` 2. **配置语言和权限...

    Liferay5.1.2配置Oracle10G数据库操作说明书

    1. 确保 `system.properties` 文件中的 `user.country=US` 和 `user.language=en` 设置正确。 2. 使用最新版本的 Oracle JDBC 驱动 ojdbc14.jar 和 orai18n.jar。 完成以上步骤后,启动 Liferay 服务,通过运行 `/...

    liferay + cas + ldap 集成配置

    7. **配置文档**:提供的 "Liferay_cas.docx" 文件很可能是详细记录了整个集成过程的步骤和配置细节的文档,可能包含了如何安装和配置 CAS 服务器,如何在 Liferay 中配置 CAS 插件,以及如何配置 LDAP 连接器等内容...

    liferay开发文档.pdf

    配置文件包括portal.properties、portlet.properties、liferay.properties等。 * Liferay 配置文件的种类 + portal.properties + portlet.properties + liferay.properties * Liferay 配置文件的作用 + 管理...

    LIFERAY4.2.0版配置

    - **配置数据库连接**:在Liferay的`portal-ext.properties`配置文件中,指定MySQL数据库的连接信息,包括URL、用户名和密码。 - **数据库驱动**:确保你的项目包含MySQL JDBC驱动(如mysql-connector-java.jar)...

    liferay开发配置资料(全)

    这份"liferay开发配置资料(全)"压缩包包含了全面的Liferay开发和配置相关的资源,对于学习和掌握Liferay的使用、定制以及扩展非常有帮助。 首先,Liferay Portal的基础知识是必不可少的。Liferay Portal的核心...

    Liferay5.2.3和CAS配置成SSO

    - 数据库连接信息应妥善保管,不建议直接在配置文件中写明明文密码。 - 考虑使用更复杂的身份验证策略,如两步验证或多因素认证,以增加安全性。 完成上述步骤后,你将拥有一个使用Liferay 5.2.3和CAS 3.0.5实现...

    liferay+cas

    在 Liferay 与 CAS 集成的过程中,关键在于正确配置 CAS 服务器和 Liferay 的相关配置文件,确保两者之间的通信顺畅。通过这种方式,用户只需要一次登录即可访问所有集成的应用,提升了用户体验并强化了安全性。在...

    Liferay 6.0.5 portal.properties 配置文件详解

    在 Liferay 中,`portal.properties` 文件是一个至关重要的配置文件,它定义了系统的全局属性和行为。对于 Liferay 6.0.5 版本,理解并熟练掌握 `portal.properties` 文件的配置至关重要,因为它直接影响到平台的...

    Liferay 配置oracle DB的脚本

    新建Liferay的DB,然后将该文件导入该DB后,即可创建Liferay所需要的Table,并insert提供的初始值。

    liferay cas ldap 集成配置

    这涉及到在Liferay的`portal-ext.properties`文件中配置LDAP连接参数,如服务器地址、端口、用户名和密码,以及搜索和同步用户的配置。 - **LDAP配置**: - 配置 LDAP 连接信息,包括URL、端口、基础DN...

    liferay中文资源

    5. **开发工具**:例如Maven配置文件、Eclipse或IntelliJ IDEA插件、部署脚本等,简化开发和部署流程。 6. **插件或模块**:预编译好的Liferay插件或模块,可以直接导入到项目中使用,提高开发效率。 对于想要深入...

    在liferay中整合GWT,附例子

    在Liferay的`portlet.xml`配置文件中,指定WAR文件的路径,以便Liferay能够正确地部署和加载它。 6. **测试与调试**:在Liferay Portal上部署GWT应用,确保所有功能正常工作。GWT提供了强大的本地开发服务器,可以...

    Liferay应用安全配置手册

    根据给定的文件信息,以下是对"Liferay应用安全配置手册"相关知识点的详细解析: ### Liferay应用安全配置手册概览 #### 编写目的 该手册旨在为项目团队提供全面的指南,涵盖应用安全的基本配置流程,确保系统的...

    Liferay集群负载均衡配置

    在本篇文章中,我们将深入探讨如何进行Liferay集群的负载均衡配置。” 【标签】:“源码” - 暗示可能涉及到对Liferay核心代码的理解或定制;“工具” - 可能会介绍用于集群和负载均衡的相关工具。 【正文】: 在...

    liferay 整合struts例子

    3. **整合过程**:Liferay与Struts的整合涉及到配置多个文件,包括Liferay的部署描述符(liferay-plugin.xml)、Struts的配置文件(struts-config.xml)以及portlet的web.xml。在liferay-plugin.xml中声明portlet,...

    Liferay工作流简要配置

    【Liferay工作流简要配置】是关于Liferay Portal中集成的工作流引擎Kaleo的配置和使用介绍。Kaleo工作流系统提供了一种强大的工具,让用户能够自定义和管理复杂的业务流程,通过门户界面进行部署和监控。以下是详细...

    liferay详细讲解 liferay项目完全讲解

    Liferay是一款开源的企业级门户平台,它...通过上述文件和这些知识点的学习,我们可以全面掌握Liferay的使用和开发,无论你是新手还是经验丰富的开发者,都能从中受益匪浅,提升你在企业级门户解决方案中的专业能力。

Global site tag (gtag.js) - Google Analytics