Académique Documents
Professionnel Documents
Culture Documents
Example 1
<!-- This is a commnet sent to client on
<%= (new java.util.Date()).toLocaleString() %>
-->
You can use any characters in the body of the comment except the closing --%>
combination. If you need to use --%> in your comment, you can escape it by
typing --%\>.
JSP Syntax
<%-- comment --%>
Examples
<%@ page language="java" %>
<html>
<head><title>A Hidden Comment </title></head>
<body>
<%-- This comment will not be visible to the colent in the page source --%>
</body>
</html>
TOP
Q:What is a Expression?
A: An expression tag contains a scripting language expression that is evaluated,
converted to a String, and inserted where the expression appears in the JSP file.
Because the value of an expression is converted to a String, you can use an
expression within text in a JSP file. Like
<%= someexpression %>
<%= (new java.util.Date()).toLocaleString() %>
You cannot use a semicolon to end an expression
TOP
2
Q:What is a Declaration?
A: A declaration declares one or more variables or methods for use later in the JSP
source file.
A declaration must contain at least one complete declarative statement. You can
declare any number of variables or methods within one declaration tag, as long as
they are separated by semicolons. The declaration must be valid in the scripting
language used in the JSP file.
Q:What is a Scriptlet?
A: A scriptlet can contain any number of language statements, variable or method
declarations, or expressions that are valid in the page scripting language.Within
scriptlet tags, you can
1.Declare variables or methods to use later in the file (see also Declaration).
2.Write expressions valid in the page scripting language (see also Expression).
3.Use any of the JSP implicit objects or any object declared with a <jsp:useBean>
tag.
You must write plain text, HTML-encoded text, or other JSP tags outside the
scriptlet.
Scriptlets are executed at request time, when the JSP engine processes the client
request. If the scriptlet produces output, the output is stored in the out object,
from which you can display it.
TOP
• exception
TOP
3
1. page
2. request
3.session
4.application
TOP
<%
response.setHeader("Cache-Control","no-store"); //HTTP 1.1
response.setHeader("Pragma\","no-cache"); //HTTP 1.0
response.setDateHeader ("Expires", 0); //prevents caching at the proxy server
4
%>
Q:How can I implement a thread-safe JSP page? What are the advantages
and Disadvantages of using it?
A: You can make your JSPs thread-safe by having them implement the
SingleThreadModel interface. This is done by adding the directive <%@ page
isThreadSafe="false" %> within your JSP page. 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. More
importantly, avoid using the tag for variables. If you do use this tag, then you
should set isThreadSafe to true, as mentioned above. Otherwise, all requests to
that page will access those variables, causing a nasty race condition.
SingleThreadModel is not recommended for normal use. There are many pitfalls,
including the example above of not being able to use <%! %>. You should try
really hard to make them thread-safe the old fashioned way: by making them
thread-safe .
[ Received from Sumit Dhamija ] TOP
The following example shows the “today” property of the Foo bean initialized to
the current date when it is instantiated. Note that here, we make use of a JSP
expression within the jsp:setProperty action.
%>" / >
</jsp:useBean >
Q:How can I prevent the word "null" from appearing in my HTML input text
fields when I populate them with a resultset that has null values?
A: You could make a simple wrapper function, like
<%!
String blanknull(String s) {
return (s == null) ? \"\" : s;
}
%>
Also, note that SingleThreadModel is pretty resource intensive from the server\'s
perspective. The most serious issue however is when the number of concurrent
requests exhaust the servlet instance pool. In that case, all the unserviced
requests are queued until something becomes free - which results in poor
performance. Since the usage is non-deterministic, it may not help much even if
you did add more memory and increased the size of the instance pool.
Q:How can I enable session tracking for JSP pages if the browser has
disabled cookies?
6
Consider the following example, in which two JSP files, say hello1.jsp and
hello2.jsp, interact with each other. Basically, we create a new session within
hello1.jsp and place an object within this session. The user can then traverse to
hello2.jsp by clicking on the link present within the page. Within hello2.jsp, we
simply extract the object that was earlier placed in the session and display its
contents. Notice that we invoke the encodeURL() within hello1.jsp on the link used
to invoke hello2.jsp; if cookies are disabled, the session ID is automatically
appended to the URL, allowing hello2.jsp to still retrieve the session object. Try
this example first with cookies enabled. Then disable cookie support, restart the
brower, and try again. Each time you should see the maintenance of the session
across pages. Do note that to get this example to work with cookies disabled at
the browser, your JSP engine has to support URL rewriting.
hello1.jsp
<%@ page session=\"true\" %>
<%
Integer num = new Integer(100);
session.putValue("num",num);
String url =response.encodeURL("hello2.jsp");
%>
<a href=\'<%=url%>\'>hello2.jsp</a>
hello2.jsp
<%@ page session="true" %>
<%
Integer i= (Integer )session.getValue("num");
out.println("Num value in session is " + i.intValue());
%>
[ Received from Vishal Khasgiwala ]
Q:Is there a way to execute a JSP from the comandline or from my own
application?
A: There is a little tool called JSPExecutor that allows you to do just that. The
developers (Hendrik Schreiber <hs@webapp.de> & Peter Rossbach
<pr@webapp.de>) aim was not to write a full blown servlet engine, but to provide
means to use JSP for generating source code or reports. Therefore most HTTP-
specific features (headers, sessions, etc) are not implemented, i.e. no reponseline
or header is generated. Nevertheless you can use it to precompile JSP for your
Explain the life cycle methods of a Servlet.
A: The javax.servlet.Servlet interface defines the three methods known as life-cycle
method.
public void init(ServletConfig config) throws ServletException
public void service( ServletRequest req, ServletResponse res) throws
ServletException, IOException
public void destroy()
First the servlet is constructed, then initialized wih the init() method.
Any request from client are handled initially by the service() method before
delegating to the doXxx() methods in the case of HttpServlet.
The servlet is removed from service, destroyed with the destroy() methid, then
garbaged collected and finalized.
TOP
SSL sessions
URL- rewriting
TOP
Q:Explain ServletContext.
A: ServletContext interface is a window for a servlet to view it's environment. A
servlet can use this interface to get information such as initialization parameters
for the web applicationor servlet container's version. Every web application has
one and only one ServletContext and is accessible to all active resource of that
application.
TOP
ServletConfig: The object created after a servlet is instantiated and its default
constructor is read. It is created to pass initialization information to the servlet.
[ Received from Sivagopal Balivada ]
9
we can use the errorPage attribute of the page directive to have uncaught runtime
exceptions automatically forwarded to an error processing page. For example:
<%@ page errorPage="error.jsp" %>
redirects the browser to the JSP page error.jsp if an uncaught exception is encountered
during request processing. Within error.jsp, if you indicate that it is an error-processing
page, via the directive:
<%@ page isErrorPage="true" %>
the Throwable object describing the exception may be accessed within the error page via
the exception implicit object.
Note: You must always use a relative URL as the value for the errorPage attribute
Can you make use of a ServletOutputStream object from within a JSP page?
No. You are supposed to make use of only a JSPWriter object (given to you in the form of the implicit object
out) for replying to clients. A JSPWriter can be viewed as a buffered version of the stream
response.sendRedirect("http://www.foo.com/path/error.html");
You can also physically alter the Location HTTP header attribute, as shown below:
<%
response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
String newLocn = "/newpath/index.html";
response.setHeader("Location",newLocn);
%>
How do I have the JSP-generated servlet subclass my own custom servlet class, instead
of the default?
One should be very careful when having JSP pages extend custom servlet classes as
opposed to the default one generated by the JSP engine. In doing so, you may lose out on
any advanced optimization that may be provided by the JSPengine. In any case, your new
superclass has to fulfill the contract with the JSPngine by: Implementing the HttpJspPage
interface, if the protocol used is HTTP, or implementing JspPage otherwise Ensuring that
all the methods in the Servlet interface are declared final Additionally, your servlet
superclass also needs to do the following:
The service() method has to invoke the _jspService() method
The init() method has to invoke the jspInit() method
The destroy() method has to invoke jspDestroy()
If any of the above conditions are not satisfied, the JSP engine may throw a translation
error. Once the superclass has been developed, you can have your JSP extend it as
follows:
<%@ page extends="packageName.ServletName" %>
11
Custom JSP tag is a tag you defined. You define how a tag, its attributes and its body are
interpreted, and then group your tags into collections called tag libraries that can be used in any
number of JSP files. To use custom JSP tags, you need to define three separate components:
2. the tag library descriptor file that maps the XML element names to the tag implementations
When the first two components are done, you can use the tag by using taglib directive:
Then you are ready to use the tags you defined. Let's say the tag prefix is test:
MyJSPTag or
JavaBeans are Java utility classes you defined. Beans have a standard format for Java classes. You
use tags
Custom tags and beans accomplish the same goals -- encapsulating complex behavior into simple
Complex operations can be reduced to a significantly simpler form with custom tags than with
beans. Custom tags require quite a bit more work to set up than do beans.
Custom tags usually define relatively self-contained behavior, whereas beans are often defined in
Custom tags are available only in JSP 1.1 and later, but beans can be used in all JSP 1.x versions
method
The sendRedirect(String path) method of HttpServletResponse will tell the client that
it should send a request to the specified path. So the client will build a new request
and submit it to the server, because a new request is being submitted all previous
parameters stored in the request will be unavailable. The client's history will be
updated so the forward and back buttons will work. This method is useful for
redirecting to pages on other servers and domains.
}
13
What is the scope of <%@ page errorPage="" %>? Does it get passed to
jsp:forwarded pages? Does it get passed to jsp:included pages?
The errorPage="SomePage" attribute can be present in either the JSP that includes
or forwards to another JSP OR in the included or forwarded JSP OR in both the
parent/calling JSP and the JSPs included/forwarded. In all these cases the attribute
will work.
The control will 'not be' redirected to the errorPage specified from these JSP pages,
in case the exception is explicitly caught in them.
To redirect the control to the errorPage either do not catch an exception in the JSP
page OR throw an exception explicitly.
The <jsp:forward> action enables you to forward the request to a static HTML file, a
servlet, or another JSP.
The JSP that contains the <jsp:forward> action stops processing, clears its buffer,
and forwards the request to the target resource. Note that the calling JSP should not
write anything to the response prior to the <jsp:forward> action.
You can also pass additional parameters to the target resource using the
<jsp:param> tag.
</jsp:forward>
To "include" another resource with a JSP, you have two options: the include directive
and the include action.
The include directive executes when the JSP is compiled, which parses any JSP
elements in the included file for a static result that is the same for every instance of
that JSP. The syntax for the include directive is <@ include file="some-filename"
%>.
The include action, on the other hand, executes for each client request of the JSP,
which means the file is not parsed but included in place. This provides the capability
to dynamically change not only the content that you want to include, but also the
output of that content. The syntax for the include action is <jsp:include
page="some-filename" flush="true" />. Note that the flush attribute must always be
included (in JSP 1.1) to force a flush of the buffer in the output stream.
You can also pass parameters to the included file using the same process as the
<jsp:forward> action:
</jsp:include>
Why should I use the <jsp:useBean> tag, instead of just instantiating beans directly
inside scriptlets?
useBean has a "scope" parameter that automatically determines whether the bean
should be stored as a local variable, a request variable, a session variable, or an
application attribute. If you were to create beans explicitly you'd have to do it 4
different ways for the 4 different scopes.
The tags are potentially more portable to future versions of the JSP spec, or
alternate implementations (for example, a hypothetical JSP engine that stores
variables in a database, or shares them across server processes).
How can I print the stack trace of an Exception out to my JSP page?
To print a stack trace out to your JSP page, you need to wrap the implicit object 'out'
in a printWriter and pass the object to the printStackTrace method in Exception. ie:
When a servlet is first called, the response object is fresh and new: its headers have
not been set, its buffers are empty, and no data has been written to the client.
However, as soon as either the status code or any of the headers have been written
-- or potentially written -- to the client, or when data has been -- or may have been
-- written to the body stream, then you may be susceptible to the
IllegalStateException error. The problem that this exception is signalling is the new
data that you are (or may be) writing is inconsistent with the data that's already
been set and then irretrivably sent ("committed") to the client. Two common variants
of this exception are "java.lang.IllegalStateException: Header already sent" and
"java.lang.IllegalStateException: Cannot forward as Output Stream or Writer has
already been obtained". "Header already sent" means that one or more headers have
been committed to the client, so you can't set that header again.
"Output Stream or Writer has already been obtained" means that since the calling
servlet has already called response.getWriter() or response.getOutputStream(), that
contaminates the data stream, since the response has been (or may have been)
written to already, making it unsuitable for forwarding.
Is it possible to give different session timeouts for different groups of users? I think
session timeouts are set in the server and is the same for all users...meaning if you
dont use something the web app for 30 mins yr session expires...and it is the same
for all users?
Ans: The session timeout set in the web.xml is common for all sessions in the
application. But you can override that for a "particluar" session, by using the
HttpSession.setMaxInactiveInterval(int secs)
on your session instance.
So, for your requirement, you can check that if a particular user belongs to the John-
Q group, change his session timeout using the above method or else the default
session timeout of 30 min remains.
Is the HTTP Session maintained even when the network connection goes down? Can
the same browser instance resume a previous session after re-establishing the
network connection
Are Page scoped variables available across multiple requests to the same page? If
this is not the case, what is the difference between request scope and page scope for
JSP? Also, is this data available even when something like a query string is changed?
Answer
18
No, the page scope has a life that ends with the end of the page, but it does not
propagate to other page (included or forwarded).
The request scope life ends when the response is send back to the client, and its
visibility is to all the pages that are included or forwarded.
I don't think there's a way of doing that. Once the session has expired, the session
object is flagged for garbage collection and later destroyed
Answer
You can have nested tags and the value of a tag attribute also may be evaluated by
JSP engine. Please see bodycontent and rtexprvalue element in the following
example of a tld file.
<tag>
<name>..</name>
<tagclass>...</tagclass>
<bodycontent>JSP</bodycontent>
<attribute>
<name>name</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
...
...
</tag>
Does Buffer size affects the performance in any way? I am using buffer size
as 100kb.will it in anyway affect the performance? If yes what is the
optimum size that can be used? If no why?
I would say that it depends on the pages you normally handle. Bigger buffers are
normally faster but they use a bigger amount of memory that, in a Servlet/JSP
system could have a negative impact on server's performances.
Default value should be 8K, and except few cases, I've always considered it a
reasonable value. I change it only when I have to send out very big pages.
Can I instantiate the same JavaBean multiple times within a JSP page by
associating each instance with a different scope?
Answer
Yes, you can instantiate the same bean within a page multiple times by associating
them with different scopes. Needless to say, the bean's "id" must also be unique for
the specified scope. For example, you can have the following within a page:
<jsp:useBean class="foo.Bar" id="requestBar" scope="request" />
19
1. You can put the information you like in a HTTPSession object. This object is
created for you and stays with the user during the time they are in the site.
This is done like this:
2. HttpSession s = request.getSession(true);
3. s.setAttribute("returnVal", callMethod());
The first row creates the session if there are no sessions. Next row sets the
value you like in to the session object. Remember that in the JSP page you
have to cast this object back to whatever object it is. All "things" in a session
object are stored as java.lang.Objects.
here is how that is done inside the JSP page:
myObject = (myObject)
session.getAttribute("returnVal");
4. The other way of doing this is to put the value in the request object. It is
similar to the previous example, only it is the request object.
Here is how that is done:
5. RequestDispatcher rd =
getServletContext().getRequestDispatcher("/yourjsppage.jsp");
6. request.setAttribute("myObject", getMyObject());
rd.forward(request, response);
The first row gets the requestDispatcher, the second line adds your object to
the request object and the last line forwards the request. In the JSP page you
use the "request" object like this:
myObject = (myObject)request.getAttribute("myObject");
Can two web applications (servlet contexts) share the same session object?
Answer
By default, the session object is context-specific. Although a few servlet containers
(Tomcat, Resin) may allow web applications to share session contexts by means of
20
the "crosscontext" setting within the deployment descriptor, by default, that should
not be allowed for security purposes and must be used cautiously only for admin-
type applications.
[For example:
I need to trap all kinds 500 error on my jsp page. I have tried the <%@
page errorPage="myerror.jsp"> but it only works on selected errors. How
can I trap all errors, including syntax errors?
Answer
You can setup your web application to have error pages associated with a type of
exception/error that occurs when pages are executed. You can setup a generic error
page for Throwable and then more specific error pages from more specific
exceptions/erros that occur. Here is a sample web deployment descriptor that
outlines the strategy:
<web-app>
<!-- servlet definitions, resource refs.. -->
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/error-pages/generic.htm</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/error-pages/500.htm</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/error-pages/notThere.htm</location>
</error-page>
21