I have the following Stripes ActionBean:
package myapp;
import net.sourceforge.stripes.action.*;
public class WelcomeActionBean extends MyAppActionBean {
@DefaultHandler
public Resolution view() {
return new ForwardResolution("/welcome.jsp");
}
}
When I load /myapp/Welcome.action in a browser, the contents of welcome.jsp are displayed.
However, when I move welcome.jsp to /WEB-INF/jsp/welcome.jsp and change the ForwardResolution argument to reflect that change, i.e.:
return new ForwardResolution("/WEB-INF/jsp/welcome.jsp");
I get the following error when I load /myapp/Welcome.action:
net.sourceforge.stripes.exception.ActionBeanNotFoundException: Could not locate an ActionBean that is bound to the URL [/Welcome.action]. Commons reasons for this include mis-matched URLs and forgetting to implement ActionBean in your class. Registered ActionBeans are: {/controller/DefaultView.action=class net.sourceforge.stripes.controller.DefaultViewActionBean, /myapp/MyApp.action/=class myapp.MyAppActionBean, /myapp/Welcome.action/=class myapp.WelcomeActionBean, /controller/DefaultView.action/=class net.sourceforge.stripes.controller.DefaultViewActionBean, /myapp/MyApp.action=class myapp.MyAppActionBean, /myapp/Welcome.action=class myapp.WelcomeActionBean}
net.sourceforge.stripes.controller.AnnotatedClassActionResolver.getActionBean(AnnotatedClassActionResolver.java:341)
net.sourceforge.stripes.controller.NameBasedActionResolver.getActionBean(NameBasedActionResolver.java:264)
net.sourceforge.stripes.controller.AnnotatedClassActionResolver.getActionBean(AnnotatedClassActionResolver.java:293)
net.sourceforge.stripes.controller.DispatcherHelper$1.intercept(DispatcherHelper.java:106)
net.sourceforge.stripes.controller.ExecutionContext.proceed(ExecutionContext.java:158)
net.sourceforge.stripes.controller.BeforeAfterMethodInterceptor.intercept(BeforeAfterMethodInterceptor.java:113)
net.sourceforge.stripes.controller.ExecutionContext.proceed(ExecutionContext.java:155)
net.sourceforge.stripes.controller.ExecutionContext.wrap(ExecutionContext.java:74)
net.sourceforge.stripes.controller.DispatcherHelper.resolveActionBean(DispatcherHelper.java:102)
net.sourceforge.stripes.controller.DispatcherServlet.resolveActionBean(DispatcherServlet.java:238)
net.sourceforge.stripes.controller.DispatcherServlet.service(DispatcherServlet.java:141)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
net.sourceforge.stripes.controller.StripesFilter.doFilter(StripesFilter.java:247)
Is it necessary to perform any special configuration in order to store JSP files in the WEB-INF directory?
My understanding is the following: your
WelcomeActionBeanin not in a package ([web, www, stripes, action]) automagically handled by theNameBasedActionResolver(read the javadoc) so it is actually mapped to/myapp/Welcome.action(as stated in the error message).So, when you request
/Welcome.action, there isn’t any existingActionBeanbound to that URL and the resolver fallbacks to/welcome.jsp(again, see theNameBasedActionResolverjavadoc). And when you move your JSP under/WEB-INF/jsp, well, you run out of luck and everything just fails.To solve this, either:
Access the “right” (in the current state) URL binding i.e.
/myapp/Welcome.actionOr, if you want your ActionBean to be bound to
/Welcome.actionby the conventions, move it in a package handled by theNameBasedActionResolver, e.g.action:Or add a
@UrlBindingto your action to configure the binding explicitly: