本文主要是介绍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分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!