标准的portletURLs 并不能算是简洁的:
http://localhost:8080/web/guest/home?
p_p_id=mygreeting_WAR_mygreetingportlet&p_p_lifecycle=0&p_p_state=normal
&p_p_mode=view&p_p_col_id=column-1&_mygreeting_WAR_mygreetingportlet_jspPage=%2Fedit.jsp
liferay 6 中提供了一个非常好的方法来控制portal为portlet生成URL。使用此方法后,URL如下:
http://localhost:8080/web/guest/home/-/my-greeting/edit
此URL是由/-/符分割的两部分组成。前半部分和通常的情况是一样,用来识别页面。后半部分用来识别portlet并包含一些关键的信息。
这两个URL的优缺点应该很明显吧?
以下步骤将假设你已经安装了lifray以及plugin SDK,并且知道如何开发liferayportlet。
首先,需要创建一个新的类,它将继承BaseFriendlyURLMapper基类,该基类实现了FriendlyURLMapper接口。
1 the getMapping method
此方法必须返回一个映射的标识符。liferay使用此映射标识符识别URL所引用的portlet。它通常出现在/-/字符后。应该保证自定义的URL以此标识符开始。我们仅仅使用此方法返回URLmapper的唯一标识符。
public String getMapping() {
return "seoPortlet";
}
2 the buildPath method
此方法构建friendlyURL。可在此方法中实现URL的生成逻辑。
此方法的输入参数类型为:LiferayPortletURL。
返回所要生成的friendlyURL,或null(当不能正确构建时)。返回null,将会导致通常的portletURL的生成。
对于每一个你不想在URL中显示的参数(如p_p_id),需要调用portletURL.addParameterIncludedInPath(“p_p_id”)。
public String buildPath(final LiferayPortletURL portletURL) {
String friendlyURLPath = null;
// get the value
final String portletId =portletURL.getPortletId();
final String eventName =GetterUtil.getString(portletURL.getParameter("event"));
if (Validator.isNotNull(portletId)&& Validator.isNotNull(eventName)) {
friendlyURLPath= StringPool.FORWARD_SLASH + "seoPortlet"+ StringPool.FORWARD_SLASH +portletId + StringPool.FORWARD_SLASH + eventName;
portletURL.addParameterIncludedInPath("event");
}
// add other pararmeters
if (Validator.isNotNull(friendlyURLPath)){
portletURL.addParameterIncludedInPath("p_p_id");
}
return friendlyURLPath;
}
3 the getPortletId method
此方法主要取得portlet的id值。方便在populateParams方法中使用。
注意:此id值仅仅是portlet的值,而不包括instanceid。
private String portletId;
public String getPortletId() {
return portletId;
}
4 the populateParams method
URL映射标识符作出的每次请求,liferay都会调用此方法。它映射我们从查询字符串中删除的的参数,并添加到参数路径中。与buildPath方法相反!
public void populateParams(final String friendlyURLPath, final Map<String,String[]> params) {
// get the values
final String[] parts = StringUtil.split(friendlyURLPath,StringPool.SLASH);
portletId = parts[2];
final String event = parts[3];
final String namespace = getNamespace();
params.put("p_p_id", new String[]{portletId});
params.put("p_p_state", new String[]{WindowState.NORMAL.toString()});
params.put(namespace +"event", new String[]{event});
}
liferay-portlet.xml
到此映射类已经完成,我们需要告诉liferay启用它。在portlet声明中添加friendly-url-mapper-class声明。应在</icon>之后<instanceable>之前添加。
<friendly-url-mapper-class>com.sample.FriendlyURLMapper</friendly-url-mapper-class>