【问题标题】:Get friendly urls to work in Liferay获取在 Liferay 中工作的友好网址
【发布时间】:2012-04-18 07:03:15
【问题描述】:

我想在 liferay 中为我的 JSR-268 Portlet 启用友好的 url。

我按照http://www.liferay.com/web/guest/community/wiki/-/wiki/Main/FriendlyURLMapper 中的说明配置了友好的 url 映射器,但不知何故这对我不起作用。

我错过了什么?

我的liferay-portlet.xml 看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE liferay-portlet-app PUBLIC "-//Liferay//DTD Portlet Application 6.1.0//EN"     "http://www.liferay.com/dtd/liferay-portlet-app_6_1_0.dtd">
<liferay-portlet-app>
<portlet>
    <portlet-name>content</portlet-name>
    <friendly-url-mapper-class>com.liferay.portal.kernel.portlet.DefaultFriendlyURLMapper</friendly-url-mapper-class>
    <friendly-url-mapping>content</friendly-url-mapping>
    <friendly-url-routes>com/gentics/cr/portlet/content-url-routes.xml</friendly-url-routes>
    <instanceable>true</instanceable>
</portlet>
<portlet>
    <portlet-name>navigation</portlet-name>
    <icon>/icon.png</icon>
    <instanceable>true</instanceable>
</portlet>
<portlet>
    <portlet-name>search</portlet-name>
    <icon>/icon.png</icon>
    <instanceable>true</instanceable>
    <!-- header-portlet-css>/css/test.css</header-portlet-css>
    <footer-portlet-javascript>/js/test.js</footer-portlet-javascript-->
</portlet>
<!--role-mapper>
    <role-name>administrator</role-name>
    <role-link>Administrator</role-link>
</role-mapper>
<role-mapper>
    <role-name>guest</role-name>
    <role-link>Guest</role-link>
</role-mapper>
<role-mapper>
    <role-name>power-user</role-name>
    <role-link>Power User</role-link>
</role-mapper>
<role-mapper>
    <role-name>user</role-name>
    <role-link>User</role-link>
</role-mapper-->
</liferay-portlet-app>

我的content-url-routes.xml 看起来像这样:

<?xml version="1.0"?>
<!DOCTYPE routes PUBLIC "-//Liferay//DTD Friendly URL Routes 6.0.0//EN" "http://www.liferay.com/dtd/liferay-friendly-url-routes_6_0_0.dtd">

<routes>
<route>
    <pattern>/content/{contentid}</pattern>
</route>
<!-- route>
    <pattern>/{instanceId}/search/{filter}</pattern>
    <implicit-parameter name="do">search</implicit-parameter>
</route>
<route>
    <pattern>/{instanceId}/search/{filter}/{start}</pattern>
    <implicit-parameter name="do">search</implicit-parameter>
</route-->
</routes>

portlet 中呈现的 url 仍然是:http://localhost:8080/web/guest/home?p_auth=Yu81QQrj&amp;p_p_id=content_WAR_genticsportlet_INSTANCE_R2HSaoL5RkHi&amp;p_p_lifecycle=1&amp;p_p_state=normal&amp;p_p_mode=view&amp;p_p_col_id=column-2&amp;p_p_col_count=1&amp;_content_WAR_genticsportlet_INSTANCE_R2HSaoL5RkHi_contentid=10007.33

该 URL 是使用以下代码创建的:

PortletURL actionURL = response.createActionURL();
actionURL.setParameter("contentid", "10007.33");

如果你能指出我正确的方向,那就太好了……

【问题讨论】:

    标签: url liferay portlet


    【解决方案1】:

    您的路由应该从content 之后的部分开始,因为content 已经是生成的URL 的一部分。值 &lt;friendly-url-mapping&gt;content&lt;/friendly-url-mapping&gt; 用于此目的。

    <route>
        <pattern>/{contentid}</pattern>
    </route>
    

    另外,请务必将 DTD 更改为 *-url-routes.xml 中的最新版本。

    <!DOCTYPE routes PUBLIC "-//Liferay//DTD Friendly URL Routes 6.1.0//EN" "http://www.liferay.com/dtd/liferay-friendly-url-routes_6_1_0.dtd">
    

    【讨论】:

    • 我刚试过……但还是不行。我假设 url 映射以两种方式工作:内容中的 url 应该已经被呈现为友好的 url ......对吗? instanceid / instanceable也可能有问题吗?
    • 当我昨天开始探索友好网址时,我有这个确切的疑问。经过大量调试,事实证明确实如此。我添加了一个通用的&lt;pattern&gt;/&lt;/pattern&gt; 来让它工作。尝试使用instanceable=false 排除instanceid 问题。
    • 谢谢...通用的 / 至少改变了一些东西。现在我的 URL 看起来像 localhost:8080/web/guest/home/-/content/… 我也将 instanceable 设置为 false 但我仍然在 contentid 参数中获得了 INSTANCE_R2...:/ 我可能只需要玩一下。
    • 是的,它有点笨拙,文档没有所有这些细微差别。
    【解决方案2】:

    在 Adarshr 回答之后,您还可以通过创建自己的扩展 DefaultFriendlyURLMapper 并覆盖该方法的类来摆脱 /-/ 部分 isCheckMappingWithPrefix 所以你得到:

    @Override
    public boolean isCheckMappingWithPrefix() {     
        return false;
    }
    

    所以你的 URL 就是 @987654321@。然后你在friendly-url-mapper-class 标签中设置你的类。您可以在 GitHub 上的这个 portlet 项目中看到一个示例:

    @987654322@

    ~~编辑~~

    感谢 Prakash 指出旧链接无效。

    【讨论】:

    • 非常感谢您链接文章...我会看看它:)
    • 别担心! :) 如果您对改进它有任何问题或建议,请告诉我!
    • 很棒的提示!我可能会在我的项目中使用它。
    • 谢谢@PrakashK 我已经更新了我的答案,并附上了我在 GitHub 上的一个示例的链接
    【解决方案3】:

    我通过使用删除了除 p_auth 和我的 javax.portlet.action 之外的所有参数

    <pattern>/myportlet</pattern>
    <ignored-parameter name="p_p_lifecycle" />
    <ignored-parameter name="p_p_state" />
    <ignored-parameter name="p_p_mode" />
    

    生命周期、状态和模式从 url 中消失。但无法删除 p_auth 和 URL 的其余部分:

    【讨论】:

      猜你喜欢
      • 2012-07-08
      • 1970-01-01
      • 2012-08-14
      • 1970-01-01
      • 1970-01-01
      • 2012-10-15
      • 2011-02-15
      • 2013-03-03
      相关资源
      最近更新 更多