Создание удобных URL-адресов для динамических ресурсов в struts2
-
03-07-2019 - |
Вопрос
У меня есть приложение struts2 с одной страницей, которая может отображать одно из нескольких значений, хранящихся в базе данных.Приложение предназначено для школы со многими отделениями, и каждый отдел имеет множество программ.Доступ к странице отдела осуществляется по URL-адресу, подобному этому
department.action?id=2
и DepartmentAction загрузит Department с id = 2 для отображения.Все это прекрасно, если пользователь просто просматривает сайт, но становится неудобно, если я хочу предоставить ссылку, скажем, на Инженерный отдел в газетах.Ссылка должна быть www.myschooldomain.com/department.action?id=2.Я вижу в этом ряд проблем.
Во-первых, это не удобно для пользователя.Во-вторых, он подвержен сбоям, поскольку отделы поддерживаются динамически, и идентификатор отдела может измениться без предупреждения, что сделает ссылку нестабильной.
Я бы предпочел напечатать URL-адрес, подобный этому:www.myschooldomain.com/department/engineering и пусть это каким-то образом перейдет в department.action?id=2.
Мои мысли до сих пор:создайте действие, которое будет анализировать URL-адрес для названия отдела в конце, а затем искать его по названию.Возможно, я мог бы добавить поле friendlyurl в базу данных для каждого отдела.
Но вопрос в том,:Есть ли лучший способ сделать это в struts2?
Спасибо.
Обновление (май 2009): Я просто случайно наткнулся на этот вопрос и подумал, что хотел бы рассказать, что я сделал, чтобы решить его.
Я создал новый пакет в struts.xml называемых отделах.В этом пакете есть только одно действие, сопоставленное с *.Таким образом, он перехватывает все запросы на mydomain.com/departments/anything.html.
В классе action я просто анализирую URL-адрес и ищу часть между departments / и .html, и это название отдела, чтобы я мог выполнить поиск по нему в базе данных.Это работает нормально уже почти 5 месяцев, и я внедрил это для других областей сайта.
Решение
Обычно это делается путем сопоставления сервлета с, в вашем случае '/department', а затем с помощью путь информация (например, '/engineering') внутри сервлета для определения идентификатора.
Поскольку диспетчер Struts2 не реализует это поведение, возможно, было бы проще всего написать свой собственный сервлет.Этот сервлет был бы сконфигурирован с сопоставлением допустимых "дружественных" имен с недружественными числовыми идентификаторами.Это могло бы быть реальным Map
или это можно было бы сделать с помощью метода поиска по базе данных.
В результате getPathInfo()
будет использоваться для поиска идентификатора, и запрос будет перенаправленный в департамент.действие.Обращаться с null
случае тоже, что означает, что пользователь пытается просмотреть /departments/
справочник.
Другие советы
Вы могли бы использовать Фильтр перезаписи URL-адресов
Это позволяет избежать необходимости в каком-либо дополнительном сервлете или Java-коде, но требует XML-дескрипторов.