You are on page 1of 65

Servlets

Ni Dung
Gii Thiu Chng trnh servlet u tin X l cc yu cu request
Form data HTTP request headers

Pht sinh tr li - response


HTTP status codes HTTP response headers

X l cookies Session tracking

Gii thiu Servlet


c ni dung t client: data & header Tr li theo nh dng HTML Gi d liu n

u im
Hiu qu Tin li: nhiu cng c Mnh: sharing data, pooling, persistence Kh chuyn Bo mt R tin

Trang web ng
Ph thuc vo ngi s dng
Mua hng trn mng

Ni dung phi thay i lin tc


Bn tin, d bo thi tit

c ni dung t database hoc t web server khc


Bo gi hng ha

Mt s Servlet Server
Apache Tomcat
http://jakarta.apache.org/tomcat/

Allaire/Macromedia JRun
http://www.allaire.com/products/jrun/

New Atlanta ServletExec


http://www.servletexec.com/

Gefion Software LiteWebServer


http://www.gefionsoftware.com/LiteWebServer/

Caucho's Resin
http://www.caucho.com/

Servlet n gin
import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloWorld extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); out.println("Hello World"); } }

Bin dch v chy Servlets


t CLASSPATH
n file Servlet JAR (install_dir/lib/servlet.jar).

Bin dch v t file dch .class ng v tr


tomcat_install_dir/webapps/ROOT/WEB-INF/classes jrun_install_dir/servers/default/default-app/ WEB-INF/classes

Bt tag <servlet> trong file web.xml Gi chng trnh servlets


http://host/servlet/ServletName

Servlet Hello theo nh dng HTML


public class HelloWWW extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); String docType = "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 " + "Transitional//EN\">\n"; out.println(docType + "<HTML>\n" + "<HEAD><TITLE>Hello WWW</TITLE></HEAD>\n"+ "<BODY>\n" + "<H1>Hello WWW</H1>\n" + "</BODY></HTML>"); } }

Hosting ln Servlet server


http://s43.eatj.com/ free trial

Upload chng trnh .war

http://vtvan.s43.eatj.com/hello/hello.jsp

The Servlet Life Cycle


init : thc hin 1 ln duy nht service : to thread cho mi client doGet, doPost, doXxx destroy : thc hin khi shutdown servlet

Khi ng - init
Dng ServletConfig.getInitParameter
ServletConfig config = getServletConfig(); message = config.getInitParameter("message");

t tham s trong web.xml


/WEB-INF/web.xml

Thng c dng khi mun c d liu ti thi im init t a

To tham s Init
/WEB-INF/web.xml
<web-app> <servlet> <servlet-name>ShowMsg</servlet-name> <servlet-class>cwp.ShowMessage</servlet-class> <init-param><param-name>message</param-name> <param-value>Shibboleth</param-value> </init-param> <init-param><param-name>repeats</param-name> <param-value>5</param-value> </init-param> </servlet> </web-app>

c tham s init
public class ShowMessage extends HttpServlet { private String message; private String defaultMessage = "No message."; private int repeats = 1; public void init() throws ServletException { ServletConfig config = getServletConfig(); message = config.getInitParameter("message"); if (message == null) { message = defaultMessage; } try { String repeatString = config.getInitParameter("repeats"); repeats = Integer.parseInt(repeatString); } catch(NumberFormatException nfe) {} }

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); String title = "The ShowMessage Servlet"; out.println(ServletUtilities.headWithTitle(title)+ "<BODY BGCOLOR=\"#FDF5E6\">\n" + "<H1 ALIGN=CENTER>" + title + "</H1>"); for(int i=0; i<repeats; i++) { out.println(message + "<BR>"); } out.println("</BODY></HTML>"); } }

Chy chng trnh

Chng trnh Counter


m s ln truy cp ca ngi s dng

X l d liu ca Form

Form Data
<FORM ACTION=http://host/servlet/Test> <INPUT TYPE=TEXT NAME=username> <INPUT TYPE=TEXT NAME=passwd> <INPUT TYPE=SUBMIT VALUE=Login> </FORM>

http://host/path?username=abc&passwd=ia

c tham s
getParameter("name")
String tmp = request.getParameter(username");

getParameterValues("name")
String[] tmp = request.getParameterValues(username);

getParameterNames()
Enumeration tmp=request.getParameterNames(); while(tmp.hasMoreElements()) { String paraName = tmp.nextElement(); out.println(paraName); }

public class ReadParam extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); String title = "Reading Request Parameters"; out.println(<HTML> + "<BODY BGCOLOR=\"#FDF5E6\">\n" + "<H1 ALIGN=CENTER>" + title + "</H1>\n" + "<UL>\n" + " <LI><B>username</B>: " + request.getParameter(username") + "\n" + " <LI><B>param2</B>: " + request.getParameter("passwd") + "\n" + " <LI></UL>\n" + "</BODY></HTML>"); } }

Chng trnh Login c verify

Upload file - MIME


<FORM ACTION="/UploadTest METHOD=POST ENCTYPE="multipart/form-data"> Name? <INPUT TYPE=TEXT NAME=submitter> Which file upload? <INPUT TYPE=FILE NAME=file> <INPUT TYPE=SUBMIT> </FORM>

import com.oreilly.servlet.MultipartRequest; ...... try { MultipartRequest multi=new MultipartRequest (req, ".", 5 * 1024 * 1024); out.println("<H3>Params:</H3>"); Enumeration params = multi.getParameterNames(); while (params.hasMoreElements()) { String name = (String)params.nextElement(); String value = multi.getParameter(name); out.println(name + " = " + value); }

Enumeration files = multi.getFileNames(); while (files.hasMoreElements()) { String name = (String)files.nextElement(); String filename = multi.getFilesystemName(name); String type = multi.getContentType(name); File f = multi.getFile(name); out.println("name: " + name); out.println("filename: " + filename); out.println("type: " + type); if (f != null) { out.println("length: " + f.length()); } out.println(); }

X l client Header

Example HTTP 1.1 Request


GET /search?keywords=servlets+jsp HTTP/1.1 Accept: image/gif, image/jpg, */* Accept-Encoding: gzip Connection: Keep-Alive Cookie: userID=id456578 Host: www.somebookstore.com Referer: http://www.somebookstore.com/findbooks.html User-Agent: Mozilla/4.7 [en] (Win98; U)

c Header
Dng hm
getHeader getHeaders getHeaderNames getCookies getAuthType and getRemoteUser getContentLength getContentType getDateHeader getIntHeader getMethod, getRequestURI, getProtocol

Header c bit

Thng tin khc

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> + "<BODY BGCOLOR=\"#FDF5E6\">\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=\"#FFAD00\">\n" + "<TH>Header Name<TH>Header Value"); 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); } }

Gi d liu nn
String encodings = request.getHeader("Accept-Encoding"); String encodeFlag = request.getParameter("encoding"); PrintWriter out; String title; if ((encodings != null) && (encodings.indexOf("gzip") != -1) && !"none".equals(encodeFlag)) { title = "Page Encoded with GZip"; OutputStream out1 = response.getOutputStream(); out=new PrintWriter(new GZIPOutputStream(out1), false); response.setHeader("Content-Encoding", "gzip"); }else{ title = "Unencoded Page"; out = response.getWriter(); }

out.println(<HTML> + "<BODY BGCOLOR=\"#FDF5E6\">\n" + "<H1 ALIGN=CENTER>" + title + "</H1>\n"); String line = "Blah, blah, blah, blah, blah. " + "Yadda, yadda, yadda, yadda."; for(int i=0; i<10000; i++) { out.println(line); } out.println("</BODY></HTML>"); out.close(); }

Kt qu
Khng nn (28.8K modem): > 50 seconds Nn (28.8K modem): < 5 seconds

HTTP Response

HTTP Status Codes


V d
HTTP/1.1 200 OK Content-Type: text/html <!DOCTYPE ...> <HTML> ... </HTML>

Forward client sang trang khc

Search Engine
... searchString = request.getParameter("searchString"); if ((searchString == null) || (searchString.length() == 0)) { reportProblem(response, "Missing search); return; } searchString = URLEncoder.encode(searchString); String numResults = request.getParameter("numResults"); ... String searchEngine = request.getParameter("searchEngine");

SearchSpec[] commonSpecs = SearchSpec.getCommonSpecs(); for(int i=0; i<commonSpecs.length; i++) { SearchSpec searchSpec = commonSpecs[i]; if(searchSpec.getName().equals(searchEngine)){ String url = searchSpec.makeURL(searchString,numResults); response.sendRedirect(url); return; } } reportProblem(response,Error search engine.");

Mt s hm truy xut header


public void setHeader(String Name, String Value) public void setDateHeader(String name, long mili) public void setIntHeader(String name, int Value) addHeader, addDateHeader, addIntHeader setContentType setContentLength addCookie sendRedirect

Prime Numbers: Source Code


int numPrimes = ServletUtilities.getIntParameter(request, "numPrimes", 50); int numDigits = ServletUtilities.getIntParameter(request, "numDigits", 120); // findPrimeList is synchronized PrimeList primeList = findPrimeList(primeListVector, numPrimes, numDigits); if (primeList == null) { primeList = new PrimeList(numPrimes, numDigits, true);

synchronized(primeListVector) { if (primeListVector.size() >= maxPrimeLists) primeListVector.removeElementAt(0); primeListVector.addElement(primeList); } } Vector currentPrimes = primeList.getPrimes(); int numCurrentPrimes = currentPrimes.size(); int numPrimesRemaining = (numPrimes numCurrentPrimes); boolean isLastResult = (numPrimesRemaining == 0); if (!isLastResult) { response.setHeader("Refresh", "5"); } response.setContentType("text/html"); PrintWriter out = response.getWriter(); // Show List of Primes found ...

Prime Number

X l Cookies

Cookies v Advertising

Cookies v Customize

Gi Cookies v client
Cch 1:
Cookie c = new Cookie("name", "value"); c.setMaxAge(...); // Means cookie persists on disk response.addCookie(c);

Cch 2:
public class LongLivedCookie extends Cookie { public static final int SECONDS_PER_YEAR = 60*60*24*365; public LongLivedCookie(String name, String value) { super(name, value); setMaxAge(SECONDS_PER_YEAR); } }

c Cookies
Cookie[] cookies = request.getCookies(); if (cookies != null) { for(int i=0; i<cookies.length; i++){ Cookie c = cookies[i]; if(c.getName().equals("someName")){ doSomethingWith(c); break; } } }// end if

public class SetCookies extends HttpServlet { for(int i=0; i<3; i++) { Cookie cookie = new Cookie("Session-Cookie-" + i, "Cookie-Value-S" + i); response.addCookie(cookie); cookie = new Cookie("Persistent-Cookie-" + i, "Cookie-Value-P" + i); cookie.setMaxAge(3600); response.addCookie(cookie); } response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println(...);

Chng trnh xem Cookie


public class ShowCookies extends HttpServlet { public void doGet(request, response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); String title = "Active Cookies"; out.println(<HTML><BODY BGCOLOR=\"#FDF5E6\">\n" + "<H1 ALIGN=\"CENTER\">" + title + "</H1>\n" + "<TABLE BORDER=1 ALIGN=\"CENTER\">\n" + "<TR BGCOLOR=\"#FFAD00\">\n" + " <TH>Cookie Name\n" + " <TH>Cookie Value");

Cookie[] cookies = request.getCookies(); if (cookies != null) { Cookie cookie; for(int i=0; i<cookies.length; i++) { cookie = cookies[i]; out.println("<TR>\n" + "<TD>" + cookie.getName() + "\n" + "<TD>" + cookie.getValue()); } } out.println("</TABLE></BODY></HTML>"); } }

Mt s hm Cookie khc
getDomain/setDomain getMaxAge/setMaxAge getName/setName getPath/setPath getSecure/setSecure getValue/setValue

Session Tracking

Session Tracking & E-Commerce

Session Tracking
t vn
Qun l shopping cart Lu li trng thi client

Phng php
Cookies URL-rewriting Hidden form fields

Higher-level API needed

Session Tracking API


Session lu trn server Pha client c lu t ng thng qua cookies hoc URL-rewriting
request.getSession HttpSession session = request.getSession(true); session.setAttribute lu gi tr Integer accessCount = (Integer) session.getAttribute("accessCount"); session.getAttribute c gi tr session.setAttribute("accessCount", accessCount);

Mt s hm thng dng
getAttribute, getValue setAttribute, putValue removeAttribute, removeValue getAttributeNames, getValueNames getId isNew getCreationTime, getLastAccessedTime get[set] MaxInactiveInterval, invalidate

Counter trn tng Client


PrintWriter out = response.getWriter(); String title = "Session Tracking Example"; HttpSession session = request.getSession(true); String heading; Integer accessCount = (Integer)session.getAttribute("accessCount"); if (accessCount == null) { accessCount = new Integer(0); heading = "Welcome, Newcomer"; } else { heading = "Welcome Back"; accessCount=new Integer(accessCount.intValue()+1); } session.setAttribute("accessCount", accessCount);

n li
Bin dch & chy servlet init Form HTTP header Cookies Session tracking

Xem thm
Core Servlets and JavaServer Pages
http://www.coreservlets.com

More Servlets and JavaServer Pages


http://www.moreservlets.com http://www.javavietnam.org

Din n JavaVitnam

Hi p ?

You might also like