Lecture3.1 - ServletBasics
Lecture3.1 - ServletBasics
• They are part of the Java 2 Platform, Enterprise Edition (J2EE), so industry support
for servlets is becoming even more pervasive.
5. Inexpensive
• A number of free or very inexpensive Web servers are good for
development use or deployment of low- or medium-volume Web sites.
• Thus, with servlets and JSP you can start with a free or inexpensive
server and migrate to more expensive servers with high-performance
capabilities or advanced administration utilities only after your project
meets initial success.
• Figure 1–1 shows a single arrow going from the client to the Web
server (the layer where servlets and JSP execute), but there are really
two varieties of data:
– the explicit data that the end user enters in a form and
– the behind-the-scenes HTTP information.
• This process may require talking to a database, executing an RMI or EJB call,
invoking a Web service, or computing the response directly.
• Fine. But your database probably doesn’t speak HTTP or return results in HTML,
so the Web browser can’t talk directly to the database.
• Even if it could, for security reasons, you probably would not want it to.
• The same argument applies to most other applications. You need the Web middle
layer to extract the incoming data from the HTTP stream, talk to the application,
and embed the results inside a document.
4. Send the explicit data (i.e., the document) to the client.
• Figure 1–1 shows a single arrow going from the Web middle layer (the
• servlet or JSP page) to the client.
• But, there are really two varieties of data sent:
– the document itself and
– the behind-the-scenes HTTP information.
• Again, both varieties are critical to effective development.
• Sending HTTP response data involves telling the browser or other client
what type of document is being returned (e.g., HTML), setting cookies and
caching parameters, and other such tasks.
• These tasks are discussed in week 4
Why Build Web Pages Dynamically?
HelloServlet.java
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
out.println("<HTML>\n" +
"<HEAD><TITLE>Hello</TITLE></HEAD>\n" +
"<BODY BGCOLOR=‘#FDF5E6’>\n" +
"<H1>Hello</H1>\n" +
"</BODY></HTML>");
}
}
A Quick Peek at Servlet Code
The Servlet Life Cycle
• Only a single instance of each servlet gets created, with each user request
resulting in a new thread that is handed off to doGet or doPost as appropriate.
• When the servlet is first created, its init method is invoked, so init is where you put
one-time setup code. After this, each user request results in a thread that calls the
service method of the previously created instance.
• Multiple concurrent requests normally result in multiple threads calling service
simultaneously, although your servlet can implement a special interface
(SingleThreadModel) that stipulates that only a single thread is permitted to run at
any one time.
• The service method then calls doGet, doPost, or another doXxx method,
depending on the type of HTTP request it received.
• Finally, if the server decides to unload a servlet, it first calls the servlet’s destroy
method.
The service Method
• Each time the server receives a request for a servlet, the server spawns a
new thread and calls service.
• The service method checks the HTTP request type (GET, POST, PUT,
DELETE, etc.) and calls doGet, doPost, doPut, doDelete, etc., as
appropriate.
• A GET request results from a normal request for a URL or from an HTML
form that has no METHOD specified.
• A POST request results from an HTML form that specifically lists POST as
the METHOD.
• Other HTTP requests are generated only by custom clients.
• 99% of the time, you only care about GET or POST requests, so you
override doGet and/or doPost.
Handling both POST and GET requests identically
The init Method
The destroy Method
• The server may decide to remove a previously loaded servlet instance,
perhaps because it is explicitly asked to do so by the server administrator
or perhaps because the servlet is idle for a long time.
• Before it does, however, it calls the servlet’s destroy method.
• This method gives your servlet a chance to close database connections,
halt background threads, write cookie lists or hit counts to disk, and perform
other such cleanup activities.
• Be aware, however, that it is possible for the Web server to crash
(remember those Massachusetts power outages?). So, don’t count on
destroy as the only mechanism for saving state to disk.
• If your servlet performs activities like counting hits or accumulating lists of
cookie values that indicate special access, you should also proactively
write the data to disk periodically.
The SingleThreadModel Interface
• Normally, the system makes a single instance of your servlet and then creates a new thread for each
user request. This means that if a new request comes in while a previous request is still executing,
multiple threads can concurrently be accessing the same servlet object.
• Consequently, your doGet and doPost methods must be careful to synchronize access to fields and
other shared data (if any) since multiple threads may access the data simultaneously.
• Note that local variables are not shared by multiple threads, and thus need no special protection. In
principle, you can prevent multithreaded access by having your servlet implement the
SingleThreadModel interface, as below.
public class YourServlet extends HttpServlet implements SingleThreadModel
{ ... }
• If you implement this interface, the system guarantees that there is never more than one request thread
accessing a single instance of your servlet.
• Although SingleThreadModel prevents concurrent access in principle, in practice there are two reasons
why it is usually a poor choice.
1. First, synchronous access to your servlets can significantly hurt performance (latency) if your servlet is
accessed frequently.
2. The second problem with SingleThreadModel stems from the fact that the specification permits
servers to use pools of instances instead of queueing up the requests to a single instance. As long as
each instance handles only one request at a time, the pool-of-instances approach satisfies the
requirements of the specification. But, it is a bad idea.
In-Class Exercise
1. Create a new app under C:\yourTomcatInstallation\webapps
2. Create the WEB-INF directory
3. Create classes directory under WEB-INF
4. Create and Compile Your Servlet
5. Compiled servlet needs to be under the classes directory
6. Create deployment descriptor web.xml
<web-app>
<servlet>
<servlet-name>lottery</servlet-name>
<servlet-class>LotteryNumbers</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>lottery</servlet-name>
<url-pattern>/lottery.do</url-pattern>
</servlet-mapping>
</web-app>
7. Save the web.xml under WEB-INF folder
8. Restart Tomcat
9. Run your web application