Professional Documents
Culture Documents
The include action version is a dynamic include it is a full JSP that is executed, and
its output is included in the parent JSP. The include page is done at request-time.
The include action should be used to include static/dynamic content.
Include Directive
<%@ include file="relativeURL" %>
pagejava.lang.Object
The page object represents the generated servlet instance itself, i.e., it is same as
the "this" keyword used in a Java file. As a result, you do not typically know who the
super class is, and consequently do not normally make use of this object or its
methods.
The pageContext object represents the environment for the page, containing useful
information like page attributes, access to the request, response and session
objects, as well as the JspWriter referenced by out.
pageContextjavax.servlet.jsp.PageContext
1
A JSP page services requests as a servlet.
• jspInit(): The container calls the jspInit() to initialize the servlet instance. It is
called before any other method, and is called only once for a servlet instance.
• _jspService(): The container calls the _jspService() for each request and it passes
the request and the response objects. _jspService() method cann?t be overridden.
• jspDestroy(): The container calls this when its instance is about to destroyed.
The jspInit() and jspDestroy() methods can be overridden within a JSP page.
These methods are generated after JSP page translated and compiled, the JSP pages's servlet
follows the servlet life-cycle:
• If an instance of the JSP page's servlet does not exist, the container
o Loads the JSP page's servlet class
o Instantiates an instance of the servlet class
o Initializes the servlet instance by calling the jspInit method
• The container invokes the _jspService method, passing request and response objects.
If the container needs to remove the JSP page's servlet, it calls the jspDestroy method.
• JSP scriptlet (i.e., <% scriptlet %>) and experssion (i.e., <%= expression%>), when
translated into a servlet, will end up in the body of doGet or doPost method.
• JSP declaration (i.e., <%! declaration %>), when translated into a servlet, will end up
being instance variables or methods in the servlet class.
• A variable defined inside of a JSP declaration could translate to an instance variable and a
variable defined inside of a JSP scriptlet could translate to a local variable in doGet or
doPost method.
• You may have jspInit() or jspDestroy() methods defined in the JSP declaration.
They are equivalent to Servlet's init() and destory() methods.
JSP pages are compiled dynamically into servlets when requested, so page authors
can easily make updates to presentation code. JSP pages can also be precompiled if
desired.
2
JSP handle runtime exceptions
<%@ page errorPage="error.jsp" %>
<%@ page isErrorPage="true" %>
<%= exception.getMessage() %>
<%
ByteArrayOutputStream baos = new ByteArrayOutputStream();
exception.printStackTrace(new PrintStream(baos));
out.print(baos);
%>
When an error page is also indicated in the web.xml descriptor, the JSP error page
applies first, then the web.xml.
You can not override the _jspService() method within a JSP page. You can however,
override the jspInit() and jspDestroy() methods within a JSP page. jspInit() may
be overridden to perform some initialization task i.e., allocating resources like
database connections, network connections, and so forth for the JSP page.
jspDestroy() may be overridden to manually release some resorces that the jsp file
is holding.
The jspInit() and jspDestroy() methods are each executed just once during the lifecycle of a JSP
page and are typically declared as JSP declarations:
<%!
public void jspInit() {
. . .
}
%>
<%!
public void jspDestroy() {
. . .
}
%>
The jspDestroy() method is only called when the JSP container is shut down, not after
processing each request. It doesn't have access to any of the implicit JSP objects (since they are
local variables in the _jspService() method).
The response object handles the output to the client. This object can be used for
creating HTTP Headers, creating cookies, setting content type and redirecting
workflow.
3
Bascilly, the <jsp:include page=... /> happens at runtime but <%@ include
file=... %> happens at compile time. <jsp:include> simply passes control to a
different page for a while. Under <jsp:include>, the two pages share 'request' scope
but have a different 'page' scope.
Servlets are well suited for dynamically generating binary data such as images or a
new content type.
the implicit objects are not available in declarative part of JSP. JSP pages are translated into
servlets and then they are compiled before they can be viewed. Declaring a variable in a JSP
page means that the variable will become a (non static) class attribute in the corresponding
servlet. At the time when the servlet is compiled, there is no such thing as a request because a
request can't come in until after the servlet is compiled and made available by the container.
In other words, request is a input parameter for the _jspService() method, therefore can only
be accessed within _jspService() method.
Note that the exception object is created only if the JSP uses the page directive to
set isErrorPage set to true. When a JSP generates an error and forwards that error
to the error page, it sets the JSP exception object of the error page to the generated
error
First page
ErrorPage.jsp
There are two kind of errors, compile-time errors and Runtime errors, can occur in the JSP
lifecycle:
• Compile-time errors : Compile-time errors occur when a client first invokes a JSP. JRun
transforms the JSP into its XML view, and then compiles a servlet from the XML view. If
an error occurs at any time during this process, a compile-time error is thrown. You must
catch that error outside of the JSP. However, if you do not test or precompile the JSP, you
might not catch the error at all.
• Runtime errors : Runtime errors occur when a JSP successfully compiles but then tries to
process code that contains an invalid statement; for example, when you try to include a
4
nonexistent file. Runtime errors are easy to handle because you know that the JSP
compiled successfully, you just need to catch the error and examine the output.
Cookies are stored on the server and referenced with a session ID that is passed
back and forth between the client and the server. Cookies are a general mechanism
used by server-side applications to store information in individual browsers. The
server-side application can retrieve cookies stored in a browser. With cookies, your
web application can create specific variables for each browser. Such variables might
include a user name or the last-accessed date. Cookies provide a persistence
mechanism that you can use to compensate for the HTTP protocol stateless nature.
<%
out.println("Cookies received by the server:
");
So if your starting page is a JSP, a session would have already been created when
you get the first request.
This will prevent a session from being created when a JSP is served.
If "true" then the implicit script language variable named "session" of type
javax.servlet.http.HttpSession reference the current/new session for the page. If
"false" then the page does not participate in a session; the "session" implicit
variable is unavailable, and any reference to it within the body of the JSP page is
illegal and shall result in a fatal translation error. Default is "true".
5
A JavaBean is basically a Java class which satisfies a few simple rules (it must have
a public no-arg constructor, no public instance variables, properties have getters
and setters; actually, you can get around the last rule by supplying a BeanInfo
object for your bean).
getServletConfig().getServletContext().getRealPath(request.getServletPath());
//returns file name and path
application.getRealPath(request.getServletPath()); //returns file name and
path
this.getClass().getName(); //returns the class name
The request.getSession() returns the current HttpSession associated with this request, or
if the request does not have a session, creates one new session.
request.getParameter() always returns String value and the data come from client.
request.getAttribute() to get an object added to the request scope on the server
side i.e. using request.setAttribute().
and second.jsp
The basic difference between getAttribute() and getParameter() is that the first
method extracts a (serialized) Java object and the other provides a String value.
6
Implicit objects are a set of Java objects that the JSP Container makes available to
developers in each page. These objects may be accessed as built-in variables via
scripting elements and can also be accessed programmatically by JavaBeans and
Servlets. The implicit objects are created automatically for you within the service
method.
The target file can be an HTML file, another JSP file, or a servlet, as long as it is in
the same application context as the forwarding JSP file. The lines in the source JSP
file after the <jsp:forward> element are not processed.
The page invoked by the <jsp:forward> action has access to all the parameters in the original
request object. You can add new parameters to the request object to pass to the target page by
using the <jsp:param name="..." value="..." />.
Be careful when using <jsp:forward> with unbuffered output. If the JSP file has any data in the
out object, using will cause an IllegalStateException.
The response.sendRedirect() creates a new request object which doesn't carry any
of old requests. The first request handler JSP page tells the browser to make a new
request to the target servlet or JSP page. The URL shown in the browser therefore
changes to the URL of the new page when you redirect.
A redirect is slower than a forward because the browser has to make a new request. Another
difference is that request scope objects are no longer available after a redirect because it results
in a new request. If you need to pass data to the page you redirect to, you have to use a query
string and pass them as request parameters (or save the data as session or application scope
objects).
7
Forward is faster than redirect but one disadvantage is that URL is not changed and also it works
with in same web application. Also, when you choice to use forward, you need to ask what
happens if the user reloads the page.
• Expressions of the form <%= expression%> that are evaluated and inserted into output,
• Scriptlets of the form <% code %> that are inserted into the servlets service method, and
• Declarations of the form <%! code %> that are inserted into the body of the servlet class,
outside of any existing methods.
implicit objects
Object Class or Interface Description & Scope
request http.HttpServletRequest
Data included with the HTTP Request.
request scope.
response http.HttpServletResponse
HTTP Response data, e.g. cookies. page
scope.
Provides access to all the namespaces
pageContext jsp.pageContext associated with a JSP page and access to
several page attributes. page scope.
session http.HttpSession User specific session data. session scope.
application ServletContext
Data shared by all application pages.
application scope.
out jsp.JspWriter
Output stream for page context. page
scope.
config ServletConfig
Servlet configuration information. page
scope.
page jsp.HttpJspPage Page's servlet instance. page scope.
Note that the implicit variables are only available within the jspService method and
thus are not available within any declarations.
If you want to use the characters "%>" inside a scriptlet, enter "%\>" instead.
• You must end the declaration with a semicolon (the same rule as for a Scriptlet, but the
opposite of an Expression).
• <% int i = 0;%>
• You can already use variables or methods that are declared in packages imported by the
page directive, without declaring them in a declaration element.
• You can declare any number of variables or methods within one declaration element, as
long as you end each declaration with a semicolon. The declaration must be valid in the
Java programming language.
• <% int i = 0; long l = 5L; %>
For example,
The effect of this declaration is to create an integer variable named counter that is shared by all
instances of the page's servlet class. If any one instance changes the value of this variable , all
instances see the new value. In practice, because the JSP container typically creates only one
9
instance of the servlet class representing a particular JSP page, there is a little difference between
declaring instance variables and class variables. The major exception to this rule is when a JSP
page sets the isThreadSafe attribute of the page directive to false, indicating that the page is
not thread-safe. In this case, the JSP container may create multiple instances of the page's servlet
class, in order to handle multiple simultaneous requests,one request per instance. Now to share a
variable 's value across multiple requests under these circumstances, the variable must be
declared as static: class variable , rather than an instance variable.
When the isThreadSafe attribute is true, which is default, however , it makes little practical
difference. Declaring as instance variable saves a little bit typing.
The request object retrieves the values that the client browser passed to the server
during an HTTP request such as headers, cookies or parameters associated with the
request.
The request object retrieves the values that the client browser passed to the server
during an HTTP request such as headers, cookies or parameters associated with the
request.The response can be used for the same purposes as the
10
HttpServletResponse in a servlet, such as creating HTTP Headers, creating cookies,
setting content type and redirecting workflow.
<%
}
%>
</body>
</html>
• If it is a JSP then just use the encodeURL method to generate the new window
URL. Something like the following for your url:
• <%=response.encodeURL(...)%>
all that does is put the session id on the end of the url as an additional
name/value pair in the query.
• If it is an HTML page then how is it generated? If it just a static file then I dont
think you can get the session info to it, you'll have to change the page to be
11
generated by a JSP or servlet. If it is already generated by a servlet you can
jst use the encodeURL method to create the URL and place it in the
generated page.
<p>
The session timeout is: <%=session.getMaxInactiveInterval()%>
</p>
<%
session.setMaxInactiveInterval(3000);
%>
<p>
The session timeout has been set to: <%=session.getMaxInactiveInterval()%>
</p>
So if you are using a JSP as the starting point try adding this decaration to your page:
This will prevent a session from being created when a JSP is served.
It's important to note, though, that if you store objects in the application, session,
request or page contexts, they are not guaranteed to be thread safe. The response
and exception objects are created for the current thread and therefore they are
safe.
Although the request and page objects themselves are threadsafe, objects stored in
them are only safe if they are not also used by other threads. Remember that one of
these contexts only stores a reference to an object, not a separate copy of it.
For example, if you create a completely new object in the method, and place it in the request
context, it will be threadsafe:
<%
String name = new String("Kevin");
request.setAttribute("user", name);
%>
If you use an existing object which is also present in one of the unsafe contexts (application or
session), it will not be threadsafe:
<%
String name = (String)session.getAttribute("name");
request.setAttribute("user", name);
%>
12
If you use an existing object which is a static (class) or member (instance) variable in the servlet
class, it will not be threadsafe:
<%!
String name = (String)session.getAttribute("name");
%>
<%
request.setAttribute("user", name);
%>
The JSP page by default is not thread safe, if you want to make it thread safe then you have add
the following directive in your JSP page declaration:
With this, instead of a single instance of the servlet generated for your JSP page
loaded in memory, you will have N instances of the servlet loaded and initialized,
with the service method of each instance effectively synchronized. You can typically
control the number of instances (N) that are instantiated for all servlets
implementing SingleThreadModel through the admin screen for your JSP engine.
JSPs are normally perfectly thread-safe, since your run of the JSP does not hold any state
(member variables).
For example, if you happen to use <%! %>, this will place the code in class level and not in the
_jspService method. You introduce class member into the JSP object that makes JSP becomes
thread-unsafe.
If your JSP is not thread-safe you will have to add the isThreadSafe=false in order for things
to work correctly. Such way, it does not make your JSP thread-safe but it does make your web
application thread-safe by instructing the servlet container to cater for the thread-unsafety of
your JSP:
13
Note that even if the isThreadSafe attribute is false the JSP page author must
ensure that accesses to any shared objects are properly synchronized., The objects
may be shared in either the ServletContext or the HttpSession
The page implicit object is of type Object and it is assigned a reference to the servlet
that executing the _jspService() method. Page is the instance of the JSP page's
servlet processing the current request.
Since page is a variable of type Object, it cannot be used to directly call the servlet methods. To
access any of the methods of the servlet through page it must be first cast to type Servlet.
But the following code will generate error, because can not use page directly without casting:
The config can be used to retrieve the configuration parameters that are specific to a JSP page.
These parameters are set up within the deployment descriptor.
The config object can be used to retrieve the ServletContext object through its
getServletContext() method. Thus the following code retrieves information about the
currently executing server, and in my own setup it generates the output.
<%
ServletContext ct = config.getServletContext();
out.print(ct.getServerInfo());
%>
<web-app>
<context-param>
<param-name>applparam</param-name>
<param-value>applvalue</param-value>
</context-param>
<servlet>
<servlet-name>TestServlet</servlet-name>
<jsp-file>/index.jsp</jsp-file>
<init-param>
14
<param-name>pageparam</param-name>
<param-value>pagevalue</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/test.jsp</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>TestServlet1</servlet-name>
<jsp-file>/test1.jsp</jsp-file>
</servlet>
<servlet-mapping>
<servlet-name>TestServlet1</servlet-name>
<url-pattern>/test1.jsp</url-pattern>
</servlet-mapping>
</web-app>
<%
out.print(application.getInitParameter("applparam"));
out.print(config.getInitParameter("pageparam"));
%>
<%
out.print(application.getInitParameter("applparam"));
out.print(config.getInitParameter("pageparam")); //null
%>
The out implicit object is used for writing data to the output stream and is an object
of type javax.servlet.jsp.JspWriter.
JSP page authors are prohibited from writing directly to either the PrintWriter or OutputStream
associated with the ServletResponse.(See JavaServer Pages Specification Version 1.2): For
example, you can not use the following code in you JSP otherwise you will get compiling error:
15
A pageContext implicit object is used for storing and retrieving page-related information and
sharing objects within the same translation unit and same request. Also used as a convenience
class that maintains a table of all the other implicit objects.
• It stores referece to the implicit objects. The following example shows how
PageContext is used to populate other implicit objects.
• public void _jspService (HttpServletRequest request,
HttpServletResponse response)
• throws java.io.IOException, ServletException {
•
• ...
• try {
•
• ...
• application = pageContext.getServletContext ();
• config = pageContext.getServletConfig ();
• session = pageContext.getSession ();
• out = pageContext.getOut ();
• ...
•
• } catch (Throwable t) {
• ...
• } finally {
• ...
• }
• }
•
• Provides convenience methods to get and set attributes in different scopes. This
example uses attributes to save and retrieve data in each of the four scopes:
• <%
• // Save data
• pageContext.setAttribute("attr1", "value0"); // PAGE_SCOPE is the
default
• pageContext.setAttribute("attr2", "value1", PageContext.PAGE_SCOPE);
• pageContext.setAttribute("attr3", "value2",
PageContext.REQUEST_SCOPE);
• pageContext.setAttribute("attr4", "value3",
PageContext.SESSION_SCOPE);
• pageContext.setAttribute("attr5", "value4",
PageContext.APPLICATION_SCOPE);
• %>
•
• <%-- Show the values --%>
• <%= pageContext.getAttribute("attr1") %>
• <%= pageContext.getAttribute("attr2", PageContext.PAGE_SCOPE) %>
• <%= pageContext.getAttribute("attr3", PageContext.REQUEST_SCOPE) %>
• <%= pageContext.getAttribute("attr4", PageContext.SESSION_SCOPE) %>
• <%= pageContext.getAttribute("attr5", PageContext.APPLICATION_SCOPE) %>
16
• Provides convenience methods for transferring requests to other resources in
your application:
PageContext
void include Includes the output of another
(String
resource in the output of the current
relativeURL)
page.
Same as
ServletRequest.getRequestDispatcher
().include ();
void forward Forwards the request to another
(String
resource.
relativeURL)
Same as
ServletRequest.getRequestDispatcher
().forward ();
• For example, to forward a request to another resource from a servlet, we have to write the
following to lines:
• RequestDispatcher rd = request.getRequestDispatcher ("other.jsp");
rd.forward (request, response);
• In a JSP page, we can do that in just one line by using the pageContext variable:
• pageContext.forward ("other.jsp");
17