Создание дружественных ссылок на динамические ресурсы в Struts2 - PullRequest
0 голосов
/ 22 октября 2008

У меня есть приложение struts2 с одной страницей, которая может показывать одно из нескольких значений, хранящихся в базе данных. Приложение предназначено для школы со многими отделами, и у каждого отдела есть много программ. Доступ к странице отдела осуществляется с помощью URL-адреса, подобного этому

department.action?id=2

и DepartmentAction загрузит Department с id = 2 для отображения. Все это хорошо, если пользователь просто просматривает сайт, но становится неудобно, если я хочу предоставить ссылку на инженерный отдел в газетах. Ссылка должна быть www.myschooldomain.com/department.action?id=2. Я вижу ряд проблем с этим.

Во-первых, это не удобно для пользователя. Во-вторых, он может быть поврежден, потому что отделы поддерживаются динамически, и идентификатор отдела может изменяться без предупреждения, делая связь нестабильной.

Я бы предпочел напечатать URL-адрес примерно так: www.myschooldomain.com/department/engineering, и пусть он каким-то образом перейдет в отдел.action? Id = 2.

Мои мысли на данный момент: создать действие, которое будет анализировать URL-адрес для названия отдела в конце, а затем искать его по имени. Может быть, я мог бы добавить поле friendlyurl в базу данных для каждого отдела.

Но вопрос в следующем: есть ли лучший способ сделать это в Struts2?

Спасибо.

Обновление (май 2009 г.): Я случайно наткнулся на этот вопрос и подумал, что скажу, что я сделал, чтобы решить его.

Я создал новый пакет в struts.xml под названием департаменты. В этом пакете есть только одно действие, сопоставленное с *. Таким образом, он ловит все запросы на mydomain.com/departments/anything.html.

В классе действий я просто анализирую URL и ищу часть между отделами / и .html, и это название отдела, поэтому я могу выполнить поиск в базе данных для него. Это работает нормально уже почти 5 месяцев, и я внедрил его для других областей сайта.

Ответы [ 2 ]

3 голосов
/ 08 апреля 2009

Вы можете использовать фильтр перезаписи URL

Это позволяет избежать необходимости в любом дополнительном сервлете или коде Java, но требует наличия XML-дескрипторов.

1 голос
/ 22 октября 2008

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

Поскольку диспетчер Struts2 не реализует это поведение, было бы проще всего написать свой собственный сервлет. Этот сервлет будет настроен с сопоставлением действительных «дружественных» имен с недружественными числовыми идентификаторами. Это может быть фактический Map или это может быть сделано с помощью метода поиска базы данных.

Результат поиска getPathInfo() будет использоваться для поиска идентификатора, а запрос будет перенаправлен в отдел.action. Также обработайте регистр null, что означает, что пользователь пытается просмотреть каталог /departments/.

...