Я внедрил сайт, основанный на Stripes. Я хочу избежать использования приложения .action для его URL-адресов. В каждом из моих Action Beans я добавил привязки URL типа: @URLBinding("/home")
.Почему прямая косая черта в URL-адресе вызывает бесконечный цикл вызовов моего Action Action Bean?
Затем в моем web.xml я настроил DynamicMappingFilter, как описано в http://stripes.sourceforge.net/docs/current/javadoc/net/sourceforge/stripes/controller/DynamicMappingFilter.html.
Сайт в прямом эфире и работает отлично ... Кроме того, когда кто-то пытается использовать URL-адрес http://example.com/home/anything. Это вызывает бесконечный цикл вызова моего HomeActionBean, пока, наконец, я не получу StackOverflowError!
Кто-нибудь испытывал то же самое, и знаете ли вы, как это предотвратить?
Большое спасибо. Eduardo
P.S. Вот некоторые подробности о реализации. Я создал демоверсию с простым тестовым компонентом и JSP.
TestActionBean
@UrlBinding("/test")
public class TestActionBean extends BaseActionBean implements ActionBean {
@DefaultHandler
public Resolution test() {
return new ForwardResolution("test.jsp");
}
}
test.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Test infinite loop</title>
</head>
<body>
blabla
</body>
</html>`
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>pt.company.commons.stripes.action</param-value>
</init-param>
<init-param>
<param-name>ActionBeanContext.Class</param-name>
<param-value>pt.company.commons.stripes.action.CustomActionBeanContext</param-value>
</init-param>
<!-- The parameter tells Stripes to use the Spring interceptor -->
<init-param>
<param-name>Interceptor.Classes</param-name>
<param-value>net.sourceforge.stripes.integration.spring.SpringInterceptor</param-value>
</init-param>
...
<filter-mapping>
<filter-name>StripesFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
<filter-mapping>
<filter-name>StripesFilter</filter-name>
<servlet-name>StripesDispatcher</servlet-name>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
<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>
<init-param>
<param-name>ActionResolver.Packages</param-name>
<param-value>pt.company.common.stripes.action</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>DynamicMappingFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
<servlet>
<servlet-name>StripesDispatcher</servlet-name>
<servlet-class>net.sourceforge.stripes.controller.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>StripesDispatcher</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
Hey Richard - Спасибо. Но на самом деле я только что создал компонент демо-действий, с простым переходом на пустой test.jsp, и я получаю точно такое же поведение - бесконечные циклы, если я использую URL-адрес http://example.com/test/smth. –
Я только что добавил тестовый код в качестве редактирования моего оригинального сообщения. Спасибо за любую помощь! –
Я думаю, проблема в ForwardResolution. Когда test.jsp находится в ROOT, он должен прочитать 'return new ForwardResolution ("/test.jsp ");' Обратите внимание на косую черту. – acdhirr