Erro movendo o arquivo JSP para o diretório Web-Inf com listras
-
20-09-2019 - |
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?
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 peloNameBasedActionResolver
, por exemploaction
: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
.