Example of Servlet Chaining?
Example of Servlet Chaining?
Servlet Chaining means the output of one servlet act as a input to another servlet. Servlet Aliasing
allows us to invoke more than one servlet in sequence when the URL is opened with a common servlet
alias. The output from first Servlet is sent as input to other Servlet and so on. The Output from the last
Servlet is sent back to the browser. The entire process is called Servlet Chaining.
// FirstServlet
import javax.servlet.*;
import java.io.*;
import javax.servlet.http.*;
response.setContentType("text/plain");
if(name!=null) {
request.setAttribute("UserId",id);
rd.forward(request , response);
// Forward the value to another Secondservlet
} else {
response.sendError(response.SC_BAD_REQUEST,
"UserId Required");
}
}
}
// SecondServlet
import javax.servlet.*;
import java.io.*;
import javax.servlet.http.*;
public class SecondServlet extends HttpServlet {
public void doGet(HttpServletRequest request ,
HttpServletResponse response)
throws ServletException , IOException {
response.setContentType("text/plain");
PrintWriter out = response.getWriter();
String userId = (String)request.getAttribute("UserId");
The input type "file" brings up a button for a file select box on the browser together with a
text field that takes the file name once selected. The servlet can use the GET method parameters to
decide what to do with the upload while the POST body of the request contains the file data to parse.
When the user clicks the "Upload" button, the client browser locates the local file and sends it using
HTTP POST, encoded using the MIME-type multipart/form-data. When it reaches your servlet, your
servlet must process the POST data in order to extract the encoded file. You can learn all about this
format in RFC 1867.
Unfortunately, there is no method in the Servlet API to do this. Fortunately, there are a number of
libraries available that do. Some of these assume that you will be writing the file to disk; others return
the data as an InputStream.
4) What is the difference between URL encoding, URL rewriting, HTML escaping, and
entity encoding?
URL Encoding is a process of transforming user input to a CGI form so it is fit for travel across the
network -- basically, stripping spaces and punctuation and replacing with escape characters. URL
Decoding is the reverse process. To perform these operations, call java.net.URLEncoder.encode() and
java.net.URLDecoder.decode() (the latter was (finally!) added to JDK 1.2, aka Java 2).
Example: changing "We're #1!" into "We%27re+%231%21"
URL Rewriting is a technique for saving state information on the user's browser between page hits. It's
sort of like cookies, only the information gets stored inside the URL, as an additional parameter. The
HttpSession API, which is part of the Servlet API, sometimes uses URL Rewriting when cookies are
unavailable.
Example: changing <A HREF="nextpage.html"> into
<A HREF="nextpage.html;$sessionid$=DSJFSDKFSLDFEEKOE"> (or whatever the actual syntax is;
I forget offhand) (Unfortunately, the method in the Servlet API for doing URL rewriting for session
management is called encodeURL(). Sigh...)
There's also a feature of the Apache web server called URL Rewriting; it is enabled by the mod_rewrite
module. It rewrites URLs on their way in to the server, allowing you to do things like automatically
add a trailing slash to a directory name, or to map old file names to new file names. This has nothing to
do with servlets. For more information, see the Apache FAQ
(http://www.apache.org/docs/misc/FAQ.html#rewrite-more-config) .
The input type "file" brings up a button for a file select box on the browser together with a
text field that takes the file name once selected. The servlet can use the GET method parameters to
decide what to do with the upload while the POST body of the request contains the file data to parse.
When the user clicks the "Upload" button, the client browser locates the local file and sends it using
HTTP POST, encoded using the MIME-type multipart/form-data. When it reaches your servlet, your
servlet must process the POST data in order to extract the encoded file. You can learn all about this
format in RFC 1867.
Unfortunately, there is no method in the Servlet API to do this. Fortunately, there are a number of
libraries available that do. Some of these assume that you will be writing the file to disk; others return
the data as an InputStream.
• Jason Hunter's MultipartRequest (available from http://www.servlets.com/)
• Apache Jakarta Commons Upload (package org.apache.commons.upload) "makes it easy to add
robust, high-performance, file upload capability to your servlets and web applications"
• CParseRFC1867 (available from http://www.servletcentral.com/).
• HttpMultiPartParser by Anil Hemrajani, at the isavvix Code Exchange
• There is a multipart/form parser availailable from Anders Kristensen (http://www-
uk.hpl.hp.com/people/ak/java/, [email protected]) at http://www-
uk.hpl.hp.com/people/ak/java/#utils.
• JavaMail also has MIME-parsing routines (see the Purple Servlet References).
• Jun Inamori has written a class called org.apache.tomcat.request.ParseMime which is available
in the Tomcat CVS tree.
• JSPSmart has a free set of JSP for doing file upload and download.
• UploadBean by JavaZoom claims to handle most of the hassle of uploading for you, including
writing to disk or memory.
• There's an Upload Tag in dotJ
Once you process the form-data stream into the uploaded file, you can then either write it to disk, write
it to a database, or process it as an InputStream, depending on your needs. See How can I access or
create a file or folder in the current directory from inside a servlet? and other questions in the
Servlets:Files Topic for information on writing files from a Servlet.
Please note that you can't access a file on the client system directly from a servlet; that would be a
huge security hole. You have to ask the user for permission, and currently form-based upload is the
only way to do that.
try {
govi.FormBean f = new govi.FormBean();
String id = request.getParameter("id");
f.setName(request.getParameter("name"));
f.setAddr(request.getParameter("addr"));
f.setAge(request.getParameter("age"));
//use the id to compute
//additional bean properties like info
//maybe perform a db query, etc.
// . . .
f.setPersonalizationInfo(info);
request.setAttribute("fBean",f);
getServletConfig().getServletContext().getRequestDispatcher
("/jsp/Bean1.jsp").forward(request,
response);
} catch (Exception ex) {
. . .
}
}
The JSP page Bean1.jsp can then process fBean, after first extracting it from the default request scope
via the useBean action.
8) Can a servlet maintain a JTA UserTransaction object across multiple servlet invocations?
No. A JTA transaction must start and finish within a single invocation (of the service() method). Note
that this question does not address servlets that maintain and manipulate JDBC connections, including
a connection's transaction handling.
9) How does the performance of JSP pages compare with that of servlets? How does it
compare with Perl scripts?
The performance of JSP pages is very close to that of servlets. However, users may experience a
perceptible delay when a JSP page is accessed for the very first time. This is because the JSP page
undergoes a "translation phase" wherein it is converted into a servlet by the JSP engine. Once this
servlet is dynamically compiled and loaded into memory, it follows the servlet life cycle for request
processing. Here, the jspInit() method is automatically invoked by the JSP engine upon loading the
servlet, followed by the _jspService() method, which is responsible for request processing and replying
to the client. Do note that the lifetime of this servlet is non-deterministic - it may be removed from
memory at any time by the JSP engine for resource-related reasons. When this happens, the JSP engine
automatically invokes the jspDestroy() method allowing the servlet to free any previously allocated
resources.
Subsequent client requests to the JSP page do not result in a repeat of the translation phase as long as
the servlet is cached in memory, and are directly handled by the servlet's service() method in a
concurrent fashion (i.e. the service() method handles each client request within a seperate thread
concurrently.)
There have been some recent studies contrasting the performance of servlets with Perl scripts running
in a "real-life" environment. The results are favorable to servlets, especially when they are running in a
clustered environment.
myname.code=com.sameer.servlets.MyServlet
The code below shows how this named servlet can be accessed in the service method of another servlet
11) What are all the different kinds of servers? (Such as Web Servers, Application Servers,
etc)
The servers involved in handling and processing a user's request break down into a few basic types,
each of which may have one or more tasks it solves. This flexibility gives developers a great deal of
power over how applications will be created and deployed, but also leads to confusion over what server
is able to, or should, perform a specific task.
Starting at the basic level, a user is typically submitting a request to a system through a web browser.
(We are conveniently ignoring all other types of clients (RMI, CORBA, COM/DCOM, Custom, etc..)
for the time being for purposes of clarity.) The web request must be received by a Web Server
(otherwise known as an HTTP Server) of some sort. This web server must handle standard HTTP
requests and responses, typically returning HTML to the calling user. Code that executes within the
server environment may be CGI driven, Servlets, ASP, or some other server-side programming
language, but the end result is that the web server will pass back HTML to the user.
The web server may need to execute an application in response to the users request. It may be
generating a list of news items, or handling a form submission to a guest book. If the server application
is written as a Java Servlet, it will need a place to execute, and this place is typically called a Servlet
Engine. Depending on the web server, this engine may be internal, external, or a completely different
product. This engine is continually running, unlike a traditional CGI environment where a CGI script is
started upon each request to the server. This persistance gives a servlet connection and thread pooling,
as well as an easy way to maintain state between each HTTP request. JSP pages are usually tied in with
the servlet engine, and would execute within the same space/application as the servlets.
There are many products that handle the web serving and the servlet engine in different manners.
Netscape/iPlanet Enterprise Server builds the servlet engine directly into the web server and runs
within the same process space. Apache requires that a servlet engine run in an external process, and
will communicate to the engine via TCP/IP sockets. Other servers, such as MS IIS don't officially
support servlets, and require add-on products to add that capability.
When you move on to Enterprise JavaBeans (and other J2EE components like JMS and CORBA) you
move into the application server space. An Application Server is any server that supplies additional
functionality related to enterprise computing -- for instance, load balancing, database access classes,
transaction processing, messaging, and so on.
EJB Application Servers provide an EJB container, which is the environment that beans will execute
in, and this container will manage transactions, thread pools, and other issues as necessary. These
application servers are usually stand-alone products, and developers would tie their servlets/JSP pages
to the EJB components via remote object access APIs. Depending on the application server,
programmers may use CORBA or RMI to talk to their beans, but the baseline standard is to use JNDI to
locate and create EJB references as necessary.
Now, one thing that confuses the issue is that many application server providers include some or all of
these components in their product. If you look at WebLogic (http://www.beasys.com/) you will find
that WebLogic contains a web server, servlet engine, JSP processor, JMS facility, as well as an EJB
container. Theoretically a product like this could be used to handle all aspects of site development. In
practice, you would most likely use this type of product to manage/serve EJB instances, while
dedicated web servers handle the specific HTTP requests.
13) How can my application get to know when a HttpSession is removed (when it time-
outs)?
Define a class, say SessionTimeoutNotifier, that implements
javax.servlet.http.HttpSessionBindingListener. Create a SessionTimeoutNotifier object and add it to the
user session. When the session is removed, SessionTimeoutNotifier.valueUnbound() will be called by
the servlet engine. You can implement valueUnbound() to do whatever you want.
14) Why use JSP when we can do the same thing with servlets?
[Original question: Why should I use JSP when there is already servlet technology available for serving
dynamic content?]
While JSP may be great for serving up dynamic Web content and separating content from presentation,
some may still wonder why servlets should be cast aside for JSP. The utility of servlets is not in
question. They are excellent for server-side processing, and, with their significant installed base, are
here to stay. In fact, architecturally speaking, you can view JSP as a high-level abstraction of servlets
that is implemented as an extension of the Servlet 2.1 API. Still, you shouldn't use servlets
indiscriminately; they may not be appropriate for everyone. For instance, while page designers can
easily write a JSP page using conventional HTML or XML tools, servlets are more suited for back-end
developers because they are often written using an IDE -- a process that generally requires a higher
level of programming expertise.
When deploying servlets, even developers have to be careful and ensure that there is no tight coupling
between presentation and content. You can usually do this by adding a third-party HTML wrapper
package like htmlKona to the mix. But even this approach, though providing some flexibility with
simple screen changes, still does not shield you from a change in the presentation format itself. For
example, if your presentation changed from HTML to DHTML, you would still need to ensure that
wrapper packages were compliant with the new format. In a worst-case scenario, if a wrapper package
is not available, you may end up hardcoding the presentation within the dynamic content. So, what is
the solution? One approach would be to use both JSP and servlet technologies for building application
systems.
15) How do I send information and data back and forth between applet and servlet using
the HTTP protocol?
Use the standard java.net.URL class, or "roll your own" using java.net.Socket. See the HTTP spec at
W3C for more detail.
Note: The servlet cannot initiate this connection! If the servlet needs to asynchronously send a message
to the applet, then you must open up a persistent socket using java.net.Socket (on the applet side), and
java.net.ServerSocket and Threads (on the server side).
16) Can I get the path of the current servlet where it lives on the file system (not its URL)?
Try using:
request.getRealPath(request.getServletPath())
out.println(request.getRealPath(request.getServletPath()));
17) How can I daisy chain servlets together such that the output of one servlet serves as the
input to the next?
There are two common methods for chaining the output of one servlet to another servlet :
i. the first method is the aliasing which describes a series of servlets to be executed
ii. the second one is to define a new MIME-Type and associate a servlet as handlers As I don't
really use the second one, I'll focus on the aliasing.
To chain servlets together, you have to specify a sequential list of servlets and associate it to an alias.
When a request is made to this alias, the first servlet in the list is invoked, processed its task and sent
the ouptut to the next servlet in the list as the request object. The output can be sent again to another
servlets.
To accomplish this method, you need to configure your servlet engine (JRun, JavaWeb server,
JServ ...).
For example to configure JRun for servlet chaining, you select the JSE service (JRun servlet engine) to
access to the JSE Service Config panel. You have just to define a new mapping rule where you define
your chaining servlet.
Let say /servlets/chainServlet for the virtual path and a comma separated list of servlets as srvA,srvB.
So when you invoke a request like http://localhost/servlets/chainServlet, internally the servlet srvA will
be invoked first and its results will be piped into the servlet srvB.
The srvA servlet code should look like :
All the servlet srvB has to do is to open an input stream to the request object and read the data into a
BufferedReader object as for example :
BufferedReader b = new BufferedReader( new
InputStreamReader(req.getInputStream() ) );
String data = b.readLine();
b.close();
After that you can format your output with the data.
It should work straigthforward with Java Web Server or Jserv too. Just look at in their documentation to
define an alias name. Hope that it'll help.
19) How to handle multiple concurrent database requests/updates when using JDBC with
servlets?
All the dbms provide the facility of locks whenever the data is being modified. There can be two
scenarios:
1. Multiple database updates on different rows, if you are using servlets the servlets will open
multiple connections for different users. In this case there is no need to do additional
programming.
2. If database updates are on the same row then the rows are locked automatically by the dbms,
hence we have to send requests to the dbms repeatatively until the lock is released by dbms.
This issue is dealt with in the JDBC documentation; look up "Transactions" and "auto-commit". It can
get pretty confusing.
21) How do you share session objects between servlets and JSP?
Sharing sessions between a servlet and a JSP page is straight forward. JSP makes it a little easy by
creating a session object and making it availabe already. In a servlet you would have to do it yourself.
This is how:
in the jsp page this is how you get the session value:
<%
session.getValue("varible");
%>
23) Is there any method to unload a servlet from Web Server memory without restarting
the server?
There is no standard method/mechanism to unload a servlet from memory. Some servers, like JWS,
provide the means to load and unload servlets from their administration module. Others, like Tomcat,
require you to just replace the WAR file.
26) What is the difference between the doGet and doPost methods?
doGet is called in response to an HTTP GET request. This happens when users click on a link, or enter
a URL into the browser's address bar. It also happens with some HTML FORMs (those with
METHOD="GET" specified in the FORM tag).
doPost is called in response to an HTTP POST request. This happens with some HTML FORMs (those
with METHOD="POST" specified in the FORM tag).
Both methods are called by the default (superclass) implementation of service in the HttpServlet base
class. You should override one or both to perform your servlet's actions. You probably shouldn't
override service().
27) What is the difference between encodeRedirectUrl and encodeURL?
encodeURL and encodeRedirectURL are methods of the HttpResponse object. Both rewrite a raw URL
to include session data if necessary. (If cookies are on, both are no-ops.)
encodeURL is for normal links inside your HTML pages.
encodeRedirectURL is for a link you're passing to response.sendRedirect(). It has slightly different
syntax requirements too gory to get into here.
30) How can I determine the name and version number of the servlet or JSP engine that I
am using?
From within a servlet, you can invoke the ServletContext.getServerInfo() method as follows:
String thisServer=
getServletConfig().getServletContext().getServerInfo();
31) How can I get the absolute URL of a servlet/JSP page at runtime?
You can get all the necessary information to determine the URL from the request object. To reconstruct
the absolute URL from the scheme, server name, port, URI and query string you can use the URL class
from java.net. The following code fragment will determine your page's absolute URL:
33) How does one choose between overriding the doGet(), doPost(), and service() methods?
The differences between the doGet() and doPost() methods are that they are called in the HttpServlet
that your servlet extends by its service() method when it recieves a GET or a POST request from a
HTTP protocol request.
A GET request is a request to get a resource from the server. This is the case of a browser requesting a
web page. It is also possible to specify parameters in the request, but the length of the parameters on
the whole is limited. This is the case of a form in a web page declared this way in html: <form
method="GET"> or <form>.
A POST request is a request to post (to send) form data to a resource on the server. This is the case of
of a form in a web page declared this way in html: <form method="POST">. In this case the size of the
parameters can be much greater.
The GenericServlet has a service() method that gets called when a client request is made. This means
that it gets called by both incoming requests and the HTTP requests are given to the servlet as they are
(you must do the parsing yourself).
The HttpServlet instead has doGet() and doPost() methods that get called when a client request is GET
or POST. This means that the parsing of the request is done by the servlet: you have the appropriate
method called and have convenience methods to read the request parameters.
NOTE: the doGet() and doPost() methods (as well as other HttpServlet methods) are called by the
service() method.
Concluding, if you must respond to GET or POST requests made by a HTTP protocol client (usually a
browser) don't hesitate to extend HttpServlet and use its convenience methods.
If you must respond to requests made by a client that is not using the HTTP protocol, you must use
service().
34) How do servlets differ from RMI? What are the advantages and disadvantages of each
technology?
Servlets extend the server-side functionality of a website. Servlets communicate with other
application(s) on that server (or any other server) and perform tasks above and beyond the "normal"
static HTML document. A servlet can receive a request to get some information through EJB from one
or more databases, then convert this data into a static HTML/WML page for the client to see, for
example. Even if the servlet talks to many other applications all over the world to get this information,
it still looks like it happened at that website.
RMI (Remote Method Invocation) is just that - a way to invoke methods on remote machines. It is way
for an application to talk to another remote machine and execute different methods, all the while
appearing as if the action was being performed on the local machine.
Servlets (or JSP) are mainly used for any web-related activity such as online banking, online grocery
stores, stock trading, etc. With servlets, you need only to know the web address and the pages displayed
to you take care of calling the different servlets (or actions within a servlet) for you. Using RMI, you
must bind the RMI server to an IP and port, and the client who wishes to talk to the remote server must
know this IP and port, unless of course you used some kind of in-between lookup utility, which you
could do with (of all things) servlets.
35) How can we use a servlet as a proxy for communications between two applets?
One way to accomplish this is to have the applets communicate via TCP/IP sockets to the servlet. The
servlet would then use a custom protocol to receive and push information between applets. However,
this solution does have firewall problems if the system is to be used over and Internet verses an
Intranet.
36) How can I design my servlet/JSP so that query results get displayed on several pages,
like the results of a search engine? Each page should display, say, 10 records each and when
the next link is clicked, I should see the next/previous 10 records and so on.
Use a Java Bean to store the entire result of the search that you have found. The servlet will then set a
pointer to the first line to be displayed in the page and the number of lines to display, and force a
display of the page. The Action in the form would point back to the servlet in the JSP page which
would determine whether a next or previous button has been pressed and reset the pointer to previous
pointer + number of lines and redisplay the page. The JSP page would have a scriplet to display data
from the Java Bean from the start pointer set to the maximum number of lines with buttons to allow
previous or next pages to be selected. These buttons would be displayed based on the page number (i.e.
if first then don't display previous button).
38) How can I pass data retrieved from a database by a servlet to a JSP page?
One of the better approaches for passing data retrieved from a servlet to a JSP is to use the Model 2
architecture as shown below:
Basically, you need to first design a bean which can act as a wrapper for storing the resultset returned
by the database query within the servlet. Once the bean has been instantiated and initialized by
invoking its setter methods by the servlet, it can be placed within the request object and forwarded to a
display JSP page as follows:
The bean can then be accessed within the JSP page via the useBean tag as:
Also, it is best to design your application such that you avoid placing beans into the session unless
absolutely necessary. Placing large objects within the session imposes a heavy burden on the
performance of the servlet engine. Of course, there may be additional design considerations to take care
of - especially if your servlets are running under a clustered or fault-tolerant architecture.
out.println("");
out.println("Your Title");
out.println("");
out.println("");
out.println("");
out.println("");
out.println("");
out.println("");
out.println("");
out.close();
-------------------------- END
------------------------------------------
Where MenuServlet and DummyServlet provide content and behavior for the frames generated by
FrameServlet.
41) How do I handle FORMs with multiple form elements (e.g. radio buttons) using the
same name?
For radio buttons, the HTML spec assumes that a given group of buttons will have the same NAME
and different VALUEs; the browser makes sure that only one button per group name will be selected (at
most). So you can just call request.getParameter("groupname").
If the user selects "Pepperoni" then request.getParameter("topping") will return the string "pepperoni".
For lists using the <select multiple> FORM tag, multiple values can be returned for the same parameter
name. When that can happen, use request.getParameterValues("param") which returns a String[] you
can iterate through.
It's bad form (so to speak), but you can also duplicate other element types, like
42) How do I separate presentation (HTML) from business logic (Java) when using
servlets?
Almost anybody who has ever written a servlet can identify with this one. We all know it's bad for to
embed HTML code in our java source; it's lame to have to recompile and re-deploy every time you
want an HTML element to look a bit different. But what are our choices here? There are two basic
options;
1. Use JSP: Java Server Pages allows you to embed Java code or the results of a servlet into your
HTML. You could, for instance, define a servlet that gives a stock quote, then use the tag in a JSP page
to embed the output. But then, this brings up the same problem; without discipline, your
content/presentation and program logic are again meshed. I think the ideal here is to completely
separate the two.
2. Use a templating/parsing system: Hmm...I know you're about to rant about re-inventing the wheel,
but it's not that bad (see below). Plus, it really does pay to take this approach; you can have a group of
programmers working on the Java code, and a group of HTML producers maintaining the interface. So
now you probably want to know how to do it...so read on.
Use SSI!
Remember SSI? It hasn't gotten much attention in recent years because of embeddable scripting
languages like ASP and JSP, but it still remains a viable option. To leverage it in the servlet world, I
believe the best way is to use an API called SSI for Java from Areane. This API will let you emulate
SSI commands from a templating system, and much more. It will let you execute any command on any
system, including executing java classes! It also comes with several utility classes for creating stateful
HTML form elements, tables for use with iteration, and much more. It's also open source, so it's free
and you can tweak it to your heart's content! You can read the SSI for Java documentation for detailed
info, but the following is an example of its use.
Here's the servlet:
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import com.areane.www.ssi.*;
Now, just create a template file, pass the servlet the template file name, and have at it!
43) For an HTML FORM with multiple SUBMIT buttons, how can a servlet ond differently
for each button?
The servlet will respond differently for each button based on the html that you have placed in the
HTML page. Let's explain.
For a submit button the HTML looks like <input type=submit name="Left" value="left">. A servlet
could extract the value of this submit by using the getParameter("Left") from the HttpRequest object. It
follows then that if you have HTML within a FORM that appears as:
Then the getParameter("Direction") from the HttpRequest would extract the value pressed by the
user, either "left", "right", "up" or "down". A simple comparision in the servlet with the these values
could occur and processing based on the submit button would be performed.
Similiarly,for submit buttons with different names on a page, each of these values could be extracted
using the getParameter() call and acted on. However, in a situation where there are multiple buttons,
common practice would be to use one name and multiple values to identify the button pressed.
45) How can I explicitly unload a servlet or call the destroy method?
In general, you can't. The Servlet API does not specify when a servlet is unloaded or how the destroy
method is called. Your servlet engine (ie the implementation of the interfaces in the JSDK) might
provide a way to do this, probably through its administration interface/tool (like Webshpere or JWS).
Most servlet engines will also destroy and reload your servlet if they see that the class file(s) have been
modified.
49) Which is the most efficient (i.e. processing speed) way to create a server application that
accesses a database: A Servlet using JDBC; a JSP page using a JavaBean to carry out the
db access; or JSP combined with a Servlet? Are these my only choices?
Your question really should be broken in two.
1-What is the most efficient way of serving pages from a Java object?. There you have a clear winner
in the Servlet. Althought if you are going to change the static content of the page often is going to be a
pain because you'll have to change Java code. The second place in speed is for JSP pages. But,
depending on your application, the difference in speed between JSP pages and raw servlets can be so
small that is not worth the extra work of servlet programming.
2-What is the most efficient way of accessing a database from Java?. If JDBC is the way you want to
go the I'd suggest to pick as many drivers as you can (II,III,IV or wathever) and benchmark them. Type
I uses a JDBC/ODBC bridge and usually has lousy performance. Again, go for the simplest (usually
type IV driver) solution if that meets you performance needs.
For database applications, the performance bottleneck is usually the database, not the web
server/engine. In this case, the use of a package that access JDBC with connection pooling at the
application level used from JSP pages (with or withouth beans as middleware) is the usual choice. Of
course, your applications requirements may vary.
50) How can I change the port of my Java Web Server from 8080 to something else?
It is very simple. JAVA WEB SERVER comes with remote Web administration tool. You can access
this with a web browser.
Administration tool is located on port 9090 on your web server. To change port address for web server:
1. Access tool (http://hostname:9090)
2. Enter User Id/Password (by default it is admin/admin)
3. Select service (Web service)
4. Click on "manage" button. You will get a popup screen with all settings.
5. Click on network tree node, On right hand side you will get text box for entering port no.
6. Change port number with desire one.
7. click on restart button.
52) What is FORM based login and how do I use it? Also, what servlet containers support
it?
Form based login is one of the four known web based login mechanisms. For completeness I list all of
them with a description of their nature:
1. HTTP Basic Authentication
• An authentication protocol defined within the HTTP protocol (and based on headers). It
indicates the HTTP realm for which access is being negotiated and sends passwords with
base64 encoding, therefore it is not very secure. (See RFC2068 for more information.)
2. HTTP Digest Authentication
• Like HTTP Basic Authentication, but with the password transmitted in an encrypted
form. It is more secure than Basic, but less then HTTPS Authentication which uses
private keys. Yet it is not currently in widespread use.
3. HTTPS Authentication (SSL Mutual Authentication)
• This security mechanism provides end user authentication using HTTPS (HTTP over
SSL). It performs mutual (client & server) certificate based authentication with a set of
different cipher suites.
4. Form Based Login
• A standard HTML form (static, Servlet/JSP or script generated) for logging in. It can be
associated with protection or user domains, and is used to authenticate previously
unauthenticated users.
• The major advantage is that the look and feel of the login screen can be controlled (in
comparison to the HTTP browsers' built in mechanisms).
To support 1., 3., and 4. of these authentication mechanisms is a requirement of the J2EE Specification
(as of v1.2, 3.4.1.3 Required Login Mechanisms). (HTTP Digest Authentication is not a requirement,
but containers are encouraged to support it.)
You can also see section 3.3.11.1 of the J2EE Specs. (User Authentication, Web Client) for more
detailed descriptions of the mechanisms.
Thus any Servlet container that conforms to the J2EE Platform specification should support form based
login.
To be more specific, the Servlet 2.2 Specification describes/specifies the same mechanisms in 11.5
including form based login in 11.5.3.
This section (11.5.3) describes in depth the nature, the requirements and the naming conventions of
form based login and I suggest to take a look at it.
Here is a sample of a conforming HTML login form:
53) How do I capture a request and dispatch the exact request (with all the parameters
received) to another URL?
As far as i know it depends on the location of the next target url.
• If the next servlet url is in the same host, then you can use the forward method.
Here is an example code about using forward:
RequestDispatcher rd = null;
String targetURL = "target_servlet_name";
ServletContext ctx = this.getServletContext();
rd = ctx.getRequestDispatcher(targetURL);
rd.forward(request, response);
54) How can the data within an HTML form be refreshed automatically whenever there is a
change in the database?
JSP is intended for dynamically generating pages. The generated pages can include wml, html, dhtml or
whatever you want...
When you have a generated page, JSP has already made its work. From this moment you have a page.
If you want automatic refreshing, then this should be acomplished by the technology included in the
generated page (JSP will tell only what to include in the page).
The browser can not be loaded by extern factors. The browser is the one who fetches url's since the http
protocol is request-response based. If a server can reload a browser without its allow, it implies that we
could be receiving pages which we haven't asked for from servers.
May you could use applets and a ServerSocket for receiving incoming signals from the server for
changed data in the DB. This way you can load new information inside the applet or try to force a page
reload.
[That's a nice idea -- it could use the showDocument() call to reload the current page. It could also use
HTTP polling instead of maintaining an expensive socket connection. -Alex]
Perhaps (if possible), could be simpler using an automatic JavaScript refreshing function that force
page reload after a specified time interval.
<jsp:forward page=/relativepath/YourServlet>
<jsp:param name="name1" value="value1" />
<jsp:param name="name2" value="value2" />
</jsp:forward>
57) Can there be more than one instance of a servlet at one time ?
It is important to note that there can be more than one instance of a given Servlet class in the servlet
container. For example, this can occur where there was more than one servlet definition that utilized a
specific servlet class with different initialization parameters. This can also occur when a servlet
implements the SingleThreadModel interface and the container creates a pool of servlet instances to
use.
58) How can I measure the file downloading time using servlets?
<web-app>
<servlet>
<servlet-name>
myServlet
</servlet-name>
<servlet-class>
myServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>
myServlet
</servlet-name>
<url-pattern>
/jsp-bin/*
</url-pattern>
</servlet-mapping>
</web-app>
This lets Apache turn over handling of the url pattern to your servlet.
61) Is there any way to determine the number of concurrent connections my servlet engine
can handle?
Depends on whether or not your servlet container uses thread pooling. If you do not use a thread pool,
the number of concurrent connections accepted by Tomcat 3.1, for example, is 10. This you can see for
yourself by testing a servlet with the Apache JMeter tool.
However, if your servlet container uses a thread pool, you can specify the number of concurrent
connections to be accepted by the container. For Tomcat 3.1, the information on how to do so is
supplied with the documentation in the TOMCAT_HOME/doc/uguide directory.
RequestDispatcher dispatcher =
getRequestDispatcher("Servlet_B");
dispatcher.forward( request, response );
where request, of type HttpServletRequest, is the first parameter of the enclosing service method (or
the doGet method) and response, of type HttpServletResponse, the second. You could accomplish the
same by
RequestDispatcher
dispatcher=getServletContext().getRequestDispatcher( "/servlet/Servle
t_B" );
dispatcher.forward( request, response );
64) Does the RequestDispatcher expect a relative URL to be relative to the originally-called
servlet or to the current servlet (if different)?
Since the RequestDispatcher will be passing the control (request object and response object) from the
current Servlet, the relative URL must be relative to the current servlet.
The originally called servlet has passed the control to the current servlet, and now current servlet is
acting as controller to other resourses.
65) What is the difference between in-process and out-of-process servlet containers?
The in-process Servlet containers are the containers which work inside the JVM of Web server, these
provides good performance but poor in scalibility.
The out-of-process containers are the containers which work in the JVM outside the web server. poor in
performance but better in scalibility
In the case of out-of-process containers, web server and container talks with each other by using the
some standard mechanism like IPC.
In addition to these types of containers, there is 3rd type which is stand-alone servlet containers. These
are an integral part of the web server.
67) Which servlet containers have persistent session support? Specifically, does Tomcat 3.1?
All servlet containers that implement the Servlet 2.2 API must provide for session tracking through
either the use of cookies or through URL rewriting. All Tomcat servlet containers support session
tracking.
69) How can I set a servlet to load on startup of the container, rather than on the first
request?
The Servlet 2.2 spec defines a load-on-startup element for just this purpose. Put it in the <servlet>
section of your web.xml deployment descriptor. It is either empty (<load-on-startup/>) or contains "a
positive integer indicating the order in which the servlet should be loaded. Lower integers are loaded
before higher integers. If no value is specified, or if the value specified is not a positive integer, the
container is free to load it at any time in the startup sequence."
For example,
<servlet>
<servlet-name>foo</servlet-name>
<servlet-class>com.foo.servlets.Foo</servlet-class>
<load-on-startup>5</load-on-startup>
</servlet>
Some servlet containers also have their own techniques for configuring this; please submit feedback
with information on these.
71) Is there a way to disable a user's ability to double-click a submit image/button (and
therefore submitting duplicate data -- multiple submits)? Is there a way to do this with
Javascript?
Give the submit image (or button) an onClick() handler. Have the handler check if a flag is set and if
not set the flag and submit the form and then clear the form.
72) What are the main differences between Servlets and ISAPI?
The first difference is obviously that Servlets is the technology from Sun Microsystems and ISAPI is
from Microsoft.
Other Differences are:
i. Servlet is a simple .class file and ISAPI is a DLL
ii. Servlets run in the Servlet containers and may be in-process or out of process. ISAs run in the
same address space as the HTTP server
iii. Servlet container preprocesses and postprocesses the data communication between the client
and server. ISAPI Filters provide the capability of pre-processing and post-processing of all data
sent between the client and the server
iv. Java is the only choice for writing Servlets, VC++/MFC is used to write ISAPI code
v. Servlets works on most of the Web servers plus third party containers can be integrated with
other web servers to provide servlets on them. ISAPI works on only ISAPI-compliant Web
server (for example, Microsoft Internet Information Server)
vi. Servlets can connect to the Databases through JDBC as well as jdbc-odbc bridges. ISAPI can
connect to Databases through only ODBC
vii.Servlets have access to many server-side technologies like EJB and etc. ISAPI is limited in
scope
viii.Multiple commands can be implemented in a servlet by using pathinfo. ISAPI allows multiple
commands in one DLL, implemented as member functions of the CHttpServer object in the
DLL.
ix. Content generation and content presentation can be done seperately in Servlets with the help of
JSP. ISAPI code has to generate HTML code itself.
73) Can I associate a servlet with a particular mime-type, so if the client requests a file of
that type, my servlet will be executed?
In web.xml you can use a mime-mapping to map the type with a certain extension and then map the
servlet to that extension.
e.g.
<mime-mapping>
<extension>
zzz
</extension>
<mime-type>
text/plain
</mime-type>
</mime-mapping>
<servlet-mapping>
<url>
*.zzz
</url>
<servlet-name>
MyServlet
</servlet-name>
</servlet-mapping>
So, when a file for type zzz is requested, the servlet gets called.
74) What are the different cases for using sendRedirect() vs. getRequestDispatcher()?
When you want to preserve the current request/response objects and transfer them to another resource
WITHIN the context, you must use getRequestDispatcher or getNamedDispatcher.
If you want to dispatch to resources OUTSIDE the context, then you must use sendRedirect. In this
case you won't be sending the original request/response objects, but you will be sending a header
asking to the browser to issue a request to the new URL.
If you don't need to preserve the request/response objects, you can use either.
document.cookie = "cookieName=cookieValue";
alert(document.cookie);
The value of document.cookie is a string containing a list of all cookies that are associated
with a web page. It consists, that is, of name=value pairs for each cookie that matches the
current domain, path, and date. The value of the document.cookie property, for instance,
might be the following string:
cookieName1=cookieValue1; cookieName2=cookieValue2;
76) How do I write to a log file using JSP under Tomcat? Can I make use of the log()
method for this?
Yes, you can use the Servlet API's log method in Tomcat from within JSPs or servlets. These messages
are stored in the server's log directory in a file called servlet.log.
77) How can I use a servlet to print a file on a printer attached to the client?
The security in a browser is designed to restrict you from automating things like this. However, you can
use JavaScript in the HTML your servlet returns to print a frame. The browser will still confirm the
print job with the user, so you can't completely automate this. Also, you'll be printing whatever the
browser is displaying (it will not reliably print plug-ins or applets), so normally you are restricted to
HTML and images.
[The JavaScript source code for doing this is:
<servlet>
<servlet-name>myservlet</servlet-name>
<servlet-class>com.mypackage.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>myservlet</servlet-name>
<url-pattern>/myservlet</url-pattern>
</servlet-mapping>
79) I want my servlet page to redirect to a login page if the session has timed out. How can I
know if my session has timed out?
If the servlet engine does the time-out, following code should help you:
<servlet-mapping>
<servlet-name>
jsp
</servlet-name>
<url>*.html</url>
</servlet-mapping>
<mime-mapping>
<extension>
html
</extension>
<mime-type>
text/html
</mime-type>
</mime-mapping>
81) What is the difference between request attributes, session attributes, and ServletContext
attributes?
A ServletContext attribute is an object bound into a context through ServletContext.setAttribute()
method and which is available to ALL servlets (thus JSP) in that context, or to other contexts via the
getContext() method. By definition a context attribute exists locally in the VM where they were
defined. So, they're unavailable on distributed applications.
Session attributes are bound to a session, as a mean to provide state to a set of related HTTP requests.
Session attributes are available ONLY to those servlets which join the session. They're also unavailable
to different JVMs in distributed scenarios. Objects can be notified when they're bound/unbound to the
session implementing the HttpSessionBindingListener interface.
Request attributes are bound to a specific request object, and they last as far as the request is resolved
or while it keep dispatched from servlet to servlet. They're used more as comunication channel between
Servlets via the RequestDispatcher Interface (since you can't add Parameters...) and by the container.
Request attributes are very useful in web apps when you must provide setup information between
information providers and the information presentation layer (a JSP) that is bound to a specific request
and need not be available any longer, which usually happens with sessions without a rigorous control
strategy.
Thus we can say that context attributes are meant for infra-structure such as shared connection pools,
session attributes to contextual information such as user identification, and request attributes are meant
to specific request info such as query results.
82) Are singleton/static objects shared between servlet contexts?
[Question continues: For example if I have two contexts on a single web server, and each context uses a
login servlet and the login servlet connects to a DB. The DB connection is managed by a singleton
object. Do both contexts have their own instance of the DB singleton or does one instance get shared
between the two?]
It depends on from where the class is loaded.
The classes loaded from context's WEB-INF directory are not shared by other contexts, whereas classes
loaded from CLASSPATH are shared. So if you have exactly the same DBConnection class in WEB-
INF/classes directory of two different contexts, each context gets its own copy of the singleton (static)
object.
83) When building web applications, what are some areas where synchronization problems
arrise?
In general, you will run into synchronization issues when you try to access any shared resource. By
shared resource, I mean anything which might be used by more than one request.
Typical examples include:
• Connections to external servers, especially if you have any sort of pooling.
• Anything which you include in a HttpSession. (Your user could open many browser windows
and make many simultaneous requests within the one session.)
• Log destinations, if you do your own logging from your servlets.
84) What is the difference between apache webserver, java webserver and tomcat server?
Apache is an HTTP server written in C that can be compiled and run on many platforms.
Java WebServer is an HTTP server from Sun written in Java that also supports Servlets and JSP.
Tomcat is an open-source HTTP server from the Apache Foundation, written in Java, that supports
Servlets and JSP. It can also be used as a "plug-in" to native-code HTTP servers, such as Apache Web
Server and IIS, to provide support for Servlets (while still serving normal HTTP requests from the
primary, native-code web server).
85) How can you embed a JavaScript within servlets / JSP pages?
You don't have to do anything special to include JavaScript in servlets or JSP pages. Just have the
servlet/JSP page generate the necessary JavaScript code, just like you would include it in a raw HTML
page.
The key thing to remember is it won't run in the server. It will run back on the client when the browser
loads the generate HTML, with the included JavaScript.
87) How do I pass a request object of one servlet as a request object to another servlet?
Use a Request Dispatcher.
88) I call a servlet as the action in a form, from a jsp. How can I redirect the response from
the servlet, back to the JSP? (RequestDispatcher.forward will not help in this case, as I do
not know which resource has made the request. request.getRequestURI will return the uri
as contained in the action tag of the form, which is not what is needed.)
You'll have to pass the JSP's URI in to the servlet, and have the servlet call sendRedirect to go back to
the JSP. For example:
<FORM ACTION="/foo/myservlet">
<INPUT TYPE="HIDDEN" NAME="redirect"
VALUE="/foo/thisjsp.jsp">
Shoe size: <INPUT NAME="shoesize">
<INPUT TYPE="SUBMIT">
</FORM>
response.sendRedirect(request.getParameter("redirect"));
90) I have a global variable in a servlet class. What will happen to this global variable if two
requests hit on the same time?
What will happen is an unforeseeable event.
The best way to establish a default occurrence (the servlet handles a request at a time) is to
synchronize the access to the global variable or alternatively to create a servlet that implements the
SingleThreadModel interface.
91) Suppose I have 2 servers, server1 and server2. How can I take data in a cookie from
server1, and send it to server2?
You'll have to create a (new) similar cookie on server 2.
Have a ReadCookieServlet running on server1 that
• Reads the cookie, using request.getCookies()
• Redirects to WriteCookieServlet running on server2, passing the cookie name, value and
expiration date as request parameters, using response.sendRedirect().
Have a WriteCookieServlet running on server2 that
• Reads the cookie name, value and expiration date request parameters, using
request.getParameter().
• Creates a similar cookie, using response.addCookie().
92) How can I pass data from a servlet running in one context (webapp) to a servlet running
in another context?
There are three ways I can think of off the top of my head:
1. Store the information you want to share in a persistant format, such as in a file system or
database. That way, any servlet that is running in a JVM that can "see" these resources can get
to this information.
2. If persisting this information is not an option, you can bind this information to a context that is
accessible to all servlet contexts, such as the application server's context. This way, you can
keep the data you want to share in memory.
3. Use the old fashion way of passing information to a servlet - HTTP. One servlet could foward a
request to another servlet and include the data that needs to be shared as parameters in the
request.
93) How can I write an "error page" -- that is, a servlet or JSP to report errors of other
servlets?
The Servlet 2.2 specification allows you to specify an error page (a servlet or a JSP) for different kinds
of HTTP errors or ServletExceptions. You can specify this in deployment descriptor of the web
application as:
<error-page>
<exception-type>FooException</exception-type>
<location>/error.jsp</location>
</error-page>
<Context path="/myApp"
docBase="D:/myApp/webDev"
crossContext="true"
debug="0"
reloadable="true"
trusted="false" >
</Context>
The reloadable = true makes the magic. Every time the Servlet container detects that the Servlet code
is changed, it will call the destroy on the currently loaded Servlet and reload the new code.
But if the class that is referenced by the Servlet changes, then the Servlet will not get loaded. You will
have to change the timestamp of the servlet or stop-start the server to have the new class in the
container memory.
97) I am using the RequestDispatcher's forward() method to redirect to a JSP. The problem
is that the jsp's url is now relative to the servlet's url and all my url's in the jsp such as
<img src="pic.gif"> will be corrupt. How do I solve this problem?
You can use absolute urls like:
<BODY>
<% String base = request.getContextPath(); %>
<IMG src="<%=base%>/img/pic.gif">
</BODY>
98) How can I return a readily available (static) HTML page to the user instead of
generating it in the servlet?
To solve your problem, you can either send a "Redirect" back to the client or use a RequestDispatcher
and forward your request to another page:
1. Redirect:
A redirection is made using the HttpServletResponse object:
if(condition) {
response.sendRedirect("page1.html");
} else {
response.sendRedirect("page2.html");
}
2. RequestDispatcher:
A request dispatcher can be obtained through the ServletContext. It can be used to include
another page or to forward to it.
if(condition) {
this.getServletContext()
.getRequestDispatcher("page1.html").forward();
} else {
this.getServletContext()
.getRequestDispatcher("page2.html").forward();
}
Both solutions require, that the pages are available in you document root. If they are located
somewhere else on your filesystem, you have to open the file manually and copy their content to the
output writer.
If your application server is set up in combination with a normal web server like Apache, you should
use solution (1), because the the web server usually serves static files much faster than the application
server.
99) What is the difference between static variables and instance variables in a servlet?
According to the Java Language definition, a static variable is shared among all instances of a class,
where a non-static variable -- also called an instance variable -- is specific to a single instance of that
class.
According to the Servlet specification, a servlet that does not declare SingleThreadModel usually has
one and only one instance, shared among all concurrent requests hitting that servlet.
That means that, in servlets (and other multithreaded applications), an instance variable behaves very
much like a static variable, since it is shared among all threads. You have to be very careful about
synchronizing access to shared data.
The big difference between instance variables and static variables comes when you have configured
your servlet engine to instantiate two instances of the same servlet class, but with different init
parameters. In this case, there will be two instances of the same servlet class, which means two sets of
instance variables, but only one set of static variables.
Remember that you can store data in lots of different places in a servlet. To wit:
• Local variables - for loop iterators, result sets, and so forth
• Request attributes - for data that must be passed to other servlets invoked with the
RequestDispatcher
• Session attributes - persists for all future requests from the current user only
• Instance variables - for data that persists for the life of the servlet, shared with all concurrent
users
• Static variables - for data that persists for the life of the application, shared with all concurrent
users -- including any other servlet instances that were instantiated with different init parameters
• Context attributes - for data that must persist for the life of the application, and be shared with
all other servlets
100) How can I share data between two different web applications?
Different servlets may share data within one application via ServletContext. If you have a compelling
to put the servlets in different applications, you may wanna consider using EJBs.