简体   繁体   中英

Error moving JSP file into WEB-INF directory with Stripes

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, ie:

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 WelcomeActionBean in not in a package ([web, www, stripes, action]) automagically handled by the NameBasedActionResolver (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 existing ActionBean bound to that URL and the resolver fallbacks to /welcome.jsp (again, see the NameBasedActionResolver javadoc). 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 ie /myapp/Welcome.action

  • Or, if you want your ActionBean to be bound to /Welcome.action by the conventions, move it in a package handled by the NameBasedActionResolver , eg action :

     package myapp.action; import net.sourceforge.stripes.action.*; public class WelcomeActionBean extends MyAppActionBean { @DefaultHandler public Resolution view() { return new ForwardResolution("/WEB-INF/jsp/welcome.jsp"); } }
  • Or add a @UrlBinding to your action to configure the binding explicitly:

     package myapp; import net.sourceforge.stripes.action.*; @UrlBinding("/Welcome.action") public class WelcomeActionBean extends MyAppActionBean { @DefaultHandler public Resolution view() { return new ForwardResolution("/WEB-INF/jsp/welcome.jsp"); } }

WEB-INF is a special directory, and its contents aren't accessible to the client. (It makes sense - you wouldn't want the client to be able to download your web.xml or your .class files.)

You need to move the JSP files outside of WEB-INF .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM