JspServletpublic class JspServlet extends HttpServlet The JSP engine (a.k.a Jasper).
The servlet container is responsible for providing a
URLClassLoader for the web application context Jasper
is being used in. Jasper will try get the Tomcat
ServletContext attribute for its ServletContext class
loader, if that fails, it uses the parent class loader.
In either case, it must be a URLClassLoader. |
Fields Summary |
---|
private static com.sun.org.apache.commons.logging.Log | log | private ServletContext | context | private ServletConfig | config | private org.apache.jasper.Options | options | private org.apache.jasper.compiler.JspRuntimeContext | rctxt | private int | countErrors | private Object | errorCountLk | private String | httpMethodsString | private HashSet | httpMethodsSet | private ConcurrentHashMap | taglibs | private ConcurrentHashMap | tagFileJarUrls |
Methods Summary |
---|
public void | destroy()
if (log.isDebugEnabled()) {
log.debug("JspServlet.destroy()");
}
rctxt.destroy();
JspApplicationContextImpl.removeJspApplicationContext(context);
// START GlassFish 750
taglibs.clear();
tagFileJarUrls.clear();
// END GlassFish 750
// START GlassFish 747
HashMap tldUriToLocationMap = (HashMap) context.getAttribute(
Constants.JSP_TLD_URI_TO_LOCATION_MAP);
if (tldUriToLocationMap != null) {
tldUriToLocationMap.clear();
}
// END GlassFish 747
| public int | getJspCount()Returns the number of JSPs for which JspServletWrappers exist, i.e.,
the number of JSPs that have been loaded into the webapp with which
this JspServlet is associated.
This info may be used for monitoring purposes.
return this.rctxt.getJspCount();
| public int | getJspErrorCount()Gets the number of errors triggered by JSP invocations.
return this.countErrors;
| public int | getJspReloadCount()Gets the number of JSPs that have been reloaded.
This info may be used for monitoring purposes.
return this.rctxt.getJspReloadCount();
| private void | incrementErrorCount()
synchronized (errorCountLk) {
countErrors++;
}
| public void | init(javax.servlet.ServletConfig config)
// END GlassFish 750
/*
* Initializes this JspServlet.
*/
super.init(config);
this.config = config;
this.context = config.getServletContext();
// Initialize the JSP Runtime Context
options = new EmbeddedServletOptions(config, context);
rctxt = new JspRuntimeContext(context,options);
// Instantiate and init our resource injector
String resourceInjectorClassName = config.getInitParameter(
Constants.JSP_RESOURCE_INJECTOR_CONTEXT_ATTRIBUTE);
if (resourceInjectorClassName != null) {
try {
ResourceInjector ri = (ResourceInjector)
Class.forName(resourceInjectorClassName).newInstance();
ri.setContext(this.context);
this.context.setAttribute(
Constants.JSP_RESOURCE_INJECTOR_CONTEXT_ATTRIBUTE, ri);
} catch (Exception e) {
throw new ServletException(e);
}
}
// START SJSWS 6232180
// Determine which HTTP methods to service ("*" means all)
httpMethodsString = config.getInitParameter("httpMethods");
if (httpMethodsString != null
&& !httpMethodsString.equals("*")) {
httpMethodsSet = new HashSet();
StringTokenizer tokenizer = new StringTokenizer(
httpMethodsString, ", \t\n\r\f");
while (tokenizer.hasMoreTokens()) {
httpMethodsSet.add(tokenizer.nextToken());
}
}
// END SJSWS 6232180
// START GlassFish 750
taglibs = new ConcurrentHashMap<String, TagLibraryInfo>();
context.setAttribute(Constants.JSP_TAGLIBRARY_CACHE, taglibs);
tagFileJarUrls = new ConcurrentHashMap<String, URL>();
context.setAttribute(Constants.JSP_TAGFILE_JAR_URLS_CACHE,
tagFileJarUrls);
// END GlassFish 750
if (log.isTraceEnabled()) {
log.trace(Localizer.getMessage("jsp.message.scratch.dir.is",
options.getScratchDir().toString()));
log.trace(Localizer.getMessage("jsp.message.dont.modify.servlets"));
}
| boolean | preCompile(javax.servlet.http.HttpServletRequest request)Look for a precompilation request as described in
Section 8.4.2 of the JSP 1.2 Specification. WARNING -
we cannot use request.getParameter() for this, because
that will trigger parsing all of the request parameters, and not give
a servlet the opportunity to call
request.setCharacterEncoding() first.
String queryString = request.getQueryString();
if (queryString == null) {
return (false);
}
int start = queryString.indexOf(Constants.PRECOMPILE);
if (start < 0) {
return (false);
}
queryString =
queryString.substring(start + Constants.PRECOMPILE.length());
if (queryString.length() == 0) {
return (true); // ?jsp_precompile
}
if (queryString.startsWith("&")) {
return (true); // ?jsp_precompile&foo=bar...
}
if (!queryString.startsWith("=")) {
return (false); // part of some other name or value
}
int limit = queryString.length();
int ampersand = queryString.indexOf("&");
if (ampersand > 0) {
limit = ampersand;
}
String value = queryString.substring(1, limit);
if (value.equals("true")) {
return (true); // ?jsp_precompile=true
} else if (value.equals("false")) {
// Spec says if jsp_precompile=false, the request should not
// be delivered to the JSP page; the easiest way to implement
// this is to set the flag to true, and precompile the page anyway.
// This still conforms to the spec, since it says the
// precompilation request can be ignored.
return (true); // ?jsp_precompile=false
} else {
throw new ServletException("Cannot have request parameter " +
Constants.PRECOMPILE + " set to " +
value);
}
| public void | service(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response)
// START SJSWS 6232180
if (httpMethodsSet != null) {
String method = request.getMethod();
if (method == null) {
return;
}
boolean isSupportedMethod = httpMethodsSet.contains(method);
if (!isSupportedMethod) {
if (method.equals("OPTIONS")) {
response.addHeader("Allow", httpMethodsString);
} else {
super.service(request, response);
}
return;
}
}
// END SJSWS 6232180
String jspUri = null;
String jspFile = (String) request.getAttribute(Constants.JSP_FILE);
if (jspFile != null) {
// JSP is specified via <jsp-file> in <servlet> declaration
jspUri = jspFile;
request.removeAttribute(Constants.JSP_FILE);
} else {
/*
* Check to see if the requested JSP has been the target of a
* RequestDispatcher.include()
*/
jspUri = (String) request.getAttribute(Constants.INC_SERVLET_PATH);
if (jspUri != null) {
/*
* Requested JSP has been target of
* RequestDispatcher.include(). Its path is assembled from the
* relevant javax.servlet.include.* request attributes
*/
String pathInfo = (String) request.getAttribute(
"javax.servlet.include.path_info");
if (pathInfo != null) {
jspUri += pathInfo;
}
} else {
/*
* Requested JSP has not been the target of a
* RequestDispatcher.include(). Reconstruct its path from the
* request's getServletPath() and getPathInfo()
*/
jspUri = request.getServletPath();
String pathInfo = request.getPathInfo();
if (pathInfo != null) {
jspUri += pathInfo;
}
}
}
if (log.isDebugEnabled()) {
StringBuffer msg = new StringBuffer();
msg.append("JspEngine --> [" + jspUri);
msg.append("] ServletPath: [" + request.getServletPath());
msg.append("] PathInfo: [" + request.getPathInfo());
msg.append("] RealPath: [" + context.getRealPath(jspUri));
msg.append("] RequestURI: [" + request.getRequestURI());
msg.append("] QueryString: [" + request.getQueryString());
msg.append("]");
log.debug(msg);
}
try {
boolean precompile = preCompile(request);
serviceJspFile(request, response, jspUri, null, precompile);
} catch (RuntimeException e) {
// STARTS S1AS
incrementErrorCount();
// END S1AS
throw e;
} catch (ServletException e) {
// STARTS S1AS
incrementErrorCount();
// END S1AS
throw e;
} catch (IOException e) {
// STARTS S1AS
incrementErrorCount();
// END S1AS
throw e;
} catch (Throwable e) {
// STARTS S1AS
incrementErrorCount();
// END S1AS
throw new ServletException(e);
}
| private void | serviceJspFile(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, java.lang.String jspUri, java.lang.Throwable exception, boolean precompile)
JspServletWrapper wrapper =
(JspServletWrapper) rctxt.getWrapper(jspUri);
if (wrapper == null) {
synchronized(this) {
wrapper = (JspServletWrapper) rctxt.getWrapper(jspUri);
if (wrapper == null) {
// Check if the requested JSP page exists, to avoid
// creating unnecessary directories and files.
/* START PWC 6181923
if (null == context.getResource(jspUri)) {
*/
// START PWC 6181923
if (null == context.getResource(jspUri)
&& !options.getUsePrecompiled()) {
// END PWC 6181923
// START PWC 6300204
String includeRequestUri = (String)
request.getAttribute("javax.servlet.include.request_uri");
if (includeRequestUri != null) {
// Missing JSP resource has been the target of a
// RequestDispatcher.include().
// Throw an exception (rather than returning a
// 404 response error code), because any call to
// response.sendError() must be ignored by the
// servlet engine when issued from within an
// included resource (as per the Servlet spec).
throw new FileNotFoundException(jspUri);
}
// END PWC 6300204
/* RIMOD PWC 6282167, 4878272
response.sendError(HttpServletResponse.SC_NOT_FOUND,
jspUri);
*/
// START PWC 6282167, 4878272
response.sendError(HttpServletResponse.SC_NOT_FOUND);
log.error(Localizer.getMessage(
"jsp.error.file.not.found",
context.getRealPath(jspUri)));
// END PWC 6282167, 4878272
return;
}
boolean isErrorPage = exception != null;
wrapper = new JspServletWrapper(config, options, jspUri,
isErrorPage, rctxt);
rctxt.addWrapper(jspUri,wrapper);
}
}
}
wrapper.service(request, response, precompile);
| public void | setJspReloadCount(int count)Resets the JSP reload counter.
this.rctxt.setJspReloadCount(count);
|
|