隨筆 - 1  文章 - 37  trackbacks - 0
          <2025年8月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          留言簿(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 閱讀(358) 評論(0)  編輯  收藏

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


          網站導航:
           
          主站蜘蛛池模板: 郑州市| 曲阜市| 通化市| 专栏| 吉隆县| 浠水县| 大理市| 五台县| 自治县| 德惠市| 博兴县| 河南省| 青神县| 大足县| 尼玛县| 县级市| 台北市| 平武县| 垦利县| 齐齐哈尔市| 侯马市| 云阳县| 厦门市| 玉龙| 邹城市| 长武县| 内黄县| 延长县| 淮南市| 小金县| 武清区| 霞浦县| 长沙市| 江华| 江西省| 磐安县| 新乡县| 新蔡县| 新兴县| 禹城市| 遂平县|