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

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

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

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

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

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 и немного сложнее в настройке.

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

Другие вопросы по тегам