Преобразование приложения Stripes для использования дружественных URL-адресов
Вопрос
Я работаю над книгой Фреда Дауда Stripes и пытаюсь преобразовать приложение Hello World для использования дружественных URL-адресов, поскольку я не большой поклонник сопоставлений на основе суффиксов, таких как http://localhost:8080/getting_started/Hello.action.
Вот предыдущее...
индекс.jsp:
<jsp:forward page="/Hello.action"/>
веб.xml:
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
и у меня нет UrlBinding в моем HelloActionBean.У меня работает пример книги.
Мне интересно, подходят ли примеры из книги для более ранней версии Stripes, поскольку я загрузил 1.5.1, и мой web.xml определяет StripesFilter и StripesDispatcher, тогда как я видел DynamicMappingFilter, используемый в другом месте, например.в Эта статья от Фреда на TheServerSide.
В любом случае, я внес следующие изменения:
индекс.jsp:
<jsp:forward page="/hello"/>
веб.xml:
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
HelloActionBean.java:
**@UrlBinding("/hello")**
public class HelloActionBean implements ActionBean
{
Однако, когда я пытаюсь загрузить приложение через http://localhost:8080/getting_started Я вижу это:
net.sourceforge.stripes.exception.ActionBeanNotFoundException: Could not locate an ActionBean that is bound to the URL [/]. Commons reasons for this include mis-matched URLs and forgetting to implement ActionBean in your class. Registered ActionBeans are: {/hello=class stripesbook.action.HelloActionBean, /controller/DefaultView.action=class net.sourceforge.stripes.controller.DefaultViewActionBean, /hello/=class stripesbook.action.HelloActionBean, /controller/DefaultView.action/=class net.sourceforge.stripes.controller.DefaultViewActionBean}
at net.sourceforge.stripes.controller.AnnotatedClassActionResolver.getActionBean(AnnotatedClassActionResolver.java:341)
и если я получу к нему доступ через http://localhost:8080/getting_started/привет сервер, похоже, зацикливается, выбрасывая одно исключение за другим.
Любые предложения приветствуются - спасибо.
Решение
Я попробовал еще несколько вещей и все заработало...
Я удалил существующие определения сервлета DispatcherServlet и сопоставления сервлетов в web.xml и заменил их DynamicMappingFilter.
В качестве бонуса можно изменить способ передачи событий ссылок, например.
http://localhost:8080/getting_started/hello?randomDate=
становится
http://localhost:8080/getting_started/hello/randomDate
измените UrlBinding в ActionBean на:
@UrlBinding("/hello/{$event}")
Другие советы
Мне не удалось просто заменить сервлет Dispatcher на DynamicMappingFilter (я получил сообщение об ошибке о том, что DynamicMappingFilter работает только в сочетании с StripesFilter).Итак, теперь в моем web.xml настроено два фильтра и одно сопоставление фильтров:
<filter>
<display-name>Stripes Filter</display-name>
<filter-name>StripesFilter</filter-name>
<filter-class>net.sourceforge.stripes.controller.StripesFilter</filter-class>
<init-param>
<param-name>ActionResolver.Packages</param-name>
<param-value>com.package.myactions.package</param-value>
</init-param>
</filter>
<filter>
<description>Dynamically maps URLs to ActionBeans.</description>
<display-name>Stripes Dynamic Mapping Filter</display-name>
<filter-name>DynamicMappingFilter</filter-name>
<filter-class>
net.sourceforge.stripes.controller.DynamicMappingFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>DynamicMappingFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
</filter-mapping>