Pergunta

Eu tenho as seguintes Stripes ActionBean:

package myapp;

import net.sourceforge.stripes.action.*;

public class WelcomeActionBean extends MyAppActionBean {
    @DefaultHandler
    public Resolution view() {
        return new ForwardResolution("/welcome.jsp");
    }
}

Quando eu carrego /myapp/welcome.action em um navegador, o conteúdo do Welcome.jsp são exibidos.

No entanto, quando me movo Welcome.jsp para /web-inf/jsp/welcome.jsp e altere o argumento da frente para refletir essa mudança, ou seja::

return new ForwardResolution("/WEB-INF/jsp/welcome.jsp");

Recebo o seguinte erro quando carrego /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)

É necessário executar alguma configuração especial para armazenar arquivos JSP no diretório Web-Inf?

Foi útil?

Solução

Meu entendimento é o seguinte: seu WelcomeActionBean em não em um pacote ([web, www, listras, ação]) tratado automaticamente pelo NameBasedActionResolver (leia o javadoc), então ele é realmente mapeado para /myapp/Welcome.action (conforme indicado na mensagem de erro).

Então, quando você solicita /Welcome.action, não existe existência ActionBean vinculado a esse URL e os fallbacks do resolvedor para /welcome.jsp (novamente, veja o NameBasedActionResolver javadoc). E quando você move seu JSP sob /WEB-INF/jsp, bem, você fica sem sorte e tudo falha.

Para resolver isso, também:

  • Acesse o URL "Right" (no estado atual), ou seja, isto é, /myapp/Welcome.action

  • Ou, se você deseja /Welcome.action pelas convenções, mova -o em um pacote tratado pelo NameBasedActionResolver, por exemplo 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");
        }
    }
    
  • Ou adicione um @UrlBinding à sua ação para configurar a ligação explicitamente:

    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");
        }
    }
    

Outras dicas

WEB-INF é um diretório especial e seu conteúdo não é acessível ao cliente. (Faz sentido - você não gostaria que o cliente pudesse fazer o download do seu web.xml ou seu .class arquivos.)

Você precisa mover os arquivos JSP para fora de WEB-INF.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top