Java Servlets - University of Texas at El Paso

Download Report

Transcript Java Servlets - University of Texas at El Paso

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 today’s 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 don’t 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.SearchPhoneBookServlet">
<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><%= rs.getString("last_name") %></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