Download presentation
Presentation is loading. Please wait.
Published byLorena Terry Modified over 9 years ago
1
1 Servlets Sun tutorial to servletstutorial to servlets
2
2 Introduction
3
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
4
4 A Java Servlet Web browser Web server request response Servlet
5
5 An 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!) http://inferno:5000/
6
6 Reload / 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/init Compare the headers sent and received./dbi/Time.htmldbi/init
7
7 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
8
8 Supporting 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
9
9 Creating a Simple Servlet Read more about the Servlet InterfaceServlet Interface
10
10 The Servlet 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
11
11 HTTP 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
12
12 Servlet Hierarchy YourOwnServlet HttpServlet Generic Servlet Servlet service(ServletRequest, ServletResponse) doGet(HttpServletRequest, HttpServletResponse) doPost(HttpServletRequest HttpServletResponse) doPut doTrace … 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
13
13 Class HttpServlet 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 ClassHttpServlet Class That is, a class that can be sub- classed but non instantiated. This class’ methods however are not abstract…
14
14 Creating 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: CheckRequestServletCheckRequestServlet /dbi/empty Check the result of an empty implementation http://localhost/dbi/empty http://localhost/dbi/empty
15
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
16
16 Returning 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 ExtensionLiveHttpHeaders Extension As you can check using LiveHttpHeaders plug-in
17
17 public class HelloWorld extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); out.println(" Hello World \n"); out.println(" "); out.println(" " + new java.util.Date() + " \n"); out.println(" Hello World \n "); } } HelloWorld.java Content type wasn’t set, but the browser will understand…
18
18 Configuring the Server hello HelloWorld hello /hello myApp/WEB- INF/web.xml myApp/WEB-INF/classes/HelloWorld.class http://inferno:5000/dbi/hello
19
19 Getting Information From the Request
20
20 An 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
21
21 Getting 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 InterfaceHttpRequest Interface
22
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( " " + title + " \n" + " " + title+ " \n" + " Request Method: "+request.getMethod()+" " + " Request URI: "+request.getRequestURI()+" " + " ServletPath: "+request.getServletPath()+" " + " Request Protocol: "+request.getProtocol()+" " + " \n" + " Header Name Header Value ");
23
23 Enumeration headerNames = request.getHeaderNames(); while (headerNames.hasMoreElements()) { String headerName = (String) headerNames.nextElement(); out.println(" " + headerName + " " +" "+request.getHeader(headerName)+" "); } out.println(" \n "); } public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } Compare the results of the different browsers
24
24 User Input in HTML Using HTML forms, we can pass parameters to Web applications … 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 )
25
25 The 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
26
26 GET Example <form method="get" action="http://www.google.com/search"> http://www.google.com/search?q=servlets
27
27 <form method="post" action="http://www.google.com/search"> POST Example POST /search HTTP/1.1 Host: www.google.com … Content-type: application/x-www-form-urlencoded Content-length: 10 q=servlets Google doesn’t support POST!
28
28 Getting 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()
29
29 Sending Parameters p{display:table-row} span{display:table-cell; padding:0.2em} Please enter the parameters Background color: Font color: Font size: parameters.html
30
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) SetColors.java
31
31 out.println(" Set Colors Example" +" "); out.println("<body style=\"color:" + fg + ";background-color:" + bg + ";font-size:"+ size + "px\">"); out.println(" Set Colors Example "); out.println(" You requested a background color " + bg + " "); out.println(" You requested a font color " + fg + " "); out.println(" You requested a font size " + size + " "); out.println(" "); } An Example (cont) SetColors.java
32
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 Post
33
33 Creating the Response of the Servlet
34
34 HTTP Response The response includes: Status line: version, status code, status message Response headers Empty line Content HTTP/1.1 200 OK Content-Type: text/html Content-Length: 89 Server: Apache-Coyote/1.1 HELLO WORLD Hello World Read more about the HttpResponse InterfaceHttpResponse Interface
35
35 Setting 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
36
36 Setting 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
37
37 Setting 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
38
38 Specific 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
39
39 More 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 http://localhost/dbi/bad.html
40
40 The 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 http://localhost/dbi/bad.html
41
41 Buffer 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
42
42 Supporting HTTP Methods
43
43 The 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 /dbi/init GET Run CheckRequestServlet /dbi/init HEAD Run CheckRequestServlet /dbi/Time.html HEAD (shorter output yet its length is calculated…) In class HOST=localhost, PORT=80CheckRequestServlet
44
44 The HEAD Method (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
45
45 OPTIONS 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…
46
46 Unsupported 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
47
47 Servlet Life Cycle
48
48 Servlet 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
49
49 Servlet 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
50
50 Servlet 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 ServletConfig In our case by servlet we refer to any class extending HttpServlet
51
51 Initializing 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 InterfaceServletConfig Interface If we use init() and not init(ServletConfig) how could we obtain a reference to the ServletConfig ?
52
52 … InitExample ServletInit login snoopy … A web.xml Example
53
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(" Initialization " + "I am the Servlet of " + _login+ " " + "I was initialized at " + _initTime.get(Calendar.HOUR_OF_DAY) + ":"+ _initTime.get(Calendar.MINUTE) + ":"+ _initTime.get(Calendar.SECOND) + " "); }} ServletInit.java Calls the method getInitParameter defined within the ServletConfig interface implemented by HttpServlet class
54
54 Loading 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 InitExample ServletInit You can use this element to set the loading order of those servlets which are loaded on start
55
55 Destroying 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
56
56 Thread 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)
57
57 The Servlet Context
58
58 The 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 life Read more about the ServletContext InterfaceServletContext Interface
59
59 An 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.
60
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(" Counter " + "[" + counter + "] "); }} 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
61
61 Context 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 InterfaceServletContextListener Interface
62
62 Cheating with Service Count public class CounterInitializer implements ServletContextListener { public void contextInitialized(ServletContextEvent sce) { sce.getServletContext(). setAttribute("counter",new Integer(1000)); } public void contextDestroyed(ServletContextEvent sce) {} } CounterInitializer Uncomment the listener lines in web.xml or use web2.xml
63
63 Exceptions 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
64
64 Run : http://localhost/dbi/exception?nlines=10 http://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(" "); for (int i = 0; i bla bla bla " + i + " "); } out.println(" "); out.println(" " + 1/0 + " "); }} This line causes exception
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.