Vous êtes sur la page 1sur 42

Java Servlets

What Are Servlets?

Basically, a java program that runs


on the server
Creates dynamic web pages

What Do They Do?

Handle data/requests sent by users


(clients)
Create and format results
Send results back to user

Who Uses Servlets?

Servlets are useful in many business


oriented websites

and MANY others

History

Dynamic websites were often created


with CGI
CGI: Common Gateway Interface
Poor solution to todays needs
A better solution was needed

Servlets vs. CGI

Servlet Advantages

Efficient

Convenient

Can talk directly to the web server


Share data with other servlets
Maintain data from request to request

Portable

Many programmers today already know java

Powerful

Single lightweight java thread handles multiple requests


Optimizations such as computation caching and keeping
connections to databases open

Java is supported by every major web browser (through


plugins)

Inexpensive

Adding servlet support to a server is cheap or free

Servlets vs. CGI

CGI Advantages

CGI scripts can be written in any


language
Does not depend on servlet-enabled
server

What Servlets Need

JavaServer Web Development Kit


(JSWDK)
Servlet capable server
Java Server Pages (JSP)
Servlet code

Java Server Web Development


Kit

JSWDK

Small, stand-alone server for testing


servlets and JSP pages

The J2EE SDK

Includes Java Servlets 2.4

Servlet capable server


Apache

Popular, open-source server

Tomcat

A servlet container used with Apache

Other servers are available

Java Server Pages

Lets you mix regular, static HTML pages


with dynamically-generated HTML
Does not extend functionality of Servlets
Allows you to separate look of the site
from the dynamic content

Webpage designers create the HTML


Servlet programmers create the dynamic
content
Changes in HTML dont effect servlets

<head>
</head>
<body>
<%
// jsp sample code
out.println(" JSP, ASP, CF, PHP - you name it, we support it!");
%>
</body>
</html>

<html>
<head>
</head>
<body>
<b>
JSP, ASP, CF, PHP - you name it, we support it!
</b>
</body>
</html>
</font>

<head>
</head>
<body>
<%
// jsp sample code
out.println(" JSP, ASP, CF, PHP - you name it, we support it!");
%>
</body>
</html>

<html>
<head>
</head>
<body>
<b>
JSP, ASP, CF, PHP - you name it, we support it!
</b>
</body>
</html>
</font>

<head>
</head>
<body>
<%
// jsp sample code
out.println(" JSP, ASP, CF, PHP - you name it, we support it!");
%>
</body>
</html>

<html>
<head>
</head>
<body>
<b>
JSP, ASP, CF, PHP - you name it, we support it!
</b>
</body>
</html>
</font>

<head>
</head>
<body>
<%
// jsp sample code
out.println(" JSP, ASP, CF, PHP - you name it, we support it!");
%>
</body>
</html>

<html>
<head>
</head>
<body>
<b>
JSP, ASP, CF, PHP - you name it, we support it!
</b>
</body>
</html>
</font>

Servlet Code

Written in standard Java


Implement the javax.servlet.Servlet
interface

package servlet_tutorials.PhoneBook;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import java.sql.*;
import java.net.*;
public class SearchPhoneBookServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
String query = null;
String where = null;
String firstname = null;
String lastname = null;
ResultSet rs = null;
res.setContentType("text/html");
PrintWriter out = res.getWriter();
// check which if any fields in the submitted form are empty
if (req.getParameter("FirstName").length() > 0)
firstname = req.getParameter("FirstName");
else firstname = null;
}

Main Concepts of Servlet


Programming

Life Cycle
Client Interaction
Saving State
Servlet Communication
Calling Servlets
Request Attributes and Resources
Multithreading

Life Cycle

Initialize
Service
Destroy

Life Cycle: Initialize

Servlet is created when servlet


container receives a request from the
client

Init() method is called only once

Life Cycle: Service

Any requests will be forwarded to the


service() method

doGet()
doPost()
doDelete()
doOptions()
doPut()
doTrace()

Life Cycle: Destroy

destroy() method is called only once


Occurs when

Application is stopped
Servlet container shuts down

Allows resources to be freed

Client Interaction

Request

Client (browser) sends a request containing

Request line (method type, URL, protocol)


Header variables (optional)
Message body (optional)

Response

Sent by server to client

response line (server protocol and status code)


header variables (server and response information)
message body (response, such as HTML)

Thin clients (minimize download)


Java all server side

Servlets

Client

Server

Saving State

Session Tracking

A mechanism that servlets use to


maintain state about a series of
requests from the same user (browser)
across some period of time.

Cookies

A mechanism that a servlet uses to have


clients hold a small amount of stateinformation associated with the user.

Servlet Communication

To satisfy client requests, servlets


sometimes need to access network
resources: other servlets, HTML
pages, objects shared among
servlets at the same server, and so
on.

Calling Servlets

Typing a servlet URL into a browser


window

Servlets can be called directly by typing


their URL into a browser's location window.

Calling a servlet from within an HTML


page

Servlet URLs can be used in HTML tags,


where a URL for a CGI-bin script or file URL
might be found.

Request Attributes and


Resources

Request Attributes

getAttribute
getAttributeNames
setAttribute

Request Resources - gives you


access to external resources

getResource
getResourceAsStream

Multithreading

Concurrent requests for a servlet are handled


by separate threads executing the
corresponding request processing method
(e.g. doGet or doPost). It's therefore important
that these methods are thread safe.
The easiest way to guarantee that the code is
thread safe is to avoid instance variables
altogether and instead use synchronized
blocks.

Simple Counter Example

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class SimpleCounter extends HttpServlet {


int count = 0;
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
res.setContentType("text/plain");
PrintWriter out = res.getWriter();
count++;
out.println("This servlet has been accessed " + count + " times
since loading");
}
}

MultiThread Problems

Problem - Synchronization between threads


count++; // by thread1
count++; // by thread2
out.println.. // by thread1
out.println.. // by thread2

Two Requests will


get the same
value of counter

Solution - Use Synchronized Block!

Synchronized Block
Lock(Monitor)

Better Approach

The approach would be to synchronize only the


section of code that needs to be executed
automically:
PrintWriter out = res.getWriter();
synchronized(this)
{
count++;
out.println("This servlet has been accessed " +
count + "times since loading");
}
This reduces the amount of time the servlet
spends in its synchronized block, and still
maintains a consistent count.

Example: On-line Phone


Book

Design

Example: On-line Phone


Book

Search Form

Java server Page


Search_phone_book.jsp

<html>
<head>
<title>Search Phonebook</title>
</head>
<body bgcolor="#FFFFFF"> <p><b>
Search Company Phone Book</b></p>
<form name="form1" method="get"
action="servlet/servlet_tutorials.PhoneBook.SearchPhoneBookServl
et">
<table border="0" cellspacing="0" cellpadding="6"> <tr> <td >Search
by</td> <td>
</td> </tr> <tr> <td><b>
First Name
</b></td> <td>
<input type="text" name="FirstName"> AND/OR</td> </tr> <tr> <td
><b>
Last Name
</b></td> <td >
<input type="text" name="LastName"></td> </tr> <tr> <td ></td> <td
>
<input type="submit" name="Submit" value="Submit">
</td> </tr> </table>
</form>
</body>
</html>

Example: On-line Phone


Book

Display Results

Java Server Page


Display_search_results.jsp

<html>
<%@page import ="java.sql.*" %>
<jsp:useBean id="phone" class="servlet_tutorials.PhoneBook.PhoneBookBean"/>
<%@ page buffer=35 %>
<%@ page errorPage="error.jsp" %>
<html>
<head>
<title>Phone Book Search Results</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> </head>
<body bgcolor="#FFFFFF"> <b>Search Results</b> <p>
<% String q = request.getParameter("query");
ResultSet rs = phone.getResultSet(q);
%>
<% if (rs.wasNull()) {
%>
"NO RESULTS FOUND"
<%
} else
%>
<table> <tr> <td> <div align="center">First Name</b></div> </td> <td> <div
align="center">Last Name</font></b></div> </td> <td> <div align="center">Phone
Number</font></b></div> </td> <td> <div align="center">Email</font></b></div> </td>
</tr>
<% while(rs.next()) { %> <tr> <td>
<%= rs.getString("first_name") %></td>
%></td> <td><%=
<td><%= rs.getString("last_name") %></td>
%></td>
<td><%=
<td><%= rs.getString("phone_number") %>
</td> <td>
<%= rs.getString("e_mail") %>
%>
</td> </tr>
<% } %>
</table>

Servlet
Listing 2 SearchPhoneBookServlet.java
package servlet_tutorials.PhoneBook;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import java.sql.*;
import java.net.*;
public class SearchPhoneBookServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
String query = null;
String where = null;
String firstname = null;
String lastname = null;
ResultSet rs = null;
res.setContentType("text/html");
PrintWriter out = res.getWriter();
// check which if any fields in the submitted form are empty
if (req.getParameter("FirstName").length() > 0)
firstname = req.getParameter("FirstName");
else firstname = null;
if (req.getParameter("LastName").length() > 0)
lastname = req.getParameter("LastName");
else lastname = null;
// Build sql query string
if ((firstname != null) && (lastname != null)){
where = "first_name ='";
where += firstname;
where += "' AND ";
where += "last_name ='";
where += lastname;
where += "'";
}
else if ((firstname == null) && (lastname != null)){
where = "last_name ='";
where += lastname;
where += "'";
}

Java Bean & Database


linked

Listing 4 PhoneBookBean.java

package servlet_tutorials.PhoneBook;
import java.io.*;
import java.net.*;
import java.sql.*;
import java.util.*;
public class PhoneBookBean {
private Connection con = null;
private Statement stmt = null;
private ResultSet rs = null;
private String query = null;
public PhoneBookBean() {}
public ResultSet getResultSet(String query) {
// grab a connection to the database
con = ConnectDB.getConnection();
try{
stmt = con.createStatement();
// run the sql query to obtain a result set
rs = stmt.executeQuery(query);
}
catch(SQLException sqlex){
sqlex.printStackTrace();
}
catch (RuntimeException rex) {
rex.printStackTrace();
}
catch (Exception ex) {
ex.printStackTrace(); }
return rs;
}
}

Listing 5 ConnectDB.java
package servlet_tutorials.PhoneBook;
import java.io.*;
import java.net.*;
import java.sql.*;
import java.util.*;
/**
* Re-usable database connection class
*/
public class ConnectDB {
// setup connection values to the database
static final String DB_DRIVER = "sun.jdbc.odbc.JdbcOdbcDriver";
static final String URL = "jdbc:odbc:PhoneBook";
static final String USERNAME = "anon_user";
static final String PASSWORD = "";
// Load the driver when this class is first loaded
static {
try {
Class.forName(DB_DRIVER).newInstance();
}
catch (ClassNotFoundException cnfx) {
cnfx.printStackTrace();
}
catch (IllegalAccessException iaex){
iaex.printStackTrace();
}
catch(InstantiationException iex){
iex.printStackTrace ();
}
}
/**
* Returns a connection to the database
*/
public static Connection getConnection() {
Connection con = null;
try {
con = DriverManager.getConnection(URL, USERNAME, PASSWORD);
}
catch (Exception e) {
e.printStackTrace();
}
finally {
return con;

Conclusion

Questions? Comments?

References

http://www.apl.jhu.edu/~hall/java/Servlet-Tutorial/Servlet-Tutorial-Overview.
html
www.cis.upenn.edu/~matuszek/ cit597-2004/Lectures/21-servlets.ppt
http://learning.unl.ac.uk/im269/lectures/week6servletsp1.ppt
http://java.sun.com/docs/books/tutorialNB/download/tut-servlets.zip
http://www.webdevelopersjournal.com/articles/intro_to_servlets.html

Vous aimerez peut-être aussi