随笔 - 1  文章 - 37  trackbacks - 0
<2024年4月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

留言簿(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 阅读(334) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: