Java Servlets - Faculty.utep.edu

indexadjustmentInternet και Εφαρμογές Web

13 Νοε 2013 (πριν από 3 χρόνια και 9 μήνες)

71 εμφανίσεις

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


Single lightweight java thread handles multiple requests


Optimizations such as computation caching and keeping
connections to databases open


Convenient


Many programmers today already know java


Powerful


Can talk directly to the web server


Share data with other servlets


Maintain data from request to request


Portable


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”








Client

Server

Servlets

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 state
-
information 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.


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");



}


}




Simple Counter Example

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

<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>

Java server Page

Search_phone_book.jsp

Example: On
-
line Phone Book


Display Results

<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>

Java Server Page

Display_search_results.jsp

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)

thr
ows 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 = nu
ll;


// 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 != n
ull)){

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 Resul
tSet 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 Con
nectDB.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 ();

}

}


/**

* Ret
urns 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