首先有几个概念需要明确。
1、第一个概念是这里的应用程序配置不是写XML之类的配置文件,是类似字典的类型化配置
这意味着应用程序配置不只是一个字符串键值对的列表。值还可以有类型,如整数列表,字符串列表,一个网址,甚至可以使用自己的自定义类型。

2、第二个概念是模块性。在Liferay 7 中,应用程序是模块化的,组件只是一个有@组件注释的类,通常是一组属性提供元数据。

3、第三个概念是在不同的范围内具有相同的应用程序的能力有不同的配置。如果您的应用程序需要在不同的范围支持不同的配置,应用程序作用范围可以有:

  • System: 所有的应用程序范围;
  • Virtual Instance: 虚拟实例级别;
  • Site: 站点级别,即每个站点不同的配置;
  • Portlet Instance: Portlet实例级别,即每个Portlet实例都有不同配置;

实例

编写应用程序配置接口

  1. package com.liferay.docs.exampleconfig;
  2.  
  3. import aQute.bnd.annotation.metatype.Meta;
  4.  
  5. @Meta.OCD(id = "com.liferay.docs.exampleconfig.ExampleConfiguration")
  6. public interface ExampleConfiguration {
  7.  
  8. @Meta.AD(
  9. deflt = "blue",
  10. required = false
  11. )
  12. public String favoriteColor();
  13.  
  14. @Meta.AD(
  15. deflt = "red|green|blue",
  16. required = false
  17. )
  18. public String[] validColors();
  19.  
  20. @Meta.AD(required = false)
  21. public int favoriteNumber();
  22.  
  23. }
  1. Meta.AD Meta.OCDOSGi Metatype 的格式。更多信息见:
    http://bnd.bndtools.org/chapters/210-metatype.html

MVCPortlet的实现
先添加@Component注解, configurationPid即应用程序配置接口
@Activate和@Modified是一个标准格式写法

  1. package com.liferay.docs.exampleconfig;
  2.  
  3. import java.io.IOException;
  4. import java.util.Map;
  5.  
  6. import javax.portlet.Portlet;
  7. import javax.portlet.PortletException;
  8. import javax.portlet.RenderRequest;
  9. import javax.portlet.RenderResponse;
  10.  
  11. import org.osgi.service.component.annotations.Activate;
  12. import org.osgi.service.component.annotations.Component;
  13. import org.osgi.service.component.annotations.Modified;
  14.  
  15. import com.liferay.portal.kernel.portlet.bridges.mvc.MVCPortlet;
  16.  
  17. import aQute.bnd.annotation.metatype.Configurable;
  18.  
  19. @Component(
  20. configurationPid = "com.liferay.docs.exampleconfig.ExampleConfiguration",
  21. immediate = true,
  22. property = {
  23. "com.liferay.portlet.display-category=category.sample",
  24. "com.liferay.portlet.instanceable=true",
  25. "javax.portlet.security-role-ref=power-user,user",
  26. "javax.portlet.init-param.template-path=/",
  27. "javax.portlet.init-param.view-template=/view.jsp",
  28. "javax.portlet.resource-bundle=content.Language"
  29. },
  30. service = Portlet.class
  31. )
  32. public class ExampleConfigPortlet extends MVCPortlet {
  33.  
  34. @Override
  35. public void doView(RenderRequest renderRequest,
  36. RenderResponse renderResponse) throws IOException, PortletException {
  37. //设置renderRequest的属性,把className写到key
  38. renderRequest.setAttribute(
  39. ExampleConfiguration.class.getName(), _configuration);
  40.  
  41. super.doView(renderRequest, renderResponse);
  42. }
  43.  
  44. public String getFavoriteColor(Map colors) {
  45. return (String) colors.get(_configuration.favoriteColor());
  46. }
  47.  
  48. @Activate
  49. @Modified
  50. protected void activate(Map<String, Object> properties) {
  51. _configuration = Configurable.createConfigurable(
  52. ExampleConfiguration.class, properties);
  53. }
  54.  
  55. private volatile ExampleConfiguration _configuration;
  56.  
  57. }

jsp

  1. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
  2. <%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %>
  3. <%@ taglib uri="http://liferay.com/tld/aui" prefix="aui" %>
  4. <%@ taglib uri="http://liferay.com/tld/portlet" prefix="liferay-portlet" %>
  5. <%@ taglib uri="http://liferay.com/tld/theme" prefix="liferay-theme" %>
  6. <%@ taglib uri="http://liferay.com/tld/ui" prefix="liferay-ui" %>
  7.  
  8. <%@ page import="com.liferay.docs.exampleconfig.ExampleConfiguration" %>
  9.  
  10. <%@ page import="com.liferay.portal.kernel.util.GetterUtil" %>
  11.  
  12. <portlet:defineObjects />
  13.  
  14. <liferay-theme:defineObjects />
  15.  
  16. <p>
  17. <b>Hello from the Example Configuration portlet!</b>
  18. </p>
  19.  
  20. <%
  21. ExampleConfiguration configuration = (ExampleConfiguration) GetterUtil.getObject(
  22. renderRequest.getAttribute(ExampleConfiguration.class.getName()));
  23.  
  24. String favoriteColor = configuration.favoriteColor();
  25. %>
  26.  
  27. <p>Favorite color: <span style="color: <%= favoriteColor %>;"><%= favoriteColor %></span></p>

界面:


我暂时还想不出这种写法的好处是啥?

为啥不用枚举,静态类,或者XML的属性文件,就是为了有作用范围? 有知道答案的客官请点醒我。
这种注解+元数据+接口的写法实在是太奇特了。

在liferay自身的设置,也是应用这种配置方法,

比如UI设置,如图:


还有一个更复杂的例子:
https://dev.liferay.com/develop/tutorials/-/knowledge_base/7-0/implementing-configuration-actions

Liferay7 BPM门户开发之25: Liferay7应用程序配置(APPLICATION CONFIGURATION)的更多相关文章

  1. Liferay7 BPM门户开发之37: Liferay7下的OSGi Hook集成开发

    hook开发是Liferay客制扩展的一种方式,比插件灵活,即可以扩展liferay门户,也能对原有特性进行更改,Liferay有许多内置的服务,比如用hook甚至可以覆盖Liferay服务. 可作为 ...

  2. Liferay7 BPM门户开发之34: liferay7对外服务类生成(RestService Get Url)

    在liferay7中开发不依赖Service Builder的对外服务类,非常简洁,只需要2点注解: 在类的前部定义: @ApplicationPath("/PathXXX") 方 ...

  3. Liferay7 BPM门户开发之22: Liferay7模型监听器(Model Listeners)

    Model Listeners实现ModelListener接口,用于持久化时的AOP处理 一些使用场景: Audit Listener: 在一个独立而分离的数据库,做信息更新的审计: Cache C ...

  4. Liferay7 BPM门户开发之24: Liferay7应用程序安全

    整理中...... Resources, Roles, and PermissionsPortal Access Control List (PACL) Custom SSO Providers Au ...

  5. Liferay7 BPM门户开发之1:Liferay7开发环境准备

    liferay sdk下载 \IDE下载 \ Tomcat 安装细节不在此赘述 网上有很多. 只讲核心关键坑点 进入2016年,从Liferay6.2.5 ga6版本开始,到7.0 ga3,在ivy环 ...

  6. Liferay7 BPM门户开发之17: Portlet 生命周期

    Portlet 生命周期 init() =〉 render() =〉 processAction() =〉 processEvent() =〉 serveResource() =〉destroy() ...

  7. Liferay7 BPM门户开发之10: 通用流程实现从Servlet到Portlet(Part1)

    开发目的: 实现通用流程自动化处理(即实现不需要hardcode代码的bpm统一处理后台,仅需要写少量前端html form代码和拖拽设计BPM定义) 既可独立运行或可依托于Liferay或依托其它门 ...

  8. Liferay7 BPM门户开发之12:acitiviti和liferay用户权限体系集成

    写到第12章才出现Liferay的内容,希望可以厚积薄发. 我们的目标是不使用不维护Activiti的用户组织架构,只维护Liferay的体系,这样的好处是非常明显的,即不用做组织架构的同步工作. 原 ...

  9. Liferay7 BPM门户开发之32: 实现自定义认证登陆(定制Authentication Hook)

    第一步:修改liferay-hook.xml <?xml version="1.0"?> <!DOCTYPE hook PUBLIC "-//Lifer ...

随机推荐

  1. 最小费用最大流 HDU1533

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1533 #include<bits/stdc++.h> #define fi first ...

  2. c# devexpress 多文档界面

    学习记录 https://blog.csdn.net/qq_25473787/article/details/81208894?utm_source=blogxgwz0

  3. elasticsearch数据结构

    无论是关系型数据库还是非关系型数据库,乃至elasticsearch这种事实上承担着一定储存作用的搜索引擎,数据类型都是非常重要而基础的概念.本文基于elasticsearch 5.x版本. 核心数据 ...

  4. python 删除非空文件夹

    import os import shutil os.remove(path) #删除文件 os.removedirs(path) #删除空文件夹 shutil.rmtree(path) #递归删除文 ...

  5. Shell中read命令--学习

    read命令 -p(提示语句) -n(字符个数) -t(等待时间) -s(不回显) 1.基本读取read命令接收标准输入(键盘)的输入,或其他文件描述符的输入(后面在说).得到输入后,read命令将数 ...

  6. swap的实现(没有中间变量)

    两数交换最常用的方法 void swap(int &a,int &b) { int temp=a; a=b; b=temp; } 如果没有中间变量temp可以使用呢,还有其他的三种方法 ...

  7. vs [失败]未能找到文件

    用文本文件打开csproj 文件.将里面的不需要文件删除; 或者在工程里面先将其移出工程.然后再删除;

  8. linux学习第十二天 (Linux就该这么学)找到一本不错的Linux电子书,附《Linux就该这么学》章节目录

    本书是由全国多名红帽架构师(RHCA)基于最新Linux系统共同编写的高质量Linux技术自学教程,极其适合用于Linux技术入门教程或讲课辅助教材,目前是国内最值得去读的Linux教材,也是最有价值 ...

  9. WPF图片拖拉变形、合成

    使用WPF的装饰器(Adorner)实现图片拖拉变形,DrawingVisual高保真合成图片.效果如下: 源码:https://gitee.com/orchis/ImageFotoMix.git

  10. 第一次spring会议

    1.今天查询了很多案例,找到了符合我们要求的案例,并进行了尝试. 2.昨天拍摄了宣传视频. 3.明天准备用C#限定格式输出TXT文件.