File: PageContext.java

package info (click to toggle)
tomcat9 9.0.95-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 45,952 kB
  • sloc: java: 371,527; xml: 67,915; jsp: 4,588; sh: 1,225; perl: 314; makefile: 18; ansic: 15
file content (445 lines) | stat: -rw-r--r-- 18,949 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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.RequestDispatcher;
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;

/**
 * <p>
 * PageContext extends JspContext to provide useful context information for when JSP technology is used in a Servlet
 * environment.
 * <p>
 * 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.
 * <p>
 * The <code> PageContext </code> 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().
 * <p>
 * An example of how PageContext, JspFactory, and other classes can be used within a JSP Page Implementation object is
 * given elsewhere.
 * <p>
 * The PageContext provides a number of facilities to the page/component author and page implementor, including:
 * <ul>
 * <li>a single API to manage the various scoped namespaces
 * <li>a number of convenience API's to access various public objects
 * <li>a mechanism to obtain the JspWriter for output
 * <li>a mechanism to manage session usage by the page
 * <li>a mechanism to expose page directive attributes to the scripting environment
 * <li>mechanisms to forward or include the current request to other active components in the application
 * <li>a mechanism to handle errorpage exception processing
 * </ul>
 * <p>
 * <B>Methods Intended for Container Generated Code</B>
 * <p>
 * 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.
 * <p>
 * The methods supporting <B>lifecycle</B> are <code>initialize()</code> and <code>release()</code>
 * <p>
 * The following methods enable the <B>management of nested</B> JspWriter streams to implement Tag Extensions:
 * <code>pushBody()</code>
 * <p>
 * <B>Methods Intended for JSP authors</B>
 * <p>
 * The following methods provide <B>convenient access</B> to implicit objects: <code>getException()</code>,
 * <code>getPage()</code> <code>getRequest()</code>, <code>getResponse()</code>, <code>getSession()</code>,
 * <code>getServletConfig()</code> and <code>getServletContext()</code>.
 * <p>
 * The following methods provide support for <B>forwarding, inclusion and error handling</B>: <code>forward()</code>,
 * <code>include()</code>, and <code>handlePageException()</code>.
 */
public abstract class PageContext extends JspContext {

    /**
     * Sole constructor. (For invocation by subclass constructors, typically implicit.)
     */
    public PageContext() {
        // NOOP by default
    }

    /**
     * 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";

    /**
     * <p>
     * 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.
     * <p>
     * This method is typically called from JspFactory.getPageContext() in order to initialize state.
     * <p>
     * This method is required to create an initial JspWriter, and associate the "out" name in page scope with this
     * newly created object.
     * <p>
     * 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
     */

    public abstract void initialize(Servlet servlet, ServletRequest request, ServletResponse response,
            String errorPageURL, boolean needsSession, int bufferSize, boolean autoFlush)
            throws IOException, IllegalStateException, IllegalArgumentException;

    /**
     * <p>
     * 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().
     * <p>
     * Subclasses shall envelope this method.
     * <p>
     * This method should not be used by page or tag library authors.
     */

    public abstract void release();

    /**
     * The current value of the session object (an HttpSession).
     *
     * @return the HttpSession for this PageContext or null
     */

    public abstract 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
     */

    public abstract Object getPage();


    /**
     * The current value of the request object (a ServletRequest).
     *
     * @return The ServletRequest for this PageContext
     */

    public abstract ServletRequest getRequest();

    /**
     * The current value of the response object (a ServletResponse).
     *
     * @return the ServletResponse for this PageContext
     */

    public abstract ServletResponse getResponse();

    /**
     * The current value of the exception object (an Exception).
     *
     * @return any exception passed to this as an errorpage
     */

    public abstract Exception getException();

    /**
     * The ServletConfig instance.
     *
     * @return the ServletConfig for this PageContext
     */

    public abstract ServletConfig getServletConfig();

    /**
     * The ServletContext instance.
     *
     * @return the ServletContext for this PageContext
     */

    public abstract ServletContext getServletContext();

    /**
     * <p>
     * This method is used to re-direct, or "forward" the current ServletRequest and ServletResponse to another active
     * component in the application.
     * </p>
     * <p>
     * If the <I> relativeUrlPath </I> begins with a "/" then the URL specified is calculated relative to the DOCROOT of
     * the <code> ServletContext </code> 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.
     * </p>
     * <p>
     * It is only valid to call this method from a <code> Thread </code> executing within a
     * <code> _jspService(...) </code> method of a JSP.
     * </p>
     * <p>
     * Once this method has been called successfully, it is illegal for the calling <code> Thread </code> to attempt to
     * modify the <code>
     * ServletResponse </code> object. Any such attempt to do so, shall result in undefined behavior. Typically, callers
     * immediately return from <code> _jspService(...) </code> after calling this method.
     * </p>
     *
     * @param relativeUrlPath specifies the relative URL path to the target resource as described above
     *
     * @throws IllegalStateException if <code> ServletResponse </code> 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
     */

    public abstract void forward(String relativeUrlPath) throws ServletException, IOException;

    /**
     * <p>
     * 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.
     * </p>
     * <p>
     * The current JspWriter "out" for this JSP is flushed as a side-effect of this call, prior to processing the
     * include.
     * </p>
     * <p>
     * If the <I> relativeUrlPath </I> begins with a "/" then the URL specified is calculated relative to the DOCROOT of
     * the <code>ServletContext</code> 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.
     * </p>
     * <p>
     * It is only valid to call this method from a <code> Thread </code> executing within a
     * <code> _jspService(...) </code> method of a JSP.
     * </p>
     *
     * @param relativeUrlPath specifies the relative URL path to the target resource to be included
     *
     * @throws ServletException if the page that was forwarded to throws a ServletException
     * @throws IOException      if an I/O error occurred while forwarding
     */
    public abstract void include(String relativeUrlPath) throws ServletException, IOException;

    /**
     * <p>
     * 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().
     * </p>
     * <p>
     * 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.
     * </p>
     * <p>
     * If the <i>relativeUrlPath</i> begins with a "/" then the URL specified is calculated relative to the DOCROOT of
     * the <code>ServletContext</code> 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.
     * </p>
     * <p>
     * It is only valid to call this method from a <code> Thread </code> executing within a
     * <code> _jspService(...) </code> method of a JSP.
     * </p>
     *
     * @param relativeUrlPath specifies the relative URL path to the target resource to be included
     * @param flush           True if the JspWriter is to be flushed before the include, or false if not.
     *
     * @throws ServletException if the page that was forwarded to throws a ServletException
     * @throws IOException      if an I/O error occurred while forwarding
     *
     * @since JSP 2.0
     */
    public abstract void include(String relativeUrlPath, boolean flush) throws ServletException, IOException;

    /**
     * <p>
     * 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).
     * <p>
     * If no error page is defined in the page, the exception should be rethrown so that the standard servlet error
     * handling takes over.
     * <p>
     * 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.
     * <p>
     * This method is kept for backwards compatibility 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)
     */

    public abstract void handlePageException(Exception e) throws ServletException, IOException;

    /**
     * <p>
     * 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).
     * <p>
     * If no error page is defined in the page, the exception should be rethrown so that the standard servlet error
     * handling takes over.
     * <p>
     * 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.
     * <p>
     * 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)
     */

    public abstract 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() {
        int status = 0;

        Integer status_code = (Integer) getRequest().getAttribute(RequestDispatcher.ERROR_STATUS_CODE);
        // Avoid NPE if attribute is not set
        if (status_code != null) {
            status = status_code.intValue();
        }

        return new ErrorData((Throwable) getRequest().getAttribute(RequestDispatcher.ERROR_EXCEPTION), status,
                (String) getRequest().getAttribute(RequestDispatcher.ERROR_REQUEST_URI),
                (String) getRequest().getAttribute(RequestDispatcher.ERROR_SERVLET_NAME));
    }

}