隨筆 - 1  文章 - 37  trackbacks - 0
          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          留言簿(16)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          test

          搜索

          •  

          最新評論


          現象:

          啟動Tomcat
          刪除 CATALINA_HOME/work/ 目錄下的Catalina目錄
          訪問任何一個jsp文件,將發生錯誤

          org.apache.jasper.JasperException: org.apache.jasper.JasperException: Unable to load class for JSP
              org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:
          156)
              org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:
          329)
              org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:
          342)
              org.apache.jasper.servlet.JspServlet.service(JspServlet.java:
          267)
              javax.servlet.http.HttpServlet.service(HttpServlet.java:
          717)

           

          原因:

          Tomcat對jsp的處理是由一個JspServlet來完成的,當tomcat啟動時,會為每一個context創建jsp工作目錄(work dir),存放地為 CATALINA_HOME/work/Catalina/HOST_NAME/CONTEXT_NAME,context編譯jsp所需要的參數也隨之初始化,加載jsp class的base path也已經潛在初始化,是一個File對象,它將在隨后URLClassLoader加載jsp class時作為一個resource url,下面是部分代碼:

          org.apache.jasper.JspCompilationContext.java

          初始化 JspLoader

          public ClassLoader getJspLoader() {
                  
          if( jspLoader == null ) {
                      jspLoader 
          = new JasperLoader
                      (
          new URL[] {baseUrl},
                              getClassLoader(),
                              rctxt.getPermissionCollection(),
                              rctxt.getCodeSource());
                  }

                  
          return jspLoader;
              }


          其中baseUrl是這樣得到的

          protected void createOutputDir() {
                  String path 
          = null;
                  
          if (isTagFile()) {
                      String tagName 
          = tagInfo.getTagClassName();
                      path 
          = tagName.replace('.', File.separatorChar);
                      path 
          = path.substring(0, path.lastIndexOf(File.separatorChar));
                  }
           else {
                      path 
          = getServletPackageName().replace('.',File.separatorChar);
                  }


                      
          // Append servlet or tag handler path to scratch dir
                      try {
                          File base 
          = options.getScratchDir();
                          baseUrl 
          = base.toURI().toURL();
                          outputDir 
          = base.getAbsolutePath() + File.separator + path + 
                              File.separator;
                          
          if (!makeOutputDir()) {
                              
          throw new IllegalStateException(Localizer.getMessage("jsp.error.outputfolder"));
                          }

                      }
           catch (MalformedURLException e) {
                          
          throw new IllegalStateException(Localizer.getMessage("jsp.error.outputfolder"), e);
                      }

              }

          options.getScratchDir() 是在tomcat啟動時初始化的,于是,啟動tomcat后,刪除work目錄,訪問jsp時,盡管work目錄被重新創建并且jsp被成功編譯,但是由于ClassLoader中原目錄對象與當前目錄對象不同,而無法加載到jsp的class

          posted on 2009-07-05 17:22 Phrancol Yang 閱讀(353) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 盘山县| 曲阜市| 广宗县| 绿春县| 宁远县| 亳州市| 兴义市| 海阳市| 荣昌县| 高雄市| 财经| 迁西县| 平阳县| 钟祥市| 雷州市| 临清市| 吉安市| 宜兴市| 磴口县| 稻城县| 治县。| 铜山县| 蓝田县| 越西县| 稷山县| 耿马| 吴川市| 温州市| 黄平县| 泰顺县| 会东县| 陈巴尔虎旗| 搜索| 雷州市| 晴隆县| 洛浦县| 文成县| 桐柏县| 增城市| 乡城县| 瓮安县|