Liferay研究之廿七:一些有用的API分析

2024-01-13 13:18

本文主要是介绍Liferay研究之廿七:一些有用的API分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • com.liferay.portal.util.PropsUtil

在Portal.properties中设置的每个属性,都有一个类的属性与之对应,这个类就是:PropsUtil,每个属性都是静态的。

对应的还有一个类是:PropsValues可以直接获取属性对应的值。

如果想扩展portal.properties,在其中加上自己的值,那么就需要修改这两个类。

 

  • com.liferay.portal.util.WebAppPool.java

描述这样一个数据结构<companyId, key, value>

用来存储所有Company可以使用的所有应用列表。

WebAppPool.get(companyId, WebKeys.PORTLET_CATEGORY)就是获取某个company的应用分类;

获取之后先缓存,如果后来有了新的变化,还可以新旧一起merge。

  • com.liferay.portal.util.PortalInstances.java

用来描述Portal上所有的实例,也就是与服务器管理中相关的那些,每个Company会有一个portal instance。

  • com.liferay.portal.util.Portal.java, PortalImpl.java

描述了一个Portal Server, 通过这个类,在Portal加载后可以获知服务器的相关信息,比如portal的lib路径,Server Name,系统角色,系统组,组织,保留参数关键字等等。

(通过分析该类,还知道了,系统可以不部署在/ROOT目录下面,可以部署在任何路径下,只需对应的改变portal.properites中的portal.ctx属性即可)

该类不但具有名词属性,还具有动词属性,比如renderPortlet方法。具体的逻辑是:在获取了portlet对象,及其位置属性(columnPos, columnId)之后,将其放到request中,然后include render_portlet.jsp来显示一个Portlet.

  • com.liferay.portal.model.Portlet.java, model.impl.PortletImpl.java

描述了一个Portlet的所有属性。其值的设置都来源于liferay-portlet.xml中的定义,比如这个portlet是否是system portlet(用户不能操作)

  • com.liferay.portal.velocity.VelocityVariables.java

所有Velocity模板template中引用的对象变量,均在此处进行定义。

并且,该类定义了一个特殊的变量$init,这个变量对应一个公用的init.vm,也就是_unstyled/template/init.vm,这个模板中定义了各种Velocity的变量(比如是否显示my_place),类似init.jsp,被其他所有的模板来引用,比如在portal_normal.vm中,第一行一般就是:#parse($init)

一个例外:在template中$theme并不是在VelocityVariables中定义的Theme类型,而是通过ThemeUtil.includeVM,替换为了VelocityTagLib对象。

  • com.liferay.portal.servlet.taglib.portlet.DefineObjectsTagUtil.java

根据pageContext可以获取Portal相关的变量有:

lifecycle = (String)req.getAttribute(PortletRequest.LIFECYCLE_PHASE); 有几个可能的值:

PortletRequest.ACTION_PHASE

PortletRequest.EVENT_PHASE

PortletRequest.RENDER_PHASE

PortletRequest.RESOURCE_PHASE

portletConfig = (PortletConfigImpl)req.getAttribute(JavaConstants.JAVAX_PORTLET_CONFIG);

portletRequest = (PortletRequest)req.getAttribute(JavaConstants.JAVAX_PORTLET_REQUEST); 在不同阶段其在Request中的属性名也不同,分别是:

actionRequest, eventRequest, renderRequest, resourceRequest

portletPreferences = (PortletPreferences)pageContext.getAttribute("portletPreferences");

portletSession = (PortletSession)pageContext.setAttribute("portletSession");

portletResponse = (PortletResponse)pageContext.setAttribute(portletResponseAttrName); 其中portletResponseAttrName在不同的Lifecycle阶段值也不同,分别是:

actionResponse, eventResponse, renderResponse, resourceResponse

  • com.liferay.portal.model.LayoutTypePortlet.java, model.impl.LayoutTypePortletImpl.java

生成portlet instance id的方法:portletId + getFullInstanceSeparator()

处理typeSettings的方法:先通过LayoutTypeImpl调用Layout.getTypeSettingsProperties(),将数据库中存储的typeSettings内容转换为Properties类型。然后就可以根据LayoutTypePortletImpl中所定义的各个属性来取typeSettings的值了。

setLayoutTemplateId(long userId, String newLayoutTemplateId, boolean checkPermission)的逻辑

重新设定一个layout的template时,可能涉及到column的变化,以及再oldTempate column上的portlet位置的变化。

因此,重新设定一个templateId之后,还需要更新其上面的portlet. reorganizePortlets(newColumns, oldColumns);

重新设定的逻辑就是:如果新模板中的列数比旧模板的少,就将旧模板中多出来的列中的portlets全部放到新模板的最后一列。

  • com.liferay.portlet.layoutconfiguration.util.xml.RuntimeLogic, (PortletLogic, ActionURLLogic [ RenderURLLogic])

PortletLogic:

在文章中可以动态的嵌入Portlet.具体的做法是,在文章编辑中,源代码中,插入下面代码:

<runtime-portlet name="3" instance="" queryString="" />

具体参数说明:name→Portlet的ID,可以参考liferay-custom.xml中定义;instance→如果portlet是可以instancable的,那么这里需要指明其instanceId的后4位,如果不清楚最好到数据库中进行查找一下。比如从portletPreferences表中;queryString是附带的参数。

这样,文章中就可以动态的嵌入一个查询了。

ActionURLLogic:

<runtime-action-url portlet-name="" param-name-1="" param-value-1="" param-name-2="" param-value-2="" .... />

RenderURLLogic:

<runtime-render-url portlet-name="" param-name-1="" param-value-1="" param-name-2="" param-value-2="" .... />

  • com.liferay.portal.kernal.search.Indexer

该接口有两个方法:

DocumentSummary getDocumentSummary(Document, PortletURL)

void reindex(String[] ids)

DocumentSummary是一个简要检索结果的描述,也就是标题是什么,什么内容,链接到什么地方;

getDocumentSummary的过程,也就是从Lucene Document中获取title, content以及entityId三个对应的域内容,并构造DocumentSummary, 其中entityId用来构造显示该document的链接地址,一般是调用一个renderURL。

要想开发自己的Indexer,那么首先需要继承kernal.search.Indexer,实现上面的两个方法。

并添加addEntity, updateEntity, deleteEntity等方法。用来实现对全文检索内容的增加,更新及删除。

以构造过程为例,主要就是先新建一个lucene Document对象,并插入不同keywords的content(类似一个Map),然后用LuceneUtil.getWriter(companyId)获取IndexerWriter, 将doc写如索引。

  • com.liferay.portal.theme.ThemeDisplay

这个类描述了界面显示的绝大部分资源;

包括:layout, group, user, theme,colorScheme, locale, language, path, logo, URL, showIcon等等;

这篇关于Liferay研究之廿七:一些有用的API分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/601584

相关文章

Nginx分布式部署流程分析

《Nginx分布式部署流程分析》文章介绍Nginx在分布式部署中的反向代理和负载均衡作用,用于分发请求、减轻服务器压力及解决session共享问题,涵盖配置方法、策略及Java项目应用,并提及分布式事... 目录分布式部署NginxJava中的代理代理分为正向代理和反向代理正向代理反向代理Nginx应用场景

Redis中的有序集合zset从使用到原理分析

《Redis中的有序集合zset从使用到原理分析》Redis有序集合(zset)是字符串与分值的有序映射,通过跳跃表和哈希表结合实现高效有序性管理,适用于排行榜、延迟队列等场景,其时间复杂度低,内存占... 目录开篇:排行榜背后的秘密一、zset的基本使用1.1 常用命令1.2 Java客户端示例二、zse

Redis中的AOF原理及分析

《Redis中的AOF原理及分析》Redis的AOF通过记录所有写操作命令实现持久化,支持always/everysec/no三种同步策略,重写机制优化文件体积,与RDB结合可平衡数据安全与恢复效率... 目录开篇:从日记本到AOF一、AOF的基本执行流程1. 命令执行与记录2. AOF重写机制二、AOF的

MyBatis Plus大数据量查询慢原因分析及解决

《MyBatisPlus大数据量查询慢原因分析及解决》大数据量查询慢常因全表扫描、分页不当、索引缺失、内存占用高及ORM开销,优化措施包括分页查询、流式读取、SQL优化、批处理、多数据源、结果集二次... 目录大数据量查询慢的常见原因优化方案高级方案配置调优监控与诊断总结大数据量查询慢的常见原因MyBAT

分析 Java Stream 的 peek使用实践与副作用处理方案

《分析JavaStream的peek使用实践与副作用处理方案》StreamAPI的peek操作是中间操作,用于观察元素但不终止流,其副作用风险包括线程安全、顺序混乱及性能问题,合理使用场景有限... 目录一、peek 操作的本质:有状态的中间操作二、副作用的定义与风险场景1. 并行流下的线程安全问题2. 顺

MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决

《MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决》MyBatis默认开启一级缓存,同一事务中循环调用查询方法时会重复使用缓存数据,导致获取的序列主键值均为1,... 目录问题原因解决办法如果是存储过程总结问题myBATis有如下代码获取序列作为主键IdMappe

使用Go调用第三方API的方法详解

《使用Go调用第三方API的方法详解》在现代应用开发中,调用第三方API是非常常见的场景,比如获取天气预报、翻译文本、发送短信等,Go作为一门高效并发的编程语言,拥有强大的标准库和丰富的第三方库,可以... 目录引言一、准备工作二、案例1:调用天气查询 API1. 注册并获取 API Key2. 代码实现3

Java中最全最基础的IO流概述和简介案例分析

《Java中最全最基础的IO流概述和简介案例分析》JavaIO流用于程序与外部设备的数据交互,分为字节流(InputStream/OutputStream)和字符流(Reader/Writer),处理... 目录IO流简介IO是什么应用场景IO流的分类流的超类类型字节文件流应用简介核心API文件输出流应用文

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

Go语言使用net/http构建一个RESTful API的示例代码

《Go语言使用net/http构建一个RESTfulAPI的示例代码》Go的标准库net/http提供了构建Web服务所需的强大功能,虽然众多第三方框架(如Gin、Echo)已经封装了很多功能,但... 目录引言一、什么是 RESTful API?二、实战目标:用户信息管理 API三、代码实现1. 用户数据