Нужно ли мне создавать собственный шаблон регулярного выражения для этого в PrettyFaces?

Нужно ли мне создавать собственный шаблон регулярного выражения для соответствия URL-адресам, когда у меня есть следующее сопоставление (пример):

<url-mapping id="approvedQuestions">
    <pattern>/questions/approved/#{viewOption}/</pattern>
    <view-id>/approved.xhtml</view-id>
</url-mapping>

где часть viewoption также должна совпадать, когда пользователь НЕ заканчивает URL-адрес знаком «/»? И можно ли указать какое-то значение по умолчанию, если часть viewOption вообще не добавляется?

И если я viewOption является перечислением, можно ли параметр в нижнем регистре? Теперь мне нужно писать в верхнем регистре, чтобы заставить его работать.


person LuckyLuke    schedule 25.11.2011    source источник


Ответы (1)


Вы можете использовать собственное регулярное выражение для этого типа, но я рекомендую использовать правило перезаписи URL-адресов, чтобы добавить завершающую косую черту, если она отсутствует. Вы должны выбрать один URL-адрес (с символом «/» в конце или без него), в противном случае вы фактически обслуживаете одни и те же ресурсы с двумя разными адресами, и вы будете наказаны поисковыми системами и другими сканерами.

Для этого я бы использовал правило перезаписи, подобное следующему:

<rewrite match="/questions/approved/[^/]+" trailingSlash="append" />

Это приведет к тому, что сервер обнаружит отсутствие «/» в конце URL-адреса и перенаправит запрос в нужное место с «/» в конце.

Чтобы решить вашу проблему с перечислением, это немного сложнее. Обычно мы не рекомендуем привязывать значения непосредственно к перечислениям. В этом случае вы на самом деле не привязываетесь к перечислению (я предполагаю), но фактически привязываете буквальное строковое значение URL-адреса к контексту EL с областью запроса. Затем это значение извлекается где-то еще в вашем приложении, и именно здесь происходит преобразование в ENUM.

Пока не выйдет PrettyFaces 4, я рекомендую вместо этого привязать значение к местоположению String, а затем использовать метод действия для самостоятельной загрузки правильного значения, например так:

<url-mapping id="approvedQuestions">
    <pattern>/questions/approved/#{params.viewOption}/</pattern>
    <view-id>/approved.xhtml</view-id>
    <action>#{params.loadViewOption}</action>
</url-mapping>

Если вы хотите попробовать более продвинутый инструмент для перезаписи URL, также от OCPsoft, вы можете использовать «Rewrite» (http://ocpsoft.com/rewrite/), который представляет собой инструмент для перезаписи URL-адресов на основе Java, но не имеет такой тесной интеграции с JSF.

PrettyFaces 4 будет основан на переписывании в качестве ядра, после чего все функции, которые вы используете в настоящее время, также будут доступны с возможностью делать что-то подобное, чего вы и хотите, если я не ошибаюсь:

.addRule(Join.path("/questions/approved/{viewOption}").to("/approved.xhtml")
.where("viewOption")
.matches("[^/]+/?")
.transformedBy(TrailingSlash.append())
.transformedBy(To.upperCase())

Вам нужно будет создать свои собственные преобразователи, потому что они еще не определены в библиотеке, но это общая идея. Это намного мощнее, чем то, что в настоящее время возможно с PrettyFaces, но не обеспечивает такой же интеграции навигации JSF, и его немного сложнее настроить.

Я надеюсь, что это поможет, ~ Линкольн

person Lincoln    schedule 25.11.2011
comment
Спасибо за ваше время и усилия, написав это :) отличный ответ! - person LuckyLuke; 26.11.2011