<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    天空是藍色的

    做好軟件為中國 #gcc -c helloworld.c -o helloworld.o //編譯目標文件 #gcc helloworld.o -o helloworld //編譯成可執行exe #helloworld //運行exe
    數據加載中……
    [轉貼]詳解 Tomcat: The value for the useBean class attribute is invalid 問題

    詳解 Tomcat: The value for the useBean class attribute is invalid 問題

    使用Tomcat 常見 "The value for the useBean class attribute is invalid" 錯誤。該錯誤是指 JSP 中給定的 useBean 標簽的 class 屬性的值無效(不是 Bean 的屬性值)。

    在說明這個問題前,先看看有關的 Tomcat 源代碼(org.apache.jasper.compiler.Generator):

      if (beanName == null{
          
    try {
              Class bean 
    = ctxt.getClassLoader().loadClass(klass);
              
    int modifiers = bean.getModifiers();
              
    if (!Modifier.isPublic(modifiers) ||
                   Modifier.isInterface(modifiers) 
    ||
                  Modifier.isAbstract (modifiers)) 
    {
                  
    throw new Exception("Invalid bean class modifier");
              }

              
    // Check that there is a 0 arg constructor 
              bean.getConstructor(new Class[] {});
              generateNew 
    = true
          }
     catch (Exception e) {
              
    // Cannot instantiate the specified class
              if (ctxt.getOptions().getErrorOnUseBeanInvalidClassAttribute()) 
                  err.jspError(n, 
    "jsp.error.invalid.bean ", klass);
              }

          }

      }


    可見錯誤可能的原因包括:

    1. 在編譯 JSP 時(不是運行時),指定的 Bean 類沒找到
    2. Bean 雖然找到了,但是它不是 public 的,或者找到的 class 文件是 interface 或抽象類
    3. Bean 類中沒有 public 的默認構建函數

    第二點很明顯,不用多解釋,最經常發生的情況是 Bean 類忘了聲明為 public 。

    第三點中需要注意的是,如果你的 Bean 類沒有提供任何構造函數,將自動生成一個默認構建函數,這沒有問題。但是,如果你有構造函數,則不會自動生成該默認構造函數。經常被忽略的問題是寫了默認構造函數卻不是 public 的。

    第一點看起來簡單,不過卻最令人頭痛,尤其是在開發環境里。這里需要注意的是,"在編譯 JSP 時",意味著引用 Bean 的 JSP 是新的,或者剛剛更新過,或者 TOMCAT_HOME/work 中的編譯結果被清除了。此時,Tomcat 將自動(重新)編譯該 JSP,此時如果發現 Bean 沒找到,就會報這個錯。情況因為 JSP 或者 Bean 類正在開發而變得復雜,一一列舉所有情況沒有意義,這里我舉一些典型例子,借此應該可以舉一反三:
     
    如果 JSP 編譯結果存在,且 JSP 沒有更新,Tomcat 不會重新編譯 JSP,同時默認情況也不會自動重新加載更新過的 Bean 類(參考 http://jakarta.apache.org/tomcat/tomcat-5.5-doc/config/context.html 中的 reloadable)。所以,你會發現此時即使刪除了 Bean 類都沒有問題,當然,更新 Bean 類也不會有什么用。如果在 JSP 編譯產生之后,我們重起了服務器,由于 JSP 文件編譯的結果存在,所以,可以仍然訪問 JSP 頁面,而不必重新編譯。可是如果訪問前,刪掉了 Bean 類,就會報過 ClassNotFoundException 而不是上述錯誤。關鍵在于 JSP 是否經過編譯,沒有編譯則沒有找到類報告題目中的編譯錯誤 ,編譯過則是 ClassNotFoundException 運行時實例化錯誤。

     
    還有一個更為特殊的例子。如果 Web 應用在啟動時, WEB-INF/classes 目錄不存在,則在啟動應用后,新建 classes 目錄,動態添加新的類進去是沒有用的,會報告同樣的錯誤。原因是此時的 Tomcat 不會去檢查該目錄,也就不會找到你需要的類。對 WEB-INF/lib 目錄也是同樣。這一點可以參考下面的源代碼(org.apache.catalina.loader.WebappLoader):

      // Setting up the class repository (/WEB-INF/classes), if it exists

      String classesPath 
    = "/WEB-INF/classes";
      DirContext classes 
    = null;

      
    try {
          Object object 
    = resources.lookup(classesPath);
          
    if (object instanceof DirContext) {
              classes 
    = (DirContext) object;
          }

      }
     catch(NamingException e) 
          
    // Silent catch: it's valid that no /WEB-INF/classes collection
          
    // exists
      }


      
    if (classes != null{

          File classRepository 
    = null;

          String absoluteClassesPath 
    =
              servletContext.getRealPath(classesPath);

          
    if (absoluteClassesPath != null{

              classRepository 
    = new File(absoluteClassesPath);

          }
     else {

              classRepository 
    = new File(workDir, classesPath);
              classRepository.mkdirs();
              copyDir(classes, classRepository);

          }


          
    if(log.isDebugEnabled())
              log.debug(sm.getString(
    "webappLoader.classDeploy", classesPath,
                           classRepository.getAbsolutePath())); 


          
    // Adding the repository to the class loader
          classLoader.addRepository(classesPath + "/", classRepository);
          loaderRepositories.add(classesPath 
    + "/" ); 

      }


    盡管這個問題的復雜場景可能不一而足,不過解決它的辦法卻很簡單:停止服務器,確認你的 JSP 和 Bean 正確部署,清理掉 TOMCAT_HOME/work 中的內容,重起服務器。 此外,配置動態類加載對開發而言是個不錯的選擇。
     
    本文基于 Tomcat 5.5.9 版本。

    作者blog:http://spaces.msn.com/members/thomaszhou/

    posted on 2005-12-05 16:01 bluesky 閱讀(21586) 評論(10)  編輯  收藏 所屬分類: 工作總結

    評論

    # re: [轉貼]詳解 Tomcat: The value for the useBean class attribute is invalid 問題  2006-12-01 11:21 利劍

    呵呵 不錯
      回復  更多評論    

    # re: [轉貼]詳解 Tomcat: The value for the useBean class attribute is invalid 問題  2007-11-17 16:48 Mr Ma

    我遇到一個情況就是,在我的虛擬目錄中(相對于虛擬根目錄),也就是說:如果我的Host為:
    <Host name="128.128.19.49" appBase="D:/StoreWeb"
    unpackWARs="true" autoDeploy="true"
    xmlValidation="false" xmlNamespaceAware="false">

    <Context path="" docBase="D:/StoreWeb" debug="0" reloadable="true"/>
    <Context path="/score/" docBase="D:/StoreWeb" debug="0" reloadable="true"/>

    </Host>但是在score中的jsp頁面無法訪問在StoreWeb中的類文件。我把jSP頁面放在StoreWeb中一切正常。請問這是什么原因?
    謝謝
      回復  更多評論    

    # re: [轉貼]詳解 Tomcat: The value for the useBean class attribute is invalid 問題  2007-11-17 16:49 Mr Ma

    Tomcat的版本為:6.0
    謝謝!!!
    ^_^
      回復  更多評論    

    # re: [轉貼]詳解 Tomcat: The value for the useBean class attribute is invalid 問題  2007-11-18 19:57 bluesky

    肯定的啊,score只是web應用的 context 真實目錄還是StoreWeb啊
      回復  更多評論    

    # re: [轉貼]詳解 Tomcat: The value for the useBean class attribute is invalid 問題  2007-11-23 20:35 Mr Ma

    謝謝!
    ^_^
      回復  更多評論    

    # re: [轉貼]詳解 Tomcat: The value for the useBean class attribute is invalid 問題  2007-12-26 17:23 桌面

    我現在上傳自己的網站就出現了這樣的問題。也不知道怎么才好。在我本機上是可以進行的,可是傳上遠程服務器后,就出現了以上的問題。說JavaBean值無效。
      回復  更多評論    

    # re: [轉貼]詳解 Tomcat: The value for the useBean class attribute is invalid 問題 [未登錄] 2009-12-15 13:24 小吳

      回復  更多評論    

    # re: [轉貼]詳解 Tomcat: The value for the useBean class attribute is invalid 問題  2012-01-14 05:32 new car finance

    我只是愛你的網站,它充滿了新鮮和相關的文章,有一個非常漂亮的眼睛吸引人的設計!有些職位,真正幫助我在我的工作,所以表示感謝!
      回復  更多評論    

    # re: [轉貼]詳解 Tomcat: The value for the useBean class attribute is invalid 問題  2012-01-14 05:33 new ford

    偉大的東西,從你的人。伊夫讀你的東西,和“你太真棒。我愛什么youve來到這里,愛什么你說你說的方式。你讓娛樂和你們仍設法保持它的智能。我不能等待讀取。這的確是一個偉大的博客
      回復  更多評論    

    # re: [轉貼]詳解 Tomcat: The value for the useBean class attribute is invalid 問題  2012-04-03 04:42 payday loans

    我現在上傳自己的網站就出現了這樣的問題。也不知道怎么才好。在我本機上是可以進行的,可是傳上遠程服務器后,就出現了以上的問題。說JavaBean值無效。
      回復  更多評論    
    主站蜘蛛池模板: 久久精品免费电影| 亚洲成a人片在线观看无码专区 | 亚洲午夜无码久久久久小说 | 亚洲国产成人久久综合| 亚洲国产精品成人AV无码久久综合影院| 污网站免费在线观看| 亚洲AV无码一区东京热| 成人影片麻豆国产影片免费观看| 老湿机一区午夜精品免费福利 | AV在线亚洲男人的天堂| 国产精品亚洲综合久久| 精品亚洲视频在线观看| 国产1000部成人免费视频| 无码AV动漫精品一区二区免费| 亚洲va久久久噜噜噜久久| 国产精品无码免费播放| 国产一级a毛一级a看免费视频| 精品久久亚洲中文无码| 亚洲美日韩Av中文字幕无码久久久妻妇 | 亚洲欧美日韩一区二区三区在线| 精品国产香蕉伊思人在线在线亚洲一区二区| 日韩免费在线视频| 精品免费AV一区二区三区| 亚洲视频在线观看不卡| 老司机亚洲精品影视www| 在线天堂免费观看.WWW| 免费成人在线视频观看| 美女啪啪网站又黄又免费| 亚洲mv国产精品mv日本mv| 亚洲人成网7777777国产| 日韩免费福利视频| 国产精品永久免费10000| 日批视频网址免费观看| 野花视频在线官网免费1| 亚洲AV成人影视在线观看| 久久精品视频亚洲| 亚洲伊人成无码综合网 | 99久久亚洲综合精品成人网| 亚洲国产精品成人久久蜜臀| 99久久免费精品国产72精品九九| 少妇太爽了在线观看免费视频|