Friendly URLs for Liferay Portlets

标准的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>
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值