您的位置:首页 > Web前端

Friendly URLs for Liferay Portlets

2011-09-20 15:53 381 查看
标准的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>


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: