import org.apache.jasper.compiler.JspUtil;
import org.apache.jasper.compiler.Localizer;
import org.apache.jasper.compiler.ServletWriter;
-import org.apache.jasper.servlet.JasperLoader;
import org.apache.jasper.servlet.JspServletWrapper;
/**
public ClassLoader getJspLoader() {
if( jspLoader == null ) {
- jspLoader = new JasperLoader
- (new URL[] {baseUrl},
- getClassLoader(),
- rctxt.getPermissionCollection(),
- rctxt.getCodeSource());
+ jspLoader = rctxt.getJspLoader(baseUrl, getClassLoader());
}
return jspLoader;
}
import org.apache.jasper.Options;
import org.apache.jasper.runtime.JspFactoryImpl;
import org.apache.jasper.security.SecurityClassLoad;
+import org.apache.jasper.servlet.JasperLoader;
import org.apache.jasper.servlet.JspServletWrapper;
import org.apache.juli.logging.Log;
import org.apache.juli.logging.LogFactory;
private ServletContext context;
private Options options;
private URLClassLoader parentClassLoader;
+ private JasperLoader jspLoader;
private PermissionCollection permissionCollection;
private CodeSource codeSource;
private String classpath;
}
+ /**
+ * Obtain the classloader to use when loading JSP resources. In development
+ * mode or when running background compilations, each JSP has a separate
+ * classloader to enable easy re-loading of modified JSPs. If not in
+ * development mode, a single loader is used to reduce perm gen usage when
+ * many JSPs all use the same handful of tags.
+ */
+ public URLClassLoader getJspLoader(URL baseUrl, ClassLoader parent) {
+ if (options.getDevelopment() || lastCheck > -1) {
+ return new JasperLoader(new URL[] {baseUrl}, parent,
+ permissionCollection, codeSource);
+ }
+ if (jspLoader == null) {
+ jspLoader = new JasperLoader(new URL[] {baseUrl}, parent,
+ permissionCollection, codeSource);
+ }
+ return jspLoader;
+ }
+
+
// -------------------------------------------------------- Private Methods