/* * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright 1997-2008 Sun Microsystems, Inc. All rights reserved. * * The contents of this file are subject to the terms of either the GNU * General Public License Version 2 only ("GPL") or the Common Development * and Distribution License("CDDL") (collectively, the "License"). You * may not use this file except in compliance with the License. You can obtain * a copy of the License at https://glassfish.dev.java.net/public/CDDL+GPL.html * or glassfish/bootstrap/legal/LICENSE.txt. See the License for the specific * language governing permissions and limitations under the License. * * When distributing the software, include this License Header Notice in each * file and include the License file at glassfish/bootstrap/legal/LICENSE.txt. * Sun designates this particular file as subject to the "Classpath" exception * as provided by Sun in the GPL Version 2 section of the License file that * accompanied this code. If applicable, add the following below the License * Header, with the fields enclosed by brackets [] replaced by your own * identifying information: "Portions Copyrighted [year] * [name of copyright owner]" * * Contributor(s): * * If you wish your version of this file to be governed by only the CDDL or * only the GPL Version 2, indicate your decision by adding "[Contributor] * elects to include this software in this distribution under the [CDDL or GPL * Version 2] license." If you don't indicate a single choice of license, a * recipient has the option to distribute your version of this file under * either the CDDL, the GPL Version 2 or to extend the choice of license to * its licensees as provided above. However, if you add GPL Version 2 code * and therefore, elected the GPL Version 2 license, then the option applies * only if the new code is made subject to such option by the copyright * holder. * * * This file incorporates work covered by the following copyright and * permission notice: * * Copyright 2004 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package javax.servlet.jsp; import java.io.IOException; import javax.servlet.Servlet; import javax.servlet.ServletConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpSession; import javax.servlet.jsp.tagext.BodyContent; /** *
* PageContext extends JspContext to provide useful context information for * when JSP technology is used in a Servlet environment. *
* A PageContext instance provides access to all the namespaces associated * with a JSP page, provides access to several page attributes, as well as * a layer above the implementation details. Implicit objects are added * to the pageContext automatically. * *
The PageContext
class is an abstract class, designed to be
* extended to provide implementation dependent implementations thereof, by
* conformant JSP engine runtime environments. A PageContext instance is
* obtained by a JSP implementation class by calling the
* JspFactory.getPageContext() method, and is released by calling
* JspFactory.releasePageContext().
*
*
An example of how PageContext, JspFactory, and other classes can be * used within a JSP Page Implementation object is given elsewhere. * *
* The PageContext provides a number of facilities to the page/component * author and page implementor, including: *
Methods Intended for Container Generated Code *
Some methods are intended to be used by the code generated by the * container, not by code written by JSP page authors, or JSP tag library * authors. *
The methods supporting lifecycle are initialize()
* and release()
*
*
* The following methods enable the management of nested JspWriter
* streams to implement Tag Extensions: pushBody()
*
*
Methods Intended for JSP authors *
* The following methods provide convenient access to implicit objects:
* getException()
, getPage()
* getRequest()
, getResponse()
,
* getSession()
, getServletConfig()
* and getServletContext()
.
*
*
* The following methods provide support for forwarding, inclusion
* and error handling:
* forward()
, include()
,
* and handlePageException()
.
*/
abstract public class PageContext
extends JspContext
{
/**
* Sole constructor. (For invocation by subclass constructors,
* typically implicit.)
*/
public PageContext() {
}
/**
* Page scope: (this is the default) the named reference remains available
* in this PageContext until the return from the current Servlet.service()
* invocation.
*/
public static final int PAGE_SCOPE = 1;
/**
* Request scope: the named reference remains available from the
* ServletRequest associated with the Servlet until the current request
* is completed.
*/
public static final int REQUEST_SCOPE = 2;
/**
* Session scope (only valid if this page participates in a session):
* the named reference remains available from the HttpSession (if any)
* associated with the Servlet until the HttpSession is invalidated.
*/
public static final int SESSION_SCOPE = 3;
/**
* Application scope: named reference remains available in the
* ServletContext until it is reclaimed.
*/
public static final int APPLICATION_SCOPE = 4;
/**
* Name used to store the Servlet in this PageContext's nametables.
*/
public static final String PAGE = "javax.servlet.jsp.jspPage";
/**
* Name used to store this PageContext in it's own name table.
*/
public static final String PAGECONTEXT = "javax.servlet.jsp.jspPageContext";
/**
* Name used to store ServletRequest in PageContext name table.
*/
public static final String REQUEST = "javax.servlet.jsp.jspRequest";
/**
* Name used to store ServletResponse in PageContext name table.
*/
public static final String RESPONSE = "javax.servlet.jsp.jspResponse";
/**
* Name used to store ServletConfig in PageContext name table.
*/
public static final String CONFIG = "javax.servlet.jsp.jspConfig";
/**
* Name used to store HttpSession in PageContext name table.
*/
public static final String SESSION = "javax.servlet.jsp.jspSession";
/**
* Name used to store current JspWriter in PageContext name table.
*/
public static final String OUT = "javax.servlet.jsp.jspOut";
/**
* Name used to store ServletContext in PageContext name table.
*/
public static final String APPLICATION = "javax.servlet.jsp.jspApplication";
/**
* Name used to store uncaught exception in ServletRequest attribute
* list and PageContext name table.
*/
public static final String EXCEPTION = "javax.servlet.jsp.jspException";
/**
*
* The initialize method is called to initialize an uninitialized PageContext * so that it may be used by a JSP Implementation class to service an * incoming request and response within it's _jspService() method. * *
* This method is typically called from JspFactory.getPageContext() in * order to initialize state. * *
* This method is required to create an initial JspWriter, and associate * the "out" name in page scope with this newly created object. * *
* This method should not be used by page or tag library authors. * * @param servlet The Servlet that is associated with this PageContext * @param request The currently pending request for this Servlet * @param response The currently pending response for this Servlet * @param errorPageURL The value of the errorpage attribute from the page * directive or null * @param needsSession The value of the session attribute from the * page directive * @param bufferSize The value of the buffer attribute from the page * directive * @param autoFlush The value of the autoflush attribute from the page * directive * * @throws IOException during creation of JspWriter * @throws IllegalStateException if out not correctly initialized * @throws IllegalArgumentException If one of the given parameters * is invalid */ abstract public void initialize(Servlet servlet, ServletRequest request, ServletResponse response, String errorPageURL, boolean needsSession, int bufferSize, boolean autoFlush) throws IOException, IllegalStateException, IllegalArgumentException; /** *
* This method shall "reset" the internal state of a PageContext, releasing * all internal references, and preparing the PageContext for potential * reuse by a later invocation of initialize(). This method is typically * called from JspFactory.releasePageContext(). * *
* Subclasses shall envelope this method. * *
* This method should not be used by page or tag library authors. * */ abstract public void release(); /** * The current value of the session object (an HttpSession). * * @return the HttpSession for this PageContext or null */ abstract public HttpSession getSession(); /** * The current value of the page object (In a Servlet environment, * this is an instance of javax.servlet.Servlet). * * @return the Page implementation class instance associated * with this PageContext */ abstract public Object getPage(); /** * The current value of the request object (a ServletRequest). * * @return The ServletRequest for this PageContext */ abstract public ServletRequest getRequest(); /** * The current value of the response object (a ServletResponse). * * @return the ServletResponse for this PageContext */ abstract public ServletResponse getResponse(); /** * The current value of the exception object (an Exception). * * @return any exception passed to this as an errorpage */ abstract public Exception getException(); /** * The ServletConfig instance. * * @return the ServletConfig for this PageContext */ abstract public ServletConfig getServletConfig(); /** * The ServletContext instance. * * @return the ServletContext for this PageContext */ abstract public ServletContext getServletContext(); /** *
* This method is used to re-direct, or "forward" the current * ServletRequest and ServletResponse to another active component in * the application. *
*
* If the relativeUrlPath begins with a "/" then the URL specified
* is calculated relative to the DOCROOT of the ServletContext
* for this JSP. If the path does not begin with a "/" then the URL
* specified is calculated relative to the URL of the request that was
* mapped to the calling JSP.
*
* It is only valid to call this method from a Thread
* executing within a _jspService(...)
method of a JSP.
*
* Once this method has been called successfully, it is illegal for the
* calling Thread
to attempt to modify the
* ServletResponse
object. Any such attempt to do so, shall result
* in undefined behavior. Typically, callers immediately return from
* _jspService(...)
after calling this method.
*
ServletResponse
is not
* in a state where a forward can be performed
* @throws ServletException if the page that was forwarded to throws
* a ServletException
* @throws IOException if an I/O error occurred while forwarding
*/
abstract public void forward(String relativeUrlPath)
throws ServletException, IOException;
/**
* * Causes the resource specified to be processed as part of the current * ServletRequest and ServletResponse being processed by the calling Thread. * The output of the target resources processing of the request is written * directly to the ServletResponse output stream. *
** The current JspWriter "out" for this JSP is flushed as a side-effect * of this call, prior to processing the include. *
*
* If the relativeUrlPath begins with a "/" then the URL specified
* is calculated relative to the DOCROOT of the ServletContext
* for this JSP. If the path does not begin with a "/" then the URL
* specified is calculated relative to the URL of the request that was
* mapped to the calling JSP.
*
* It is only valid to call this method from a Thread
* executing within a _jspService(...)
method of a JSP.
*
* Causes the resource specified to be processed as part of the current * ServletRequest and ServletResponse being processed by the calling Thread. * The output of the target resources processing of the request is written * directly to the current JspWriter returned by a call to getOut(). *
** If flush is true, The current JspWriter "out" for this JSP * is flushed as a side-effect of this call, prior to processing * the include. Otherwise, the JspWriter "out" is not flushed. *
*
* If the relativeUrlPath begins with a "/" then the URL specified
* is calculated relative to the DOCROOT of the ServletContext
* for this JSP. If the path does not begin with a "/" then the URL
* specified is calculated relative to the URL of the request that was
* mapped to the calling JSP.
*
* It is only valid to call this method from a Thread
* executing within a _jspService(...)
method of a JSP.
*
* This method is intended to process an unhandled 'page' level * exception by forwarding the exception to the specified * error page for this JSP. If forwarding is not possible (for * example because the response has already been committed), an * implementation dependent mechanism should be used to invoke * the error page (e.g. "including" the error page instead). * *
* If no error page is defined in the page, the exception should * be rethrown so that the standard servlet error handling * takes over. * *
* A JSP implementation class shall typically clean up any local state * prior to invoking this and will return immediately thereafter. It is * illegal to generate any output to the client, or to modify any * ServletResponse state after invoking this call. * *
* This method is kept for backwards compatiblity reasons. Newly * generated code should use PageContext.handlePageException(Throwable). * * @param e the exception to be handled * * @throws ServletException if an error occurs while invoking the error page * @throws IOException if an I/O error occurred while invoking the error * page * @throws NullPointerException if the exception is null * * @see #handlePageException(Throwable) */ abstract public void handlePageException(Exception e) throws ServletException, IOException; /** *
* This method is intended to process an unhandled 'page' level * exception by forwarding the exception to the specified * error page for this JSP. If forwarding is not possible (for * example because the response has already been committed), an * implementation dependent mechanism should be used to invoke * the error page (e.g. "including" the error page instead). * *
* If no error page is defined in the page, the exception should * be rethrown so that the standard servlet error handling * takes over. * *
* This method is intended to process an unhandled "page" level exception * by redirecting the exception to either the specified error page for this * JSP, or if none was specified, to perform some implementation dependent * action. * *
* A JSP implementation class shall typically clean up any local state * prior to invoking this and will return immediately thereafter. It is * illegal to generate any output to the client, or to modify any * ServletResponse state after invoking this call. * * @param t the throwable to be handled * * @throws ServletException if an error occurs while invoking the error page * @throws IOException if an I/O error occurred while invoking the error * page * @throws NullPointerException if the exception is null * * @see #handlePageException(Exception) */ abstract public void handlePageException(Throwable t) throws ServletException, IOException; /** * Return a new BodyContent object, save the current "out" JspWriter, * and update the value of the "out" attribute in the page scope * attribute namespace of the PageContext. * * @return the new BodyContent */ public BodyContent pushBody() { return null; // XXX to implement } /** * Provides convenient access to error information. * * @return an ErrorData instance containing information about the * error, as obtained from the request attributes, as per the * Servlet specification. If this is not an error page (that is, * if the isErrorPage attribute of the page directive is not set * to "true"), the information is meaningless. * * @since JSP 2.0 */ public ErrorData getErrorData() { return new ErrorData( (Throwable)getRequest().getAttribute( "javax.servlet.error.exception" ), ((Integer)getRequest().getAttribute( "javax.servlet.error.status_code" )).intValue(), (String)getRequest().getAttribute( "javax.servlet.error.request_uri" ), (String)getRequest().getAttribute( "javax.servlet.error.servlet_name" ) ); } }