1、portal.properties里面用到的的配置:
路徑:/portal-master/portal-impl/src/portal.properties
后臺打印sql的配置:Hibernate.show_sql=true
頁面session超時時間設置:session.timeout=300
只有powerUser用戶才會自動創建 用戶私有頁:layout.user.private.layouts.power.user.required=true
只有powerUser用戶才會自動創建 用戶公開頁:
layout.user.public.layouts.power.user.required=true
用戶第一次登錄時的相關配置:
關閉使用條款:terms.of.use.required=true
關閉密碼提醒功能:users.reminder.queries.enabled=false
關閉首次登錄強制修改密碼功能:passwords.default.policy.change.required=false
2、在FreeMarker詳情模板中獲取值:
<#assign assetRenderer = curEntry.getAssetRenderer()>
<#assign docXml = saxReaderUtil.read(assetRenderer.getArticle().getContent()) />
<#assign description = docXml.valueOf("//dynamic-element[@name='title']/dynamic-content/text()") />
3、在Velocity模板中獲取值:
#set($assetRenderer = $curEntry.getAssetRenderer())#set($docXml = $saxReaderUtil.read($assetRenderer.getArticle().getContent()))#set($description = $docXml.valueOf("//dynamic-element[@name='description']/dynamic-content/text()"))
4、獲取Liferay當前頁面的url:
PortalUtil.getCurrentURL(request);
5、中文亂碼:在當前工程的build.gradle文件中添加如下信息
tasks.withType(JavaCompile) {options.encoding = 'UTF-8'
}
然后重新執行deploy
頁面亂碼:在頁面增加如下代碼:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ page contentType="text/html;charset=utf-8"%>
6、liferay表
附件保存在以dlfile開頭的表里面
portlet自定義屬性保存在portletpreferences表里面
assetEntry里面可以查看有哪些屬性
web內容文章存儲在journalarticle里面
liferay模板都是存儲在ddmtemplate表里面
7、liferay模板變量
FreeMarkerTemplateContextHelper.java
8、自定義字段
設置值和讀取值
JournalArticle journalArticle = null;
journalArticle.getEcpandoBridge().setAttribute(“author”,”張三”);
journalArticle.getEcpandoBridge().getAttribute(“author”);
自定義字段在數據庫里面存儲的表:expandocolumn:欄目表、expandorow:行、expandotable:表、expandovalue:值
9、liferay中不需要的模板可以在控制面板->應用程序管理器中刪掉
比如商務版塊
卸載完后的效果:商務那一塊就沒有了
10、數據庫里修改的在頁面上沒生效處理:
控制面板->服務器管理->清除數據庫緩存
11、控制面板->組件里面可關閉不需要的portlet
12、查看liferay模塊的版本
13、jsp的一些定制擴展
(1)、頁面上找找相應的class或id標簽的屬性
(2)在liferay源碼中搜索一下(idea的快捷鍵:crtil+shift+F)
(3)頁面上沒找到的話可以看看還有哪些js有引用
(4)如果這一塊不需要的話可以去掉,
14、覆蓋源碼中的jsp頁面
如點贊:
(1)新建一個mvc-portlet,可以刪除不需要的生成文件
(2)在源碼中找到對應的bnd文件
(3)修改新建的mvc-portlet中的bnd文件,也就是需要覆蓋的源碼是哪一個
(4)、把要覆蓋的jsp復制出來放到對應的目錄下面
(5)、測試一下
15、引入全局樣式
(1)查找到源碼中的擴展點
(2)引入全局css
String content
= "<like href=\"/o/xxx/css/custom.css\" rel=\"stylesheet\" type=\"text/css\" />";
@Component(immediate
= true,service
= DynamicInclude
.class)
public class CssTopHeadDynamicInclude extends BaseDynamicInclude {@Overridepublic void include(HttpServletRequest request
, HttpServletResponse response
, String key
) throws IOException
{PrintWriter printWriter
= response
.getWriter();String content
= "<like href=\"/o/xxx/css/custom.css\" rel=\"stylesheet\" type=\"text/css\" />";printWriter
.println(content
);}@Overridepublic void register(DynamicIncludeRegistry dynamicIncludeRegistry
) { dynamicIncludeRegistry
.register("/html/common/themes/top_head.jsp#pre");}
}
16、定時任務
在自己的某個插件中建立如下類
@Component(immediate
= true, service
= DdTestMessageListener
.class)
public class DdTestMessageListener extends BaseMessageListener {@Activateprotected void activate() {Class
<?> clazz
= getClass();String className
= clazz
.getName();Trigger trigger
= _triggerFactory
.createTrigger(className
, className
, null
, null
,15, TimeUnit
.SECOND
);SchedulerEntry schedulerEntry
= new SchedulerEntryImpl(className
, trigger
);_schedulerEngineHelper
.register(this, schedulerEntry
, DestinationNames
.SCHEDULER_DISPATCH
);}@Deactivateprotected void deactivate() {_schedulerEngineHelper
.unregister(this);}@Overrideprotected void doReceive(Message message
) throws Exception
{System
.out
.println(new Date());}@Reference(target
= ModuleServiceLifecycle
.PORTAL_INITIALIZED
, unbind
= "-")protected void setModuleServiceLifecycle(ModuleServiceLifecycle moduleServiceLifecycle
) {}@Reference(unbind
= "-")protected void setSchedulerEngineHelper(SchedulerEngineHelper schedulerEngineHelper
) {_schedulerEngineHelper
= schedulerEngineHelper
;}private SchedulerEngineHelper _schedulerEngineHelper
;@Referenceprivate TriggerFactory _triggerFactory
;}
部署啟動后看效果
17、覆蓋全局Liferay語言包
(1)、找到源碼中想要覆蓋的語言配置
liferay-ce-portal-src-7.3.5-ga6\portal-impl\classes\content\Language_zh_CN.properties
(2)在自己的某個插件中建立如下類,在項目的language里面寫對應的值
@Component(property
= { "language.id=zh_CN" },service
= ResourceBundle
.class
)
public class MyCNResourceBundle extends ResourceBundle {@Overrideprotected Object
handleGetObject(String key
) {return _resourceBundle
.getObject(key
);}@Overridepublic Enumeration
<String> getKeys() {return _resourceBundle
.getKeys();}private final ResourceBundle _resourceBundle
= ResourceBundle
.getBundle("content.Language_zh_CN", UTF8Control
.INSTANCE
);}
(3)把需要覆蓋的配置放在對應的文件中,如想把微件頁改為portlet頁
(4)部署后看效果,改成功了
18、覆蓋指定模塊語言包
Provide
-Capability
: \
liferay
.resource
.bundle
;resource
.bundle
.base
.name
="content.Language",\
liferay
.resource
.bundle
;resource
.bundle
.aggregate
:String
="(bundle.symbolic.name=com.huidian.zhanlve),(bundle.symbolic.name=com.liferay.portlet.configuration.css.web)";bundle
.symbolic
.name
=com
.liferay
.portlet
.configuration
.css
.web
;resource
.bundle
.base
.name
="content.Language";service
.ranking
:Long
="2";\
servlet
.context
.name
=portlet
-configuration
-css
-web解析一下:
liferay
.resource
.bundle
;resource
.bundle
.base
.name
="content.Language"聲明模塊的提供資源文件的內容content
.Language
liferay
.resource
.bundle
;resource
.bundle
.aggregate
:String
=...要匯集的資源文件名和排名
"(bundle.symbolic.name=com.huidian.zhanlve),(bundle.symbolic.name=com.liferay.portlet.configuration.css.web)":該服務從這兩個包中匯集資源文件,前面的優先;
bundle
.symbolic
.name
=com
.liferay
.portlet
.configuration
.css
.web
;resource
.bundle
.base
.name
="content.Language":覆蓋com
.liferay
.portlet
.configuration
.css
.web包的名為資源包content
.Language
service
.ranking
:Long
="2":資源包的服務排名為
2
servlet
.context
.name
=portlet
-configuration
-css
-web:目標資源位于servlet中的上下文portlet
-configuration
-css
-web
修改成功
19、覆蓋源碼中的MVCAction
比如在web內容發布提交時處理,先在源碼中找到對應的action,可以用F12監聽一下請求的路徑對應的action
20、Hook事件-自定義變量
Portal.properties里面查看
application.shutdown.events:portal實例關閉
application.startup.events:Portal實例啟動或創建時
global.shutdown.events:portal的main servlet關閉
global.startup.events:main servlet啟動
layout.configuration.action.delete :頁面刪除
layout.configuration.action.update:頁面初始化,更新
login.events.post:登錄后事件.
login.events.pre:登錄前事件
logout.events.post:退出后
logout.events.pre :退出前
servlet.service.events.post:處理完一個請求后.
servlet.service.events.pre:處理請求前
servlet.session.create.events:session創建事件
servlet.session.destroy.events:session銷毀事件
@Component(immediate
= true, property
= {"key=login.events.post"},service
= LifecycleAction
.class
)
public class LandingRedirectAction implements LifecycleAction {@Overridepublic void processLifecycleEvent(LifecycleEvent lifecycleEvent
) throws ActionException
{HttpSession session
= lifecycleEvent
.getRequest().getSession();session
.setAttribute("LAST_PATH", new LastPath(StringPool
.BLANK
, "/group/zhanlve/index"));}
}
@Component(immediate
= true, property
= {"key=login.events.post"},service
= LifecycleAction
.class
)
public class LandingRedirectAction implements LifecycleAction {@Overridepublic void processLifecycleEvent(LifecycleEvent lifecycleEvent
) throws ActionException
{HttpServletRequest request
= lifecycleEvent
.getRequest();HttpSession session
= request
.getSession();String useridStr
= (String
) session
.getAttribute("j_username");String friendlyUrL
= StringPool
.BLANK
;try {long userId
= GetterUtil
.getLong(useridStr
);User user
= UserLocalServiceUtil
.getUser(userId
);List
<Group> groups
= user
.getGroups();if (!groups
.isEmpty()) {friendlyUrL
= groups
.get(0).getFriendlyURL();}else {List
<Organization> organizations
= user
.getOrganizations();if (!organizations
.isEmpty()) {Group group
= organizations
.get(0).getGroup();if (null
!=group
) {friendlyUrL
= group
.getFriendlyURL();}}}} catch (SystemException e
) {e
.printStackTrace();} catch (PortalException e
) {e
.printStackTrace();}String redirect
= ParamUtil
.getString(request
, "redirect");if (Validator
.isNotNull(redirect
)) {redirect
= PortalUtil
.escapeRedirect(redirect
);}if (Validator
.isNotNull(friendlyUrL
)) {redirect
= "/group"+friendlyUrL
;LastPath lastPath
= new LastPath(StringPool
.BLANK
, redirect
);session
.setAttribute(WebKeys
.LAST_PATH
, lastPath
);}}
}
21、自定義過濾器
@Component(immediate
= true,property
= {"dispatcher=FORWARD","dispatcher=REQUEST","servlet-context-name=","servlet-filter-name= Custom CAS LDAP Import Filter","url-pattern=/c/portal/login"},service
= Filter
.class)
public class CustomCASFilter extends BaseFilter {@Overridepublic boolean isFilterEnabled(HttpServletRequest request
, HttpServletResponse response
){return true;}@Overrideprotected void processFilter(HttpServletRequest request
,HttpServletResponse response
, FilterChain filterChain
) throws Exception
{HttpSession session
= request
.getSession();System
.out
.println("進入CustomCASFilter");processFilter(CustomCASFilter
.class.getName(), request
, response
, filterChain
);}@Overrideprotected Log
getLog() {return _log
;}private static final Log _log
= LogFactoryUtil
.getLog(CustomCASFilter
.class);
}
22、自動登錄(驗證,url上面帶了userId就可以自動登錄)
可以跟過濾器結合使用,過濾器過濾到對應請求地址,把信息寫到session中,這里就可以從session中獲取值了
@Component(immediate
= true,service
= AutoLogin
.class
)
public class CustomLogin extends BaseAutoLogin {@Overrideprotected String
[] doLogin(HttpServletRequest request
, HttpServletResponse response
) throws Exception
{Long userId
= ParamUtil
.getLong(request
,"userId");if(Validator
.isNotNull(userId
)){User user
= UserLocalServiceUtil
.fetchUser(userId
);return new String[]{ userId
.toString(),user
.getPassword(),String
.valueOf(user
.isPasswordEncrypted())};}return null
;}
}
提供回調地址
@Component(immediate
= true,property
= "path=/portal/sso/login",service
= StrutsAction
.class
)
public class LoginAction implements StrutsAction{@Overridepublic String
execute(HttpServletRequest httpServletRequest
, HttpServletResponse httpServletResponse
) throws Exception
{String token
= ParamUtil
.getString(httpServletRequest
,"token");System
.out
.println("token:"+token
);if(Validator
.isNotNull(token
)){Long userId
= GetterUtil
.getLong(token
);HttpSession session
= httpServletRequest
.getSession();session
.setAttribute("CUSTOM_LOGIN_USER_ERROR","test error");session
.setAttribute("CUSTOM_LOGIN_USER_ID",userId
);}httpServletResponse
.sendRedirect("/web/guest");return null
;}
}
實際訪問時前面要加一個c
中文不能識別
23、liferay在報錯或者找不到路徑時,全部跳轉到原有的error頁面
bundles/tomcat-8.0.32/webapps/ROOT/errors/code.jsp。項目中需要自定404頁面:首先,在bundles/tomcat-8.0.32/webapps/ROOT/errors/ 文件夾中創建自定義的404.jsp頁面(如果想在該頁面中顯示一些系統信息,可以參照code.jsp的寫法);然后在配置文件中配置該404頁面:
layout.show.http.status=true
layout.friendly.url.page.not.found=/errors/404.jsp
總結
以上是生活随笔為你收集整理的liferay实战的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。