2008-10-22 2 views
0

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

department.action?id=2 

и DepartmentAction загрузит отдел с идентификатором = 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.

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

ответ

1

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

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

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

3

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

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

+0

Я не хотел воскресить эту старую нить - я думал, что просматриваю новые ответы, да! – Pool 2009-04-08 12:55:34