那么portletInfoElement如何得来的呢?参见PortletLocalServiceImpl的_readLiferayDisplay方法:
for (Element portletElement : categoryElement.elements("portlet")) { String portletId = portletElement.attributeValue("id"); ...所以,从这里可以看出它是从配置文件中<portlet>资源数中获得的。
而这个配置文件是哪个文件呢?
从我highlight的一行点入可以看到,它传入的是下标为0的xml文件,这个调用位于PortletLocalServiceImpl类中:
Set<String> portletIds = _readPortletXML( servletContext, xmls[0], portletsPool, servletURLPatterns, pluginPackage);而下标为0的配置文件的文件名传入是在MainServlet的initPortlets()方法声明的:
protected List<Portlet> initPortlets(PluginPackage pluginPackage) throws Exception { ServletContext servletContext = getServletContext(); String[] xmls = new String[] { HttpUtil.URLtoString( servletContext.getResource( "/WEB-INF/" + Portal.PORTLET_XML_FILE_NAME_CUSTOM)), HttpUtil.URLtoString( servletContext.getResource("/WEB-INF/portlet-ext.xml")), HttpUtil.URLtoString( servletContext.getResource("/WEB-INF/liferay-portlet.xml")), HttpUtil.URLtoString( servletContext.getResource("/WEB-INF/liferay-portlet-ext.xml")), HttpUtil.URLtoString( servletContext.getResource("/WEB-INF/web.xml")) }; PortletLocalServiceUtil.initEAR(servletContext, xmls, pluginPackage); ...现在一切真相大白了,原来,显示页面上的portlet的display-name是portlet.xml(被portlet-ext.xml覆盖后,如果有)的<portlet>下面的<portlet-info>下面的<title>元素的值。
总结:
经过3个多小时的探索,我们得到以下结论:
在Dockbar->Add->More显示的Portlet名称以及所属分类是按照 以下规则得到的:
对于分类:如果定义了Portlet的分类,则在liferay-display.xml中的<category>元素的值,否则,这个Portlet被加在 category.undefined 分类中。
对于Portlet名字,它是定义在portlet.xml的<portlet>元素下面的<portlet-info>元素下面的<title>元素的值。