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

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

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

    天空是藍(lán)色的

    做好軟件為中國 #gcc -c helloworld.c -o helloworld.o //編譯目標(biāo)文件 #gcc helloworld.o -o helloworld //編譯成可執(zhí)行exe #helloworld //運(yùn)行exe
    數(shù)據(jù)加載中……
    [轉(zhuǎn)貼]詳解 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" 錯(cuò)誤。該錯(cuò)誤是指 JSP 中給定的 useBean 標(biāo)簽的 class 屬性的值無效(不是 Bean 的屬性值)。

    在說明這個(gè)問題前,先看看有關(guān)的 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);
              }

          }

      }


    可見錯(cuò)誤可能的原因包括:

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

    第二點(diǎn)很明顯,不用多解釋,最經(jīng)常發(fā)生的情況是 Bean 類忘了聲明為 public 。

    第三點(diǎn)中需要注意的是,如果你的 Bean 類沒有提供任何構(gòu)造函數(shù),將自動(dòng)生成一個(gè)默認(rèn)構(gòu)建函數(shù),這沒有問題。但是,如果你有構(gòu)造函數(shù),則不會(huì)自動(dòng)生成該默認(rèn)構(gòu)造函數(shù)。經(jīng)常被忽略的問題是寫了默認(rèn)構(gòu)造函數(shù)卻不是 public 的。

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

     
    還有一個(gè)更為特殊的例子。如果 Web 應(yīng)用在啟動(dòng)時(shí), WEB-INF/classes 目錄不存在,則在啟動(dòng)應(yīng)用后,新建 classes 目錄,動(dòng)態(tài)添加新的類進(jìn)去是沒有用的,會(huì)報(bào)告同樣的錯(cuò)誤。原因是此時(shí)的 Tomcat 不會(huì)去檢查該目錄,也就不會(huì)找到你需要的類。對(duì) WEB-INF/lib 目錄也是同樣。這一點(diǎn)可以參考下面的源代碼(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 
    + "/" ); 

      }


    盡管這個(gè)問題的復(fù)雜場(chǎng)景可能不一而足,不過解決它的辦法卻很簡(jiǎn)單:停止服務(wù)器,確認(rèn)你的 JSP 和 Bean 正確部署,清理掉 TOMCAT_HOME/work 中的內(nèi)容,重起服務(wù)器。 此外,配置動(dòng)態(tài)類加載對(duì)開發(fā)而言是個(gè)不錯(cuò)的選擇。
     
    本文基于 Tomcat 5.5.9 版本。

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

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

    評(píng)論

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

    呵呵 不錯(cuò)

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

    我遇到一個(gè)情況就是,在我的虛擬目錄中(相對(duì)于虛擬根目錄),也就是說:如果我的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中一切正常。請(qǐng)問這是什么原因?
    謝謝

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

    Tomcat的版本為:6.0
    謝謝!??!
    ^_^

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

    肯定的啊,score只是web應(yīng)用的 context 真實(shí)目錄還是StoreWeb啊

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

    謝謝!
    ^_^

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

    我現(xiàn)在上傳自己的網(wǎng)站就出現(xiàn)了這樣的問題。也不知道怎么才好。在我本機(jī)上是可以進(jìn)行的,可是傳上遠(yuǎn)程服務(wù)器后,就出現(xiàn)了以上的問題。說JavaBean值無效。

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

    強(qiáng)

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

    我只是愛你的網(wǎng)站,它充滿了新鮮和相關(guān)的文章,有一個(gè)非常漂亮的眼睛吸引人的設(shè)計(jì)!有些職位,真正幫助我在我的工作,所以表示感謝!

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

    偉大的東西,從你的人。伊夫讀你的東西,和“你太真棒。我愛什么youve來到這里,愛什么你說你說的方式。你讓娛樂和你們?nèi)栽O(shè)法保持它的智能。我不能等待讀取。這的確是一個(gè)偉大的博客

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

    我現(xiàn)在上傳自己的網(wǎng)站就出現(xiàn)了這樣的問題。也不知道怎么才好。在我本機(jī)上是可以進(jìn)行的,可是傳上遠(yuǎn)程服務(wù)器后,就出現(xiàn)了以上的問題。說JavaBean值無效。
    主站蜘蛛池模板: 免费无码AV一区二区| 亚洲日本一线产区和二线| 在线观看免费黄色网址| 浮力影院亚洲国产第一页| 一级毛片免费一级直接观看| 免费a级毛片永久免费| 黄页网站在线视频免费| 免费大片在线观看网站| 国产精品免费久久久久影院| 亚洲人精品午夜射精日韩| 免费在线观看一级片| 亚洲精品在线播放| 日韩不卡免费视频| 国产精品国产亚洲区艳妇糸列短篇| 免费理论片51人人看电影| 另类专区另类专区亚洲| 亚洲人成影院在线观看| 一区二区三区在线免费看| 亚洲欧洲日产韩国在线| 天天摸天天操免费播放小视频| 久久精品熟女亚洲av麻豆| 老司机亚洲精品影视www| 中文字幕免费高清视频| 亚洲a∨国产av综合av下载| 亚洲一区二区三区在线播放| 污污网站18禁在线永久免费观看| 亚洲AV综合色区无码二区偷拍 | 亚洲AV日韩AV一区二区三曲| 亚洲一区二区精品视频| 222www在线观看免费| 亚洲成av人无码亚洲成av人| AV在线播放日韩亚洲欧| 国产福利视精品永久免费| 久久亚洲欧美国产精品| 人人狠狠综合久久亚洲婷婷| 三年片在线观看免费观看高清电影 | 亚洲日本VA午夜在线电影| 亚洲性在线看高清h片| 天天影院成人免费观看| 美女视频黄a视频全免费网站色| 水蜜桃亚洲一二三四在线|