隨筆 - 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 閱讀(352) 評論(0)  編輯  收藏

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


          網站導航:
           
          主站蜘蛛池模板: 龙山县| 囊谦县| 隆昌县| 尖扎县| 九龙县| 高平市| 尼玛县| 呼和浩特市| 吴桥县| 万年县| 宁阳县| 阳江市| 淮滨县| 义马市| 恩平市| 应城市| 东宁县| 丰台区| 始兴县| 饶河县| 日土县| 蕲春县| 彰化县| 滕州市| 正蓝旗| 秦安县| 万州区| 双鸭山市| 武清区| 兖州市| 通道| 丽水市| 彝良县| 沽源县| 广水市| 太白县| 疏勒县| 马公市| 密云县| 沙湾县| 那曲县|