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, 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 (jspLoader == null) {
+ if (options.getDevelopment()) {
+ jspLoader = new JasperLoader
+ (new URL[] {baseUrl},
+ parent,
+ permissionCollection,
+ codeSource);
+ } else {
+ jspLoader = new JasperLoader(new URL[] {baseUrl},
+ parent, permissionCollection, codeSource);
+ }
+ }
+ return jspLoader;
+ }
+
+
// -------------------------------------------------------- Private Methods