Servlets

nutmegactΛογισμικό & κατασκευή λογ/κού

10 Νοε 2012 (πριν από 4 χρόνια και 9 μήνες)

177 εμφανίσεις

Servlets


Servlets are modules that extend the functionality of a
“java
-
enabled” web
-
server


They normally generate HTML code and web content
dynamically. This is sent to the browser which displays it.


For example, they send a query to a database based on
parameters sent by the browser and send the results to the
browser in html format

Development Environments



There are many good development environments
which help to write and test the servlets


They include an editor and a java
-
enabled sever


They also include all the necessary jar files an import
statements


Some of them are Eclipse (need to download plugins)
and Netbeans (which also has full j2ee support

Anatomy of a Servlet


A new servlet can be written by extending the
HttpServlet class which has the following pre
-
defined
methods


init()



is called when the servlet is “uploaded” the first time (this can
vary depending on the server)


doGet(HttpServletRequest req, HttpServletResponse
res) throws ServletException, IOException



is called every time the servlet is contacted by a GET request
(which is the default way)


doPost(HttpServletRequest req, HttpServletResponse
res) throws ServletException, IOException



is called when the client contacted the servlet with a POST
request


import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;


public class MyServlet extends HttpServlet {



public void init() {


//Overwrite


}



public void doGet ( HttpServletRequest

request,


HttpServletResponse response)








throws ServletException, IOException {


// Overwrite


}



public void doPost( HttpServletRequest request,




HttpServletResponse response)









throws ServletException, IOException {


//Overwrite


}


}

The HttpServletRequest
Parameter



HttpServletRequest
is the class of the first
parameter the server uses to calls doGet and
doPost. It gives access to:


Information about the client, for example, parameters
passed, protocol used, client’s host, etc.


The input stream,
ServletInputStream

is used by the
servlet to receive data from the client when the method
POST or PUT has been used.

The HttpServletResponse
parameter



HttpServletResponse

is the class of the second
argument.


Provides methods for :


Declaring the MIME type of the answer that will be
sent to the client


Getting the output stream
ServletOutputStream

and a
Writer

through which the servlet can send dinamically
generated html code to the browser.


Sending other information to the browser (cookies,
refreshment time, etc…)


Example 1

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

import java.util.Date;


public class SimpleServlet extends HttpServlet {



public void doGet ( HttpServletRequest

request,


HttpServletResponse response) throws








ServletException, IOException {




// set content type


response.setContentType("text/html");



// open print writer to browser



PrintWriter out = response.getWriter();


//send data


out.println("<HTML>")



out.println("<H1> Mi Primer Servlet </H1>");



out.println("<BR> <H2>Fecha y hora: "+(new Date())+"<H2>");



out.println("</HTML>");



out.close();


}

}



Example 1

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

import java.util.Date;


public class SimpleServlet extends HttpServlet {



public void doGet ( HttpServletRequest

request,


HttpServletResponse response) throws








ServletException, IOException {




// set content type


response.setContentType("text/html");



// open print writer to browser



PrintWriter out = response.getWriter();


//send data


out.println("<HTML>")



out.println("<H1> Mi Primer Servlet </H1>");



out.println("<BR> <H2>Fecha y hora: "+(new Date())+"<H2>");



out.println("</HTML>");



out.close();


}

}



Imports necessary classes

This is for the Date class

Example 1

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

import java.util.Date;


public class SimpleServlet extends HttpServlet {



public void doGet ( HttpServletRequest

request,


HttpServletResponse response) throws








ServletException, IOException {




// set content type


response.setContentType("text/html");



// open print writer to browser



PrintWriter out = response.getWriter();


//send data


out.println("<HTML>")



out.println("<H1> Mi Primer Servlet </H1>");



out.println("<BR> <H2>Fecha y hora: "+(new Date())+"<H2>");



out.println("</HTML>");



out.close();


}

}



Every servlet extends HttpServlet

Overwrites doGet method

Example 1

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

import java.util.Date;


public class SimpleServlet extends HttpServlet {



public void doGet ( HttpServletRequest

request,


HttpServletResponse response) throws








ServletException, IOException {




// set content type


response.setContentType("text/html");



// open print writer to browser



PrintWriter out = response.getWriter();


//send data


out.println("<HTML>")



out.println("<H1> Mi Primer Servlet </H1>");



out.println("<BR> <H2>Fecha y hora: "+(new Date())+"<H2>");



out.println("</HTML>");



out.close();


}

}



Tells the browser the content

type of the answer

Gets writer to browser from response
parameter

Example 1

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

import java.util.Date;


public class SimpleServlet extends HttpServlet {



public void doGet ( HttpServletRequest

request,


HttpServletResponse response) throws








ServletException, IOException {




// set content type


response.setContentType("text/html");



// open print writer to browser



PrintWriter out = response.getWriter();


//send data


out.println("<HTML>")



out.println("<H1> Mi Primer Servlet </H1>");



out.println("<BR> <H2>Fecha y hora: "+(new Date())+"<H2>");



out.println("</HTML>");



out.close();


}

}



Get date and time from system

Print

data

to

browser

Close connection to browser

Running the first example


Writing a servlet with Netbeans is very easy


Also the deployment is done automatically


Open netbeans


Create a web project (this will create a lot of
directories for putting the different kind of
files)


Create a servlet


Copy the code of SimpleServlet.java


Run the file


A second example


Implementing a web counter


It will count how many times an object of
this class has been creates


It will show the Address of the computer
that contacted the servlet


It will show a


import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;


public class Count extends HttpServlet {



int count = 0;




// a counter starts in 0




public void doGet ( HttpServletRequest req,



HttpServletResponse res) throws


ServletException, IOException {




count++;




PrintWriter out = res.getWriter();



res.setContentType("text/html");




out.println("<H1> A web page counter </H1>");



out.println("<HR>");



out.println("This servlet was accessed "+count+" time(s)");



out.println("<HR>");



out.println("Your computer is "+req.getRemoteHost());



out.println("<HR>");


out.close();


}

}

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;


public class Count extends HttpServlet {



int count = 0;




// a counter starts in 0




public void doGet ( HttpServletRequest req,



HttpServletResponse res) throws


ServletException, IOException {




count++;




PrintWriter out = res.getWriter();



res.setContentType("text/html");




out.println("<H1> A web page counter </H1>");



out.println("<HR>");



out.println("This servlet was accessed "+count+" time(s)");



out.println("<HR>");



out.println("Your computer is "+req.getRemoteHost());



out.println("<HR>");


out.close();


}

}

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;


public class Count extends HttpServlet {



int count = 0;




// a counter starts in 0




public void doGet ( HttpServletRequest req,



HttpServletResponse res) throws


ServletException, IOException {




count++;




PrintWriter out = res.getWriter();



res.setContentType("text/html");




out.println("<H1> A web page counter </H1>");



out.println("<HR>");



out.println("This servlet was accessed "+count+" time(s)");



out.println("<HR>");



out.println("Your computer is "+req.getRemoteHost());



out.println("<HR>");


out.close();


}

}

Increments counter every time doGet

is called by the web server

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;


public class Count extends HttpServlet {



int count = 0;




// a counter starts in 0




public void doGet ( HttpServletRequest req,



HttpServletResponse res) throws


ServletException, IOException {




count++;




PrintWriter out = res.getWriter();



res.setContentType("text/html");




out.println("<H1> A web page counter </H1>");



out.println("<HR>");



out.println("This servlet was accessed "+count+" time(s)");



out.println("<HR>");



out.println("Your computer is "+req.getRemoteHost());



out.println("<HR>");


out.close();


}

}

Sine Qua Non

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;


public class Count extends HttpServlet {



int count = 0;




// a counter starts in 0




public void doGet ( HttpServletRequest req,



HttpServletResponse res) throws


ServletException, IOException {




count++;




PrintWriter out = res.getWriter();



res.setContentType("text/html");




out.println("<H1> A web page counter </H1>");



out.println("<HR>");



out.println("This servlet was accessed "+count+" time(s)");



out.println("<HR>");



out.println("Your computer is "+req.getRemoteHost());



out.println("<HR>");


out.close();


}

}

Print

data

to

browser

What happens if the server crashes
and starts again ?


The counter will start from 0 again


To “remember” the value of the counter in
cast of an unexpected crash, we will write
the value of the variable in a file every time
it changes.


At the beginning, the servlet reads the initial
value from a file, if it exists, or creates the
file with the initial value = 0

public class Count extends HttpServlet {



int count = 0;




// a counter for the object




public void init() {


try {


BufferedReader in = new BufferedReader(








newFileReader(„count.txt“));


String l = in.readLine();


count = Integer.parseInt(l);


} catch (FileNotFoundException e) {




//no need to do anything here


}






}








public void doGet ( HttpServletRequest req,



HttpServletResponse res) throws


ServletException, IOException {



count++;



PrintWriter outFile = new PrintWriter(






new Filereader(„count.txt“));



outFile.println(count);




outFile.close();




PrintWriter outBrowser = res.getWriter();



res.setContentType("text/html");



outBrowser.println("<H1> A web page counter </H1>");



outBrowser.println("<HR>");




.....


.....


}

}

public class Count extends HttpServlet {



int count = 0;




// a counter for the object





public void init() {


try {


BufferedReader in = new BufferedReader(








newFileReader(„count.txt“));


String l = in.readLine();


count = Integer.parseInt(l);



} catch (FileNotFoundException e) {




//no need to do anything here


}






}








public void doGet ( HttpServletRequest req,



HttpServletResponse res) throws


ServletException, IOException {



count++;



PrintWriter outFile = new PrintWriter(






new Filereader(„count.txt“));



outFile.println(count);




outFile.close();




PrintWriter outBrowser = res.getWriter();



res.setContentType("text/html");



outBrowser.println("<H1> A web page counter </H1>");



outBrowser.println("<HR>");




.....


.....


}

}

Try to open the

file when

the servlet is

called the first time

public class Count extends HttpServlet {



int count = 0;




// a counter for the object





public void init() {


try {


BufferedReader in = new BufferedReader(








newFileReader(„count.txt“));



String l = in.readLine();


count = Integer.parseInt(l);


}
catch (FileNotFoundException e)

{




//no need to do anything here


}






}








public void doGet ( HttpServletRequest req,



HttpServletResponse res) throws


ServletException, IOException {



count++;



PrintWriter outFile = new PrintWriter(






new Filereader(„count.txt“));



outFile.println(count);




outFile.close();




PrintWriter outBrowser = res.getWriter();



res.setContentType("text/html");



outBrowser.println("<H1> A web page counter </H1>");



outBrowser.println("<HR>");




.....


.....


}

}

Read the line and

convert the content

to its integer

value

public class Count extends HttpServlet {



int count = 0;




// a counter for the object




public void init() {


try {


BufferedReader in = new BufferedReader(








newFileReader(„count.txt“));


String l = in.readLine();


count = Integer.parseInt(l);



} catch (FileNotFoundException e) {




//no need to do anything here


}






}








public void doGet ( HttpServletRequest req,



HttpServletResponse res) throws


ServletException, IOException {



count++;



PrintWriter outFile = new PrintWriter(






new Filereader(„count.txt“));



outFile.println(count);




outFile.close();




PrintWriter outBrowser = res.getWriter();



res.setContentType("text/html");



outBrowser.println("<H1> A web page counter </H1>");



outBrowser.println("<HR>");




.....


.....


}

}

public class Count extends HttpServlet {



int count = 0;




// a counter for the object




public void init() {


try {


BufferedReader in = new BufferedReader(








newFileReader(„count.txt“));


String l = in.readLine();


count = Integer.parseInt(l);


} catch (FileNotFoundException e) {




//no need to do anything here


}


}








public void doGet ( HttpServletRequest req,



HttpServletResponse res) throws


ServletException, IOException {





count++;



PrintWriter outFile = new PrintWriter(




new Filereader(„count.txt“));



outFile.println(count);




outFile.close();




PrintWriter outBrowser = res.getWriter();



res.setContentType("text/html");



outBrowser.println("<H1> A web page counter </H1>");



outBrowser.println("<HR>");




.....


.....


}

}

After count is incremented,


open the file to write

(overwrite),

write the new number

and close file

public class Count extends HttpServlet {



int count = 0;




// a counter for the object




public void init() {


try {


BufferedReader in = new BufferedReader(








newFileReader(„count.txt“));


String l = in.readLine();


count = Integer.parseInt(l);


} catch (FileNotFoundException e) {




//no need to do anything here


}






}








public void doGet ( HttpServletRequest req,



HttpServletResponse res) throws


ServletException, IOException {



count++;



PrintWriter outFile = new PrintWriter(






new Filereader(„count.txt“));



outFile.println(count);




outFile.close();




PrintWriter outBrowser = res.getWriter();



res.setContentType("text/html");



outBrowser.println("<H1> A web page counter </H1>");



outBrowser.println("<HR>");




.....


.....


}

}

The rest

is

the

same