Representation and Management of Data on the Web

62
1 Servlets Servlets Representation and Management of Data on the Web

description

What is a Servlet? Servlets are Java programs that can be run dynamically from a Web Server Servlets are a server-side technology A servlet is an intermediating layer between an HTTP request of a client and the Web server

Transcript of Representation and Management of Data on the Web

Page 1: Representation and Management of Data on the Web

1

ServletsServlets

Representation and Management of Data on the

Web

Page 2: Representation and Management of Data on the Web

2

What is a Servlet?What is a Servlet?

• Servlets are Java programs that can be run dynamically from a Web Server

• Servlets are a server-side technology• A servlet is an intermediating layer

between an HTTP request of a client and the Web server

Page 3: Representation and Management of Data on the Web

3

What do Servlets do?What do Servlets do?

• Read data sent by the user (e.g., form data)• Look up other information about request in the HTTP

request (e.g., headers, cookies, etc.)• Generate the results (may do this by talking to a

database, file system, etc.)• Format the results in a document (e.g., make it into

HTML• Set the appropriate HTTP response parameters (e.g.,

cookies, content-type, etc.)• Send the document to the user

Page 4: Representation and Management of Data on the Web

4

Why use a Servlet?Why use a Servlet?

• Servlets are used to create dynamic pages. Why?– Page is based on data submitted by the

user. Example Scenario:– Page is derived from data that changes

often. Example Scenario:– Page uses information from server-side

sources. Example Scenario:

Page 5: Representation and Management of Data on the Web

5

A Java ServletA Java Servlet

Web browser

Web server

Servletrequest request

responseresponse

Page 6: Representation and Management of Data on the Web

6

Supporting ServletsSupporting Servlets

• The Web server must support servlets (since it must run the servlets):– Apache Tomcat– Sun’s JavaServer Web Development Kit (JSWDK)– Allaire Jrun – an engine that can be added to IIS,

PWS, old Apache Web servers etc…– Sun’s Java Web Server– …

We will talk about installing, configuring and running tomcat next week!

Page 7: Representation and Management of Data on the Web

7

CompilingCompiling

• In order to compile a servlet, you may need to add to your CLASSPATH definition the following:

setenv CLASSPATH ${CLASSPATH}:/usr/local/java/apache/jakarta-tomcat/lib/ant.jar:/usr/local/java/apache/jakarta-tomcat/lib/jasper.jar:/usr/local/java/apache/jakarta-tomcat/lib/jaxp.jar:/usr/local/java/apache/jakarta-tomcat/lib/parser.jar:/usr/local/java/apache/jakarta-tomcat/lib/servlet.jar:/usr/local/java/apache/jakarta-tomcat/ lib/webserver.jar

Page 8: Representation and Management of Data on the Web

8

Servlet PackageServlet Package

• Need to import: javax.servlet.*;• The Servlet interface defines methods that

manage servlets and their communication with clients

• When a connection is formed, the servlet receives two objects that implement:– ServletRequest– ServletResponse

Page 9: Representation and Management of Data on the Web

9

Object HierarchyObject Hierarchy

YourOwnServlet

HttpServlet

Generic Servlet

Servlet

Page 10: Representation and Management of Data on the Web

10

Creating a ServletCreating a Servlet

• Extend the class HTTPServlet• Implement doGet or doPost (or both)• Both methods get:

– ServletRequest: methods for getting form (query) data, HTTP request headers, etc.

– ServletResponse: methods for setting HTTP status codes, HTTP response headers, and get a PrintWriter used for sending data to the client

• Usually implement doPost by calling doGet, or vice-versa

Page 11: Representation and Management of Data on the Web

11

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

public class TextHelloWorld extends HttpServlet {public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {PrintWriter out = res.getWriter();out.println("Hello World"); out.close();}public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {doGet(req, res);}

}

Page 12: Representation and Management of Data on the Web

12

Returning HTMLReturning HTML

• By default a text response is generated. • In order to generate HTML

– Tell the browser you are sending HTML, by setting the Content-Type header

– Modify the println to create a legal HTML page• You must set all headers before returning

the document content. Can you guess why?

Page 13: Representation and Management of Data on the Web

13

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

public class HelloWorld extends HttpServlet {public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {res.setContentType("text/html");PrintWriter out = res.getWriter();

out.println("<HTML><HEAD><TITLE>Hello World</TITLE></HEAD>");

out.println(“<BODY><BIG>Hello World </BIG></BODY></HTML>");out.close();}

}

Page 14: Representation and Management of Data on the Web

14

Page 15: Representation and Management of Data on the Web

15

Servlet Life CycleServlet Life Cycle

• No main() method!• The server initializes and loads the servlet• The servlet handles client requests• The server can remove the servlet• The servlet can remain loaded to handle

additional requests• Incur startup costs only once (hopefully)

Page 16: Representation and Management of Data on the Web

16

Servlet Life CycleServlet Life Cycle

Servlet Class

Calling the init method

Load into Web server

Deal with requests:call the

service method

Destroy the servlet: call the

destroy method

Garbage Collection

ServletConfig

Page 17: Representation and Management of Data on the Web

17

Initializing ServletsInitializing Servlets

• Performed when the servlet is loaded into the Web server

• Servlet’s init(ServletConfig) method is called• ServletConfig has methods to get initialization

parameters. You put these parameters in a file. We will explain how next week.

• What would you do in the init method?– creating tables in a database (yes / no)– create Connection object to communicate with the

database (yes / no)

Page 18: Representation and Management of Data on the Web

18

<?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE web-appPUBLIC "-//Sun Microsystems,Inc.//DTD Web Application 2.2//EN""http://java.sun.com/j2ee/dtds/web-app_2.2.dtd"><web-app>

<servlet> <servlet-name>InitExample</servlet-name> <servlet-class>ServletInit</servlet-class>

<init-param> <param-name>login</param-name> <param-value>snoopy</param-value> </init-param> </servlet></web-app>

A Glance at Servlet A Glance at Servlet Configuration ParametersConfiguration Parameters

Page 19: Representation and Management of Data on the Web

19

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

public class ServletInit extends HttpServlet { Connection con; public void init(ServletConfig config)

throws ServletException {// Always call super.initsuper.init(config);String login = config.getInitParameter("login");Class.forName("oracle.jdbc.driver.OracleDriver");con = DriverManager.getConnection("jdbc:oracle:thin:" +

login + "/" + login + "@sol4:1521:stud"); }

Page 20: Representation and Management of Data on the Web

20

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter();

out.println("<HTML><BODY><h1>Member List</h1><ul>"); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("select name from member"); while (rs.next())

out.println("<li>" + rs.getString(1)); out.println("</ul></BODY></HTML>"); }}

Page 21: Representation and Management of Data on the Web

21

The service MethodThe service Method• Every time the server receives a request for the

servlet it:– creates a thread for the request– calls the service method

• The service method checks the type of request (GET, POST, PUT, DELETE, TRACE, OPTION) and call the appropriate method: doGet, doPost, doPut, doDelete, doTrace, doOption

• It is recommended to implement doPost and doGet instead of overriding service. Why?

Page 22: Representation and Management of Data on the Web

22

HTTP MethodsHTTP Methods• POST: Data sent in two steps

– Browser contacts server– Sends data

• GET: Contacts server and sends data in single step– Called when you enter a URL in the browser

directly– Can be called by a form: appends form data to

action URL, separated by question mark

Page 23: Representation and Management of Data on the Web

23

Other MethodsOther Methods

• HEAD: Client sees only header of response to determine size, etc…

• PUT: Place documents directly on server• DELETE: Opposite of PUT• TRACE: Debugging aid returns to client

contents of its request• OPTIONS: what options available on

server

Page 24: Representation and Management of Data on the Web

24

More on ServiceMore on Service

• There is an automatic support for TRACE and OPTIONS by servlet so you do not have to implement them

• There is no method doHead. Why?

Page 25: Representation and Management of Data on the Web

25

The Standard ModelThe Standard Model

• Usually there is a single instance of a servlet and a thread for each user request

• The doGet and doPost methods must synchronize access to data structures and other resources!

Instance of your

Servlet

thread 1

thread 2

thread 3

Page 26: Representation and Management of Data on the Web

26

The Single Thread ModelThe Single Thread Model

• If you need to prevent concurrent access to a single instance of your thread use the single thread model

public class YourServlet extends HttpServletimplements SingleThreadModel {…

}

Page 27: Representation and Management of Data on the Web

27

SingleThreadModelSingleThreadModel• SingleThreadModel is a marker interface

– No methods – Tells servlet engines about lifecycle expectations

• Ensure that no two threads will execute concurrently the service method of the same instance of the servlet

Page 28: Representation and Management of Data on the Web

28

Server implementation of Server implementation of the Single Thread Modelthe Single Thread Model

• Option 1: There is a pool of instances of the servlet. Requests for the servlet are queued get an arbitrary instance, or are queued, if necessary.

• Option 2: For each request, an instance of the servlet is created.

Page 29: Representation and Management of Data on the Web

29

The Two OptionsThe Two OptionsInstance of your Servlet

thread 2Instance of your Servlet

thread 1

Queuethread 3

thread 3

thread 4 Pool of Instances

Instance Per

Thread

Instance of your

Servletthread 1

Instance of your

Servletthread 3 Instance of

your Servlet

thread 4

Instance of your

Servletthread 2

Page 30: Representation and Management of Data on the Web

30

SingleThreadModelSingleThreadModel• SingleThreadModel let you break servlet functionality

into multiple methods • Can rely on “instance state” being uncorrupted by other

requests• Does this prevents the need to synchronize access to

all resources?• Can’t rely on static members• Can't rely on persistent instance state between

connections– The same client making the same request, can get different

instances of your servlet

Page 31: Representation and Management of Data on the Web

31

Destroying ServletsDestroying Servlets

• The server may remove a loaded servlet, Why?:– asked to do so by administrator– Servlet was idle a long time

• Before removing, calls the destroy() method– can perform cleanup, e.g., close database

connections• Is it possible for the servlet to end without

destroy being called?

Page 32: Representation and Management of Data on the Web

32

Example – Counting ThreadsExample – Counting Threadspublic ShutdownExample extends HttpServlet { private int serviceCounter = 0; ... //Access methods for serviceCounter protected synchronized void enteringServiceMethod()

{serviceCounter++;

} protected synchronized void leavingServiceMethod()

{serviceCounter--;

} protected synchronized int numServices() {

return serviceCounter; }

Page 33: Representation and Management of Data on the Web

33

protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

enteringServiceMethod();

try { super.service(req, resp); } finally { leavingServiceMethod(); }}

Page 34: Representation and Management of Data on the Web

34

Notifying a ShutdownNotifying a Shutdown

public ShutdownExample extends HttpServlet { private boolean shuttingDown; //Number of services, from before... //Access methods for shuttingDown protected setShuttingDown(boolean flag) {

shuttingDown = flag; } protected boolean isShuttingDown() {

return shuttingDown; }}

Page 35: Representation and Management of Data on the Web

35

public void destroy() {

/* Check to see whether there are still * service methods running, * and if there are, tell them to stop. */ if (numServices() > 0) { setShuttingDown(true);

}

/* Wait for the service methods to stop. */ while(numServices() > 0) {

try { Thread.sleep(interval); } catch (InterruptedException e) {} } }

Page 36: Representation and Management of Data on the Web

36

public void doPost(...) { ...

for(i = 0; ((i < numberOfThingsToDo) && !isShuttingDown()); i++) {

try {partOfLongRunningOperation(i);

} catch (InterruptedException e) {} } }

Page 37: Representation and Management of Data on the Web

37

Getting Information Getting Information From the UserFrom the User

Page 38: Representation and Management of Data on the Web

38

Handling a User RequestHandling a User Request

• The servlet can get parameters from an HTML form

• <form action=… method=…> …</form> comprises a single form – action – the address to which the form data

is sent– method – the HTTP method to use when

passing parameters to the server

Page 39: Representation and Management of Data on the Web

39

The The <input><input> Tag Tag

• Inside a form, INPUT tags define fields for data entry

• Standard input types include: buttons, checkboxes, password field, radio buttons, text fields, image-buttons, text areas, hidden fields, etc.

• They all associate a single (string) value with a named parameter

Page 40: Representation and Management of Data on the Web

40

ExampleExample<HTML>…<form method=“GET” action=“http://pita.cs.huji.ac.il:8090/servlet/update”>

…<INPUT name=“x” type=“text”><INPUT name=“y” type=“text”><INPUT type=“submit”> <INPUT type=“reset”></form>…</HTML>

http://pita.cs.huji.ac.il:8090/servlet/update?x=19&y=104

Page 41: Representation and Management of Data on the Web

41

Getting the Parameters Getting the Parameters ValuesValues

• To get the value of a parameter named x:– req.getParameter("x") where req is HTTPServletRequest object

• If there can be multiple values for the parameter: – req.getParameterValues()

• To get parameter names: – req.getParameterNames()

Page 42: Representation and Management of Data on the Web

42

<HTML><HEAD> <TITLE>Sending Parameters</TITLE></HEAD><BODY BGCOLOR="#CC90E0"><H1 ALIGN="LEFT">Please enter the parameters</H1>

<FORM ACTION=“dbi/servlet/SetColors” METHOD=“GET”> <TABLE> <TR><TD>Background color:</TD> <TD><INPUT TYPE="TEXT" NAME="bgcolor"></TD></TR> <TR><TD>Font color:</TD> <TD><INPUT TYPE="TEXT" NAME="fgcolor"></TD></TR> <TR><TD>Font size:</TD> <TD><INPUT TYPE="TEXT" NAME="size"></TD></TR> </TABLE> <BR> <INPUT TYPE="SUBMIT" VALUE="Show Page"></FORM>

</BODY></HTML>

Page 43: Representation and Management of Data on the Web

43

http://pita.cs.huji.ac.il:8080/colors.html

Page 44: Representation and Management of Data on the Web

44

http://pita.cs.huji.ac.il:8080/dbi/servlet/SetColors?bgcolor=wheat&fgcolor=blue&size=5

Page 45: Representation and Management of Data on the Web

45

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

public class SetColors extends HttpServlet { public void doGet(HttpServletRequest request,

HttpServletResponse response)throws ServletException, IOException {

response.setContentType("text/html");PrintWriter out = response.getWriter();String bg = request.getParameter("bgcolor");String fg = request.getParameter("fgcolor");String size = request.getParameter("size");

Page 46: Representation and Management of Data on the Web

46

out.println("<HTML><HEAD><TITLE>Set Colors Example" + "</TITLE></HEAD>");

out.println("<BODY text='" + fg + "' bgcolor='" + bg + "'>");

out.println("<H1>Set Colors Example</H1>");out.println("<FONT size='" + size + "'>");out.println("You requested a background color " +

bg + "<P>");out.println("You requested a font color " +

fg + "<P>");out.println("You requested a font size " +

size + "<P>");out.println("</FONT></BODY></HTML>");

}}

Page 47: Representation and Management of Data on the Web

47

Think About itThink About it

• Could you have implemented this example (or something similar) using Javascript?

• Should you use Javascript for something like this? When?

Page 48: Representation and Management of Data on the Web

48

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

doGet(request, response);}

• You don't have to do anything different to read POST data instead of GET data!!

<FORM ACTION=“dbi/servlet/SetColors” METHOD=“POST”>

Handling PostHandling Post

Page 49: Representation and Management of Data on the Web

49

Getting Information from Getting Information from Client RequestClient Request

• Suppose that req is a HTTPServletRequest object

• Get the value of the header "Accept": req.getHeader("Accept")

• Get all header names req.getHeaderNames()• Methods for special types of headers and

other info: getCookies, getContentLength, getContentType, getMethod, getProtocol, etc.

Page 50: Representation and Management of Data on the Web

50

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

public class ShowRequestHeaders extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

response.setContentType("text/html");PrintWriter out = response.getWriter();String title = "Servlet Example:

Showing Request Headers";

Page 51: Representation and Management of Data on the Web

51

out.println("<HTML><HEAD><TITLE>" + title + "</TITLE></HEAD>" + "<BODY BGCOLOR=\"#AACCAA\" TEXT=\"#990000\">\n" + "<H1 ALIGN=CENTER>" + title + "</H1>\n" + "<B>Request Method: </B>" + request.getMethod() + "<BR>\n" + "<B>Request URI: </B>" + request.getRequestURI() + "<BR>\n" + "<B>Request Protocol: </B>" + request.getProtocol() + "<BR><BR>\n" + "<TABLE BORDER=1 ALIGN=CENTER>\n" + "<TR BGCOLOR=\"#88AA88\">\n" + "<TH>Header Name<TH>Header Value");

Page 52: Representation and Management of Data on the Web

52

Enumeration headerNames = request.getHeaderNames();

while(headerNames.hasMoreElements()) { String headerName =(String)headerNames.nextElement(); out.println("<TR><TD>" + headerName); out.println("<TD>“ + request.getHeader(headerName)); } out.println("</TABLE>\n</BODY></HTML>"); }

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException { doGet(request, response); }}

Page 53: Representation and Management of Data on the Web

53

Page 54: Representation and Management of Data on the Web

54

Page 55: Representation and Management of Data on the Web

55

Creating the Creating the Response of the ServletResponse of the Servlet

Page 56: Representation and Management of Data on the Web

56

HTTP ResponseHTTP Response

• The response includes:– Status line: version, status code, status

message– Response headers– Empty line– Document

HTTP/1.1 200 OKContent-Type: text/plain

Bla Bla Bla

Page 57: Representation and Management of Data on the Web

57

Response is BufferedResponse is Buffered

Servlet

serverBuffer

client

setBufferSizegetBufferSizeflushBufferetc.

request

response

Page 58: Representation and Management of Data on the Web

58

Setting the Response Setting the Response StatusStatus

• The status code of the HTTP response can be set by the setStatus method of HTTPServletResponse

• The status should be defined before sending content through the PrintWriter of the HTTPServletResponse

• The status can be defined after setting headers of the HTTPServletResponse

• The default status is 200

Page 59: Representation and Management of Data on the Web

59

ShortcutsShortcuts

• An automatic response is created by– sendError(int code, String message)

• Returns the status code with the message• Usually status code 404

(HTTPServletResponse.SC_NOT_FOUND)– sendRedirect(String url)

• Creates a response with status code 302 (HTTPServletResponse.SC_MOVED_TEMPORARILY) with a Location header that includes the given url

Page 60: Representation and Management of Data on the Web

60

Example of Using RedirectExample of Using Redirect

• Any ideas? (Remember ex2...)

Page 61: Representation and Management of Data on the Web

61

Setting Response HeadersSetting Response Headers• Headers can be defined

– using setHeader(String header, String value) of HTTPServletResponse

– using setIntHeader(String header, int value) – using setDateHeader(String header, long milliseconds) (translate to GMT)

• The headers must be defined before the first time the buffer content is sent

Page 62: Representation and Management of Data on the Web

62

More Headers MethodsMore Headers Methods

• containsHeader to check existence of an header in the response

• setContentType• setContentLength• addCookie