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

          留言簿(16)

          隨筆分類(lèi)

          隨筆檔案

          文章分類(lèi)

          文章檔案

          test

          搜索

          •  

          最新評(píng)論


          現(xiàn)象:

          啟動(dòng)Tomcat
          刪除 CATALINA_HOME/work/ 目錄下的Catalina目錄
          訪問(wèn)任何一個(gè)jsp文件,將發(fā)生錯(cuò)誤

          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對(duì)jsp的處理是由一個(gè)JspServlet來(lái)完成的,當(dāng)tomcat啟動(dòng)時(shí),會(huì)為每一個(gè)context創(chuàng)建jsp工作目錄(work dir),存放地為 CATALINA_HOME/work/Catalina/HOST_NAME/CONTEXT_NAME,context編譯jsp所需要的參數(shù)也隨之初始化,加載jsp class的base path也已經(jīng)潛在初始化,是一個(gè)File對(duì)象,它將在隨后URLClassLoader加載jsp class時(shí)作為一個(gè)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啟動(dòng)時(shí)初始化的,于是,啟動(dòng)tomcat后,刪除work目錄,訪問(wèn)jsp時(shí),盡管work目錄被重新創(chuàng)建并且jsp被成功編譯,但是由于ClassLoader中原目錄對(duì)象與當(dāng)前目錄對(duì)象不同,而無(wú)法加載到j(luò)sp的class

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

          只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 长治县| 四会市| 临猗县| 星座| 文水县| 印江| 东乡县| 青川县| 额济纳旗| 祁阳县| 阿合奇县| 汾西县| 应用必备| 运城市| 彭阳县| 常熟市| 平阳县| 彰武县| 视频| 股票| 南部县| 郎溪县| 板桥市| 邵东县| 潜山县| 策勒县| 五河县| 南投市| 南康市| 安多县| 青阳县| 柳江县| 琼中| 翼城县| 上饶市| 昌都县| 临漳县| 黄冈市| 昌邑市| 鲁山县| 民县|