2010-02-12 77 views
3

我有以下的ActionBean條紋:錯誤移動JSP文件到WEB-INF目錄與條紋

package myapp; 

import net.sourceforge.stripes.action.*; 

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

當我在瀏覽器中加載/myapp/Welcome.action,被顯示的welcome.jsp的內容。

然而,當我移動到的welcome.jsp和/WEB-INF/jsp/welcome.jsp改變ForwardResolution參數反映這種變化,即:

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

我收到以下錯誤,當我打開/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) 

是否有必要以存儲在WEB-INF目錄下的JSP文件進行任何特殊的配置?

回答

4

我的理解是這樣的:在沒有你的WelcomeActionBean在一個包([萬維網,萬維網,條紋,作用])由NameBasedActionResolver自動處理的(閱讀javadoc的),所以它實際上是映射到/myapp/Welcome.action(如規定錯誤信息)。

所以,當你請求/Welcome.action,沒有綁定到該URL和解析器回退給/welcome.jsp任何現有ActionBean(再次,見NameBasedActionResolver的javadoc)。當你將你的JSP移動到/WEB-INF/jsp時,那麼你運氣不佳,一切都會失敗。

爲了解決這個問題,或者:

  • 訪問 「權利」(在當前狀態下)URL綁定,即/myapp/Welcome.action

  • 或者,如果你希望你的ActionBean被綁定到/Welcome.action約定,將它移動到由NameBasedActionResolver處理的包中,例如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"); 
        } 
    } 
    
  • 或者添加@UrlBinding到你的動作來配置綁定明確:

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

,那麼完全可以。您關於NameBasedActionResolver的提示將我推向了正確的方向。我正在訪問/myapp/Welcome.action而不是/myapp/myapp/Welcome.action。 – titaniumdecoy 2010-02-12 16:56:50

-1

WEB-INF是一個特殊的目錄,其內容不能被客戶端訪問。 (這是有道理的 - 你不希望客戶端可以下載您web.xml或您.class文件。)

你需要移動的WEB-INF外的JSP文件。

+3

客戶端不訪問這些JSP。服務器使用內部轉發。如果在WEB-INF文件夾中有jsps,如果包含或轉發到 – Bozho 2010-02-12 08:30:12