64
1 Servlets Servlets Sun tutorial to servlets

1 Servlets Sun tutorial to servletstutorial to servlets

Embed Size (px)

DESCRIPTION

3 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

Citation preview

Page 1: 1 Servlets Sun tutorial to servletstutorial to servlets

1

ServletsServlets

Sun tutorial to servlets

Page 2: 1 Servlets Sun tutorial to servletstutorial to servlets

2

IntroductionIntroduction

Page 3: 1 Servlets Sun tutorial to servletstutorial to servlets

3

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 4: 1 Servlets Sun tutorial to servletstutorial to servlets

4

A Java ServletA Java Servlet

Web browser

Web server

request request

responseresponseServlet

Page 5: 1 Servlets Sun tutorial to servletstutorial to servlets

5

An ExampleAn Example

• In the following example, the local server calls the Servlet TimeServlet with an argument supplied by the user

• This example, as well as all the examples in this lecture can be found at http://inferno:5000/(accessible only from CS!)

Page 6: 1 Servlets Sun tutorial to servletstutorial to servlets

6

Reload / Refresh Servlet ResultReload / Refresh Servlet Result• Trying to refresh the content created by a servlet will lead to

fetching a new content from the server• This is not the case with static resources• Response headers of a static (as opposed to a servlet generated)

resource contain- Etag, Last-Modified

• While trying to refresh a resource- Cache-Contol: max-age=0 is sent and that means the server/proxies will

try to revalidate the resource- Only in the static case the resource could be revalidated against some

values the client holds- So in the static case the client sends the Etag value attached to the

If-None-Match header, and the Last-Modified value is sent in If-Modified-Since Clear the cache, open and then reload /dbi/Time.html

Open and reload /dbi/initCompare the headers sent and received.

Page 7: 1 Servlets Sun tutorial to servletstutorial to servlets

7

What do Servlets do?What do Servlets do?

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

request (e.g. authentication data, cookies, etc.)• Generate the result (may do this by talking to a database,

file system, etc.)• Format the result 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 8: 1 Servlets Sun tutorial to servletstutorial to servlets

8

Supporting ServletsSupporting Servlets

• To run Servlets, the Web server must support them- Apache Tomcat

• Also functions as a module for other Apache servers

- Sun Java System Web Server and Java System Application Server

- IBM's WebSphere Application Server- BEA’s Weblogic Application Server- Macromedia’s Jrun – an engine that can be added to

Microsoft’s IIS, Apache’s Web servers and more...- Oracle Application Server- …

In your final project you will install this server to create a powerful website

Page 9: 1 Servlets Sun tutorial to servletstutorial to servlets

9

Creating a Simple ServletCreating a Simple Servlet

Read more about the Servlet Interface

Page 10: 1 Servlets Sun tutorial to servletstutorial to servlets

10

The The ServletServlet Interface Interface

• Java provides the interface Servlet • Specific Servlets implement this interface• Whenever the Web server is asked to invoke a specific

Servlet, it activates the method service() of an instance of this Servlet

service(request,response)

MyServlet

(HTTP)request

(HTTP)response

Page 11: 1 Servlets Sun tutorial to servletstutorial to servlets

11

HTTP Request MethodsHTTP Request Methods

• POST - application data sent in the request body• GET - application data sent in the URL• HEAD - client sees only header of response • PUT - place documents directly on server• DELETE - opposite of PUT• TRACE - debugging aid • OPTIONS - list communication options

Page 12: 1 Servlets Sun tutorial to servletstutorial to servlets

12

Servlet HierarchyServlet Hierarchy

YourOwnServlet

HttpServlet

Generic Servlet

Servlet service(ServletRequest, ServletResponse)

doGet(HttpServletRequest , HttpServletResponse)

doPost(HttpServletRequest HttpServletResponse)

doPutdoTrace

Called by the servlet container to allow the servlet to respond to

any request method

Called by the servlet container to allow the servlet to respond to

a specific request method

A generic, protocol-independent class, implementing Servlet

Page 13: 1 Servlets Sun tutorial to servletstutorial to servlets

13

Class Class HttpServletHttpServlet• Class HttpServlet handles requests and responses

of HTTP protocol• The service() method of HttpServlet checks the

request method and calls the appropriate HttpServlet method: doGet, doPost, doPut, doDelete, doTrace,

doOptions or doHead• This class is abstract

Read more about the HttpServlet Class

That is, a class that can be sub-classed but non instantiated. This class’ methods however

are not abstract…

Page 14: 1 Servlets Sun tutorial to servletstutorial to servlets

14

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

- HttpServletRequest: methods for getting form (query) data, HTTP request headers, etc.

- HttpServletResponse: methods for setting HTTP status codes, HTTP response headers, and get an output stream used for sending data to the client

• Many times, we implement doPost by calling doGet, or vice-versa

You could also run:CheckRequestServlet <host> /dbi/empty <port> <OTHER-METHODS>

Check the result of an empty implementationhttp://localhost/dbi/empty

Page 15: 1 Servlets Sun tutorial to servletstutorial to servlets

15

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"); } public void doPost(HttpServletRequest req, HttpServletResponse

res) throws ServletException, IOException { doGet(req, res); }}

HelloWorld.java

Page 16: 1 Servlets Sun tutorial to servletstutorial to servlets

16

Returning HTMLReturning HTML

• By default, no content type is given with a response

• In order to generate HTML- Tell the browser you are sending HTML, by setting the

Content-Type header (response.setContentType())- Modify the printed text to create a legal HTML page

• You should set all headers before writing the document content. Can you guess why?

Download LiveHttpHeaders Extension

As you can check using LiveHttpHeaders plug-in

Page 17: 1 Servlets Sun tutorial to servletstutorial to servlets

17

public class HelloWorld extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

PrintWriter out = response.getWriter(); out.println("<html><head><title>Hello World</title></head>\n"); out.println("<body>"); out.println("<h2>" + new java.util.Date() + "</h2>\n"); out.println("<h1>Hello World</h1>\n</body></html>"); } }

HelloWorld.java

Content type wasn’t set, but the browser will

understand…

Page 18: 1 Servlets Sun tutorial to servletstutorial to servlets

18

Configuring the ServerConfiguring the Server

<web-app> <servlet> <servlet-name>hello</servlet-name> <servlet-class>HelloWorld</servlet-class> </servlet> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping></web-app></web-app>

myApp/WEB-INF/web.xml

myApp/WEB-INF/classes/HelloWorld.classhttp://inferno:5000/dbi/hello

Page 19: 1 Servlets Sun tutorial to servletstutorial to servlets

19

Getting Information Getting Information From the RequestFrom the Request

Page 20: 1 Servlets Sun tutorial to servletstutorial to servlets

20

An HTTP Request ExampleAn HTTP Request Example

GET /default.asp HTTP/1.0 Accept: image/gif, image/x-xbitmap, image/jpeg, image/png, */*

Accept-Language: en

Connection: Keep-Alive

Host: magni.grainger.uiuc.edu

User-Agent: Mozilla/4.04 [en] (WinNT; I ;Nav)

Cookie:SITESERVER=ID=8dac8e0455f4890da220ada8b76f; ASPSESSIONIDGGQGGGAF=JLKHAEICGAHEPPMJKMLDEM

Accept-Charset: iso-8859-1,*,utf-8

Page 21: 1 Servlets Sun tutorial to servletstutorial to servlets

21

Getting HTTP DataGetting HTTP Data

• Values of the HTTP request can be accessed through the HttpServletRequest object

• Get the value of the header hdr using getHeader("hdr") of the request argument

• Get all header names: getHeaderNames()• Methods for specific request information:

getCookies, getContentLength, getContentType, getMethod, getProtocol, etc.

Read more about the HttpRequest Interface

Page 22: 1 Servlets Sun tutorial to servletstutorial to servlets

22

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"; out.println( "<html><head><title>" + title + "</title></head><body>\n" + "<h1>" + title+ "</h1>\n" + "<h2>Request Method: "+request.getMethod()+"</h2>" + "<h2>Request URI: "+request.getRequestURI()+"</h2>" + "<h2>ServletPath: "+request.getServletPath()+"</h2>" + "<h2>Request Protocol: "+request.getProtocol()+"</h2>" + "<table border=\"1\">\n" + "<tr><th>Header Name</th><th>Header Value</th></tr>");

Page 23: 1 Servlets Sun tutorial to servletstutorial to servlets

23

Enumeration headerNames = request.getHeaderNames(); while (headerNames.hasMoreElements()) { String headerName = (String) headerNames.nextElement(); out.println("<tr><td>" + headerName + "</td>" +"<td>"+request.getHeader(headerName)+"</td></tr>"); } out.println("</table>\n</body></html>");}

public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException { doGet(request, response); }}}

Compare the results of the different browsers

Page 24: 1 Servlets Sun tutorial to servletstutorial to servlets

24

User Input in HTMLUser Input in HTML

• Using HTML forms, we can pass parameters to Web applications

• <form action=… method=…> …</form> comprises a single form • action: the address of the application to which the

form data is sent• method: the HTTP method to use when passing

parameters to the application (e.g. get or post)

Page 25: 1 Servlets Sun tutorial to servletstutorial to servlets

25

The The <input><input> Tag Tag

• Inside a form, INPUT tags define fields for data entry• Standard input types include: buttons, checkboxes,

password fields, radio buttons, text fields, image-buttons, text areas, hidden fields, etc.

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

Page 26: 1 Servlets Sun tutorial to servletstutorial to servlets

26

GET ExampleGET Example<form method="get" action="http://www.google.com/search"> <p><input name="q" type="text" /> <input type="submit" /> <input type="reset" /> </p></form>

http://www.google.com/search?q=servlets

Page 27: 1 Servlets Sun tutorial to servletstutorial to servlets

27

<form method="post" action="http://www.google.com/search"> <p><input name="q" type="text" /> <input type="submit" /> <input type="reset" /> </p></form>

POST ExamplePOST Example

POST /search HTTP/1.1Host: www.google.com…Content-type: application/x-www-form-urlencodedContent-length: 10<empty-line>q=servlets

Google doesn’t support POST!

Page 28: 1 Servlets Sun tutorial to servletstutorial to servlets

28

Getting the Parameter ValuesGetting the Parameter Values

• To get the (first) value of a parameter named x:- req.getParameter("x") where req is the service request argument

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

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

Page 29: 1 Servlets Sun tutorial to servletstutorial to servlets

29

<html><head><title>Sending Parameters</title> <style type="text/css"> p{display:table-row} span{display:table-cell; padding:0.2em} </style></head><body>

<h1>Please enter the parameters</h1> <form action=“setcolors" method="get"> <p>Background color: <span><input type="text" name="bgcolor"/></span></p> <p>Font color: <span><input type="text" name="fgcolor"/> </span> </p> <p>Font size: <span><input type="text" name="size"/></span></p> <h2> <input type="submit" value="Submit Parameters"/></h2> </form>

</body></html>parameters.html

Page 30: 1 Servlets Sun tutorial to servletstutorial to servlets

30

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

An Example (cont)An Example (cont)

SetColors.java

Page 31: 1 Servlets Sun tutorial to servletstutorial to servlets

31

out.println("<html><head><title>Set Colors Example" +"</title></head>");

out.println("<body style=\"color:" + fg + ";background-color:" + bg + ";font-size:"+ size + "px\">"); out.println("<h1>Set Colors Example</h1>"); out.println("<p>You requested a background color " + bg + "</p>"); out.println("<p>You requested a font color " + fg + "</p>"); out.println("<p>You requested a font size " + size + "</p>");

out.println("</body></html>");}

An Example (cont)An Example (cont)

SetColors.java

Page 32: 1 Servlets Sun tutorial to servletstutorial to servlets

32

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="localhost/dbi/SetColors" method="post"> …

Handling PostHandling Post

Page 33: 1 Servlets Sun tutorial to servletstutorial to servlets

33

Creating the Creating the Response of the ServletResponse of the Servlet

Page 34: 1 Servlets Sun tutorial to servletstutorial to servlets

34

HTTP ResponseHTTP Response

• The response includes:Status line: version, status code, status messageResponse headersEmpty lineContent

HTTP/1.1 200 OKContent-Type: text/htmlContent-Length: 89Server: Apache-Coyote/1.1

>HTML><HEAD><TITLE>HELLO WORLD</TITLE></HEAD<

>BODY><H1>Hello World </H1></BODY></HTML<

Read more about the HttpResponse Interface

Page 35: 1 Servlets Sun tutorial to servletstutorial to servlets

35

Setting the Response StatusSetting the Response Status• Use the following HttpServletResponse methods to set

the response status:- setStatus(int sc)

• Use when there is no error, like 201 (created) • No need to send 200 OK explicitly…

- sendError(sc), sendError(sc, message) • Use in erroneous situations, like 400 (bad request)• The server may return a formatted message

- sendRedirect(String location)• As opposed to forwarding which is done within the server side

completely, on redirect the client gets the “Location” header and a special code (302) and sends another request to the new location

http://localhost/dbi/redirect

Page 36: 1 Servlets Sun tutorial to servletstutorial to servlets

36

Setting the Response StatusSetting the Response Status

• Class HTTPServletResponse has static integer variables for popular status codes- for example:

SC_OK(200), SC_NOT_MODIFIED(304), SC_UNAUTHORIZED(401), SC_BAD_REQUEST(400)

• Status code 200 (OK) is the default

Page 37: 1 Servlets Sun tutorial to servletstutorial to servlets

37

Setting Response HeadersSetting Response Headers

• Use the following HTTPServletResponse methods to set the response headers:- setHeader(String hdr, String value),

setIntHeader(String hdr, int value)• Override existing header value

- addHeader(String hdr, String value), addIntHeader(String hdr, int value)

• The header is added even if another header with the same name exists

Page 38: 1 Servlets Sun tutorial to servletstutorial to servlets

38

Specific Response HeadersSpecific Response Headers

• Class HTTPServletResponse provides setters for some specific headers:- setContentType- setContentLength

• automatically set if the entire response fits inside the response buffer

- setDateHeader- setCharacterEncoding

Page 39: 1 Servlets Sun tutorial to servletstutorial to servlets

39

More Header MethodsMore Header Methods

• containsHeader(String header)- Check existence of a header in the response

• addCookie(Cookie)• sendRedirect(String url)

- automatically sets the Location header

• Do not write into the response after sendError or sendRedirect

Check the result of writing a response after sendError/sendRedirect http://localhost/dbi/bad.html

Page 40: 1 Servlets Sun tutorial to servletstutorial to servlets

40

The Response Content BufferThe Response Content Buffer

• The response body is buffered • Data is sent to the client when the buffer is full

or the buffer is explicitly flushed• Once the first data chunk is sent to the client,

the response is committed- You cannot set the response line nor change the

headers. Such operations are either ignored or cause an exception to be thrown

Check the result of sendError/setContentType getting “commited” http://localhost/dbi/bad.html

Page 41: 1 Servlets Sun tutorial to servletstutorial to servlets

41

Buffer Related MethodsBuffer Related Methods

• setBufferSize, getBufferSize- What are the advantages of using big buffers? what are

the disadvantages?

• flushBuffer• resetBuffer

- Clears the body content

• reset- Clears any data that exists in the buffer as well as the

status code and headers

• isCommitted

Page 42: 1 Servlets Sun tutorial to servletstutorial to servlets

42

Supporting HTTP MethodsSupporting HTTP Methods

Page 43: 1 Servlets Sun tutorial to servletstutorial to servlets

43

The HEAD MethodThe HEAD Method• The simple implementation of doHead is executing

doGet and excluding the response body • In addition, the size of the body is calculated and added

to the headers• You do not have to override this method• Why would one want to override this method?

- The content size is not calculated in servlets as opposed to static html resources…

Check the default implementation of doHead:Run CheckRequestServlet <HOST> /dbi/init <PORT> GET Run CheckRequestServlet <HOST> /dbi/init <PORT> HEADRun CheckRequestServlet <HOST> /dbi/Time.html <PORT> HEAD

(shorter output yet its length is calculated…)In class HOST=localhost, PORT=80

Page 44: 1 Servlets Sun tutorial to servletstutorial to servlets

44

The HEAD Method The HEAD Method (cont)(cont)

• The right way to implement doHead is :- Don’t implement doHead explicitly- Instead, check within the doGet call, what is the

requested method (httpServletRequest.getMethod()) - If it’s HEAD do the same without returning the

content- This way the results of HEAD / GET requests are

similar as they should be

Page 45: 1 Servlets Sun tutorial to servletstutorial to servlets

45

OPTIONS and TRACEOPTIONS and TRACE

• doOptions returns the supported methods:- For example, if you override doGet then the following

header will be returned:Allow: GET, HEAD, TRACE, OPTIONS

• doTrace returns the request itself in the body of the message, for debugging purposes

• You usually do not override these methods- Override doOptions if you offer some new methods…

Page 46: 1 Servlets Sun tutorial to servletstutorial to servlets

46

Unsupported MethodsUnsupported Methods

• By default, the methods doPost, doGet, doPut and doDelete return an error status code 405 with the message:HTTP method XXX is not supported by this URL

• doHead calls doGet and therefore leads to the same result but with unsupported method GET

• In particular, you have to override doGet and doPost if you want to return an appropriate response for these methods- Many applications support only one of GET/POST

Page 47: 1 Servlets Sun tutorial to servletstutorial to servlets

47

Servlet Life CycleServlet Life Cycle

Page 48: 1 Servlets Sun tutorial to servletstutorial to servlets

48

Servlet Life CycleServlet Life Cycle

• When the servlet mapped URL is requested, the server loads the Servlet class and initializes one instance of it

• Each client request is handled by the Serlvet instance in a separate thread

• The server can remove the Servlet • The Servlet can remain loaded to handle additional

requests

Browser

Browser

Browser

Server ServletInstance

Page 49: 1 Servlets Sun tutorial to servletstutorial to servlets

49

Servlet Life CycleServlet Life Cycle

• When the Servlet in instantiated, its method init() is begin invoked- External parameters are supplied

• Upon a request, its method service() is being invoked

• Before the Servlet removal, its method destroy() is being invoked

Page 50: 1 Servlets Sun tutorial to servletstutorial to servlets

50

Servlet Life CycleServlet Life Cycle

Servlet Class

Calling the init method

Servlet Instance

Deal with requests:call the

service method

Destroy the Servlet: call the

destroy method

Garbage Collection

ServletConfigIn our case by servlet we

refer to any class extending HttpServlet

Page 51: 1 Servlets Sun tutorial to servletstutorial to servlets

51

Initializing ServletsInitializing Servlets• The method init has a parameter of type

ServletConfig• ServletConfig has methods to get external

initialization parameters (getInitParameter())- In Tomcat, these parameters are set in web.xml

• To make initializations, override init() and not init(ServletConfig) - init() is automatically called by

after performing default initializations

Read more about the ServletConfig Interface

If we use init() and not init(ServletConfig) how could we obtain

a reference to the ServletConfig ?

Page 52: 1 Servlets Sun tutorial to servletstutorial to servlets

52

<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 web.xml ExampleA web.xml Example

Page 53: 1 Servlets Sun tutorial to servletstutorial to servlets

53

public class ServletInit extends HttpServlet { String _login = null; Calendar _initTime = null; public void init() throws ServletException { _login = getInitParameter("login"); _initTime = new GregorianCalendar(); } public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

res.setContentType("text/html"); PrintWriter out = res.getWriter();

out.println("<html><head><title>Initialization</title><body><h2>" + "I am the Servlet of <i>" + _login+ "</i><br/>" + "I was initialized at " + _initTime.get(Calendar.HOUR_OF_DAY) + ":"+ _initTime.get(Calendar.MINUTE) + ":"+ _initTime.get(Calendar.SECOND) + "</h2></body></html>"); }} ServletInit.java

Calls the method getInitParameter defined within the

ServletConfig interface implemented by HttpServlet class

Page 54: 1 Servlets Sun tutorial to servletstutorial to servlets

54

Loading a Servlet on StartupLoading a Servlet on Startup

• A Servlet is usually loaded when it is first being called

• You can set Tomcat to load a specific Servlet on startup in the Servlet declaration inside web.xml

<servlet> <servlet-name>InitExample</servlet-name> <servlet-class>ServletInit</servlet-class> <load-on-startup/></servlet>

You can use this element to set the loading order of those servlets which

are loaded on start

Page 55: 1 Servlets Sun tutorial to servletstutorial to servlets

55

Destroying ServletsDestroying Servlets

• The server may remove a loaded Servlet, Why?:- asked to do so by administrator(e.g. Server shutdown)- Servlet was idle a long time- server needs to free resources

• The server removes a Servlet only if all threads have finished or a grace period has passed

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

• Is it possible for the Servlet to end without its destroy being called?- You can do it if you kill the process explicitly

Page 56: 1 Servlets Sun tutorial to servletstutorial to servlets

56

Thread SynchronizationThread Synchronization

• Multiple threads are accessing the same Servlet object at the same time

• Therefore, you have to deal with concurrency • init() and destroy() are guaranteed to be

executed only once (before/after all service executions)

Page 57: 1 Servlets Sun tutorial to servletstutorial to servlets

57

The Servlet ContextThe Servlet Context

Page 58: 1 Servlets Sun tutorial to servletstutorial to servlets

58

The Servlet Context ObjectThe Servlet Context Object

• A Servlet context represents the Web application that Servlets live in

• There is one Servlet context per application• You can get the Servlet context within doXXX

using the method getServletContext()• The Servlet context has many methods• For example, you can store in it objects that are

kept throughout the application's lifeRead more about the ServletContext Interface

Page 59: 1 Servlets Sun tutorial to servletstutorial to servlets

59

An Example: Service CountAn Example: Service Count

public class CounterServlet extends HttpServlet { public void init() throws ServletException { Integer counter = (Integer)getServletContext().getAttribute("counter"); if(counter == null) { getServletContext().setAttribute("counter",new Integer(0)); }}

We cannot use int since attribute

must be an object and not primitive

The counter might be already initialized, if the server is running but the instance of CounterServlet was removed from the

memory.In this case we wouldn’t like to reinitialize the counter with 0.

Page 60: 1 Servlets Sun tutorial to servletstutorial to servlets

60

public void doGet(HttpServletRequest req,HttpServletResponse res) throws ServletException, IOException {

PrintWriter out = res.getWriter(); res.setContentType("text/html"); int counter = 0; synchronized(this) { counter = ((Integer)getServletContext(). getAttribute("counter")).intValue(); getServletContext(). setAttribute("counter",new Integer(++counter)); } out.println("<html><head><title>Counter</title><body><h1>" + "[" + counter + "]</h1></body></html>");}}

The response’s character encoding cannot be set using this

ordering, since writer was already created

A new Integer must be created since

an Integer’s value cannot be

modified

Page 61: 1 Servlets Sun tutorial to servletstutorial to servlets

61

Context ListenersContext Listeners

• A context listener is an object that reacts to the following events:- Context initialization- Context destruction

• We can use a context listener to perform application initialization or termination tasks

• To implement such a listener,- Implement the interface ServletContextListener- Put the class file in myApp/WEB-INF/classes like all the other

classes- Register the listener with the server

Read more about the ServletContextListener Interface

Page 62: 1 Servlets Sun tutorial to servletstutorial to servlets

62

Cheating with Service CountCheating with Service Countpublic class CounterInitializer implements ServletContextListener { public void contextInitialized(ServletContextEvent sce) { sce.getServletContext(). setAttribute("counter",new Integer(1000)); }

public void contextDestroyed(ServletContextEvent sce) {}} <web-app>

<listener> <listener-class>CounterInitializer</listener-class> </listener></web-app>

Uncomment the listener lines in web.xml or use web2.xml

Page 63: 1 Servlets Sun tutorial to servletstutorial to servlets

63

ExceptionsExceptions

• Exceptions are caught by the server• You can find them in the log file under

$CATALINA_BASE/logs/• The result shown in the browser depends on the

buffer state• Check the example on the next slide…• Find the exceptions in the log

Page 64: 1 Servlets Sun tutorial to servletstutorial to servlets

64

Run :http://localhost/dbi/exception?nlines=10http://localhost/dbi/exception?nlines=1000

public class ExceptionServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

response.setContentType("text/html");PrintWriter out = response.getWriter();int nLines = Integer.parseInt(request.getParameter("nlines"));

out.println("<html><head></head><body>");

for (int i = 0; i < nLines; ++i) {out.println("<p> bla bla bla " + i + "</p>"); }

out.println("</body></html>");out.println(" " + 1/0 + " "); }}

This line causes exception