Получите дружественные URL-адреса для работы в Liferay

Я хотел включить дружественные URL-адреса в liferay для своих портлетов JSR-268.

Я настроил средство сопоставления дружественных URL-адресов, как мне было сказано в http://www.liferay.com/web/guest/community/wiki/-/wiki/Main/FriendlyURLMapper но у меня почему-то это не работает.

Что мне не хватает?

Мой 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-appPortletURL actionURL = response.createActionURL();
actionURL.setParameter("contentid", "10007.33");
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-routesPortletURL actionURL = response.createActionURL();
actionURL.setParameter("contentid", "10007.33");
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>

URL-адреса, отображаемые в портлете, по-прежнему: http://localhost:8080/web/guest/home?p_auth=Yu81QQrj&p_p_id=content_WAR_genticsportlet_INSTANCE_R2HSaoL5RkHi&p_p_lifecycle=1&p_p_state=normal&p_p_mode=view&p_p_col_id=column-2&p_p_col_count=1&_content_WAR_genticsportlet_INSTANCE_R2HSaoL5RkHi_contentid=10007.33

URL-адрес был создан с использованием следующего кода:

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

Было бы очень хорошо, если бы вы могли указать мне правильное направление...


person csupnig    schedule 04.04.2012    source источник


Ответы (3)


Ваш маршрут должен начинаться с части после content, так как content уже является частью сгенерированного URL. Для этого используется значение <friendly-url-mapping>content</friendly-url-mapping>.

<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">
person adarshr    schedule 04.04.2012
comment
Я только что попробовал это... но это все еще не работает. Я предполагаю, что сопоставление URL-адресов работает в обоих направлениях: URL-адреса в контенте уже должны отображаться как дружественные URL-адреса... верно? Также может быть проблема с instanceid/instanceable? - person csupnig; 04.04.2012
comment
У меня было точно такое же сомнение, когда я вчера начал изучать дружественные URL-адреса. После долгих отладок оказывается, что это так. Я добавил общий <pattern>/</pattern>, чтобы заставить его работать. Попробуйте с instanceable=false, чтобы исключить instanceid проблемы. - person adarshr; 04.04.2012
comment
Спасибо... общий ‹pattern›/‹/pattern› хоть что-то изменил. Теперь мой URL-адрес выглядит так: localhost:8080/web/ guest/home/-/content/ Я также установил для instanceable значение false, но я все еще получаю INSTANCE_R2... в параметре contentid:/ Возможно, мне просто нужно немного поиграть. - person csupnig; 04.04.2012
comment
Да, это немного коряво и в документации нет всех этих нюансов. - person adarshr; 04.04.2012

Следуя ответу Adarshr, вы также можете избавиться от части /-/, создав свой собственный класс, который расширяет DefaultFriendlyURLMapper и переопределяет метод isCheckMappingWithPrefix, поэтому вы получаете:

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

Таким образом, ваши URL-адреса будут просто http://community_name.com/web/group_name/page_name/content/contentId. Затем вы устанавливаете свой класс в тегах friendly-url-mapper-class. Пример которого вы можете увидеть в этом проекте портлета на GitHub:

https://github.com/DevJonny/Liferay-6-Friendlier-Friendly-URL-Mapper

~~ РЕДАКТИРОВАТЬ ~~

Спасибо, Пракаш, за указание на то, что старая ссылка не работает.

person Jonny    schedule 05.04.2012
comment
большое спасибо за ссылку на статью... посмотрю :) - person csupnig; 05.04.2012
comment
Не беспокойся! :) дайте мне знать, если у вас есть какие-либо вопросы или предложения по его улучшению! - person Jonny; 05.04.2012
comment
Отличный совет! Я, вероятно, буду использовать это в своем проекте. - person adarshr; 05.04.2012
comment
Спасибо @PrakashK. Я обновил свой ответ ссылкой на пример этого, который у меня есть на GitHub. - person Jonny; 20.02.2013

Мне удалось удалить все параметры, кроме 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:

person agapitocandemor    schedule 24.05.2012