Нужно ли мне сделать собственный шаблон регулярных выражений для этого в PrettyFaces - PullRequest
1 голос
/ 25 ноября 2011

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

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

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

А если viewOption - это перечисление, можно ли ввести параметр в нижнем регистре? Теперь мне нужно написать заглавными буквами, чтобы все заработало.

1 Ответ

3 голосов
/ 25 ноября 2011

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

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

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

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

Чтобы решить проблему enum, это немного сложнее. Обычно мы не рекомендуем связывать значения непосредственно в перечисления. В этом случае вы фактически не привязываетесь к перечислению (я предполагаю), но фактически привязываете значение 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, и его немного сложнее настроить.

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

...