Professional Documents
Culture Documents
Servlet l k thut lp trnh pha my ch web ca java, n c s dng kh ph bin, do c cc u im vt tri, chng ny s gip bn hiu c cc khi nim c bn v lp trnh web, s dng java vit cc ng dng web cho pha my ch.
I. Gii thiu
Internet pht trin, bnh trng nhanh chng, c bit l web, cc web server cn phi c thit k c th p ng c nhiu kiu yu cu hn, web server phi c kh nng tng tc vi trnh khch, x l d liu do trnh khch gi n, tr kt qu ng tu theo d liu ca trnh khch gi n, Cc trang web vi ni dung tnh gi y khng cn p ng c na, nhu cu phi a cc ng dng vo chy trong mi trng web a ra v cho n gi c rt nhiu cng ngh cho php ta a ng dng vo chy trong mi trng web nh: CGI, ASP, ISAPI, JSP, Servlet trong s c JSP/Servlet l cng ngh ca Java.
vo b nh khi ln u tin web server triu gi ng dng. Do khng phi np nhiu ln nn vn tc ca CGI c gii quyt trit . Hn na ISAPI phc v web server hiu qu v tn t ti nguyn hn cc trnh CGI. Tuy ISAPI khc phc c nhc im ca CGI tuy nhin c th vit cc trnh ISAPI yu cu ngi lp trnh phi c kin thc tng i tt v lp trnh, khin ngi ta cn a ra cc gii php khc, Microsoft a ra cng ngh mi l ASP, vi cng ngh mi ny ngi lp trnh c th to ra ng dng web nhanh chng m khng cn i hi ngi lp trnh c trnh cao siu v chuyn mn, Sun System cng khng ng ngoi cuc ASP pht trin nhanh chng, Sun a ra cng ngh SJP, cng ngh ny tng t nh ASP, tuy nhin cc cng ngh nh SJP, ASP li khng phi l lp trnh hng i tng, do vy nhng ngi lp trnh hng i tng x cm thy khng ph hp, java cn c mt cng ngh khc l Servlet, cng ngh ny tng t nh ISAPI, tuy nhin n c vit bng m java. JSP/servlets l cng ngh ca Java c to ra nhm mc ch gii quyt nhiu vn trong CGI v nhng trnh ch server API khc.
2. Servlet l g
Quay v nhng nm 90 ban u, khi m web ch mi bt u chim lnh. Common Gateway Interface (CGI) nh ngha cho php cc Web server x l nhng g m ngi dng nhp vo v lm vic vi ni dung ng. Cc chng trnh CGI c th c pht trin trn bt k mt ngn ng lp trnh hay ngn ng script no, tuy nhin Perl l ngn ng c s dng ph bin nht. Tht s tt c cc Web server u h tr CGI v nhiu module Perl c sn nh nhng phn mm min ph hay phn mm chia s x l hu ht nhng nhim v. Tuy nhin CGI khng phi khng c tr ngi. Vic thc thi v tnh hiu qu l nhng vn ln khi mt x l mi c to ra cho
mi yu cu, lm cho ti nguyn server nhanh chng b bn. Vic chia s ti nguyn cng nh cc kt ni d liu gia cc script hay vic gi cng mt script nhiu ln, dn n lp li nhiu ln nhng cng vic thc thi. Bo mt l s lo lng ln vi CGI. Hu ht cc script Perl dng shell thc thi cc lnh h iu hnh vi d liu cung cp bi ngi dng, nhng thc th gi mail, tm kim mt file, hay ch l nhng lnh h iu hnh tng qut. Vic s dng shell theo cch ny s m ra nhiu c hi cho mt hacker sa li mt script nhm xa i tt c cc file trn mt server, gi file mt khu ca server n mt account b mt hoc lm nhng hnh ng khng c php khc m mt my ch khng mong i. Nhng nh cung cp Web server nh ngha nhng API gii quyt mt vi vn ny, c th l ISAPI ca Microsoft v NSAPI ca Netscape. Nhng mt ng dng c vit trn nhng trnh ch API ny li kt hp vi mt nh cung cp Web server c th. Nu bn cn di chuyn mt ng dng sang mt Web server khc ca mt nh cung cp phn mm khc, bn phi bt u li t u. Vn khc vi hng i ny l ng tin cy. Cc API thng thng h tr m thc thi C/C++ trong x l ca cc Web server. Nu mt ng dng b li, v d nh con tr b li hoc chia cho 0, th ton b Web server s b sp cng vi n.
Trong nh ngha servlet, bo mt c ci tin theo nhiu cch. Trc ht, bn him khi thc thi lnh trn shell vi d liu cung cp bi ngi dng khi Java API cung cp truy cp n tt c nhng hm s dng thng dng. Bn c th s dng JavaMail c v gi mail, Java DataBase Connect (JDBC) truy cp cc database, lp File v nhng lp quan h truy cp h thng file, RMI, CORBA, Enterprise Java Beans (EJB) truy cp cc h thng k tha M hnh bo mt Java to cho n kh nng b sung cc iu khin truy cp tt hn, cho thc th ch cho php truy cp n mt phn c xc nh tt hn trong h thng file. Vic x l cc ngoi l ca Java cng lm cho mt servlet chc chn hn cc trnh ch API C/C++ - mt php chia cho 0 c thng bo nh mt li thay v lm sp c mt h thng Web server.
thc khc HTTP. Gi javax.servlet cha cc lp v cc giao tip c k tha giao tip mt cch c lp. Gi javax.servlet.http cha cc lp v giao tip HTTP c th. y ch l mt s gii thiu v servlet, ti s b qua s phn bit ny y v ch tp trung vo HTTP servlet. Servlet u tin ca chng ta tn l ReqInfoServlet k tha mt lp tn HTTPServlet. HTTPServlet l mt phn ca JSDK v c b sung giao tip Servlet cng vi mt s cc phng thc hu dng khc. Chng ta nh ngha lp ca chng ta nh sau:
import javax.servlet.*; import javax.servlet.http.*; public class ReqInfoServlet extends HttpServlet { ... } Mt tp cc phng thc trong HTTPServlet l nhng phng thc xc nh dch v trong giao tip servlet. Vic b sung dch v trong HTTPServlet ging nh mt kiu ca cc yu cu c x l (GET, POST, HEAD) v gi mt phng thc c th cho mi kiu. Bng vic lm ny, cc nh pht trin servlet an tm khi x l chi tit nhng yu cu nh HEAD, TRACE, OPTIONS v c th tp trung vo nhng yu cu thng dng hn nh GET v POST. Trong v d u tin, chng ta s b sung phng thc doGet protected IOException{ ... } void response) doGet(HttpServletRequest throws ServletException, request,HttpServletResponse
Phng
thc
doGet
hai
tham
HTTPServletRequest
HTTPServletResponse. Hai i tng ny cho php chng ta truy cp y tt c cc thng tin v yu cu v cho php chng ta gi lung xut cho client nh l tr li cho yu cu. Vi CGI bn c cc bin mi trng v stdin nhn thng tin v yu cu, tuy nhin vic t tn cc bin mi trng c th khc nhau gia cc CGI, v mt vi bin khng c cung cp bi tt c cc Web server. i tng HTTPServletRequest cng cung cp thng tin ging nh bin mi trng ca CGI theo mt hng chun. N cng cung cp nhng phng thc m ra cc tham s HTTP t chui truy vn hoc thn ca yu cu ph thuc vo kiu yu cu (GET hay POST). L mt nh pht trin servlet, bn truy cp cc tham s theo cng mt cch cho c hai kiu yu cu. Nhng phng thc khc cho bn truy cp n tt c nhng header ca yu cu v gip bn phn tch cc header ngy v cookie. Thay v vit tr li nh stdout ging nh bn lm vi CGI, bn nhn mt i tng OutputStream hoc PrintWriter t HTTPServletResponse. OutputStream c dnh cho d liu nh phn nh cc nh GIF hoc JPEG, v PrintWriter dnh cho vic xut vn bn text. Bn cng c th n nh tt c cc header tr li v m trng thi m khng phi ph thuc vo cc cu hnh c th ca Web server CGI no. iu ny lm cho servlet ca bn d dng ci t. Hy b sung vo thn ca phng thc doGet v xem chng ta s dng nhng phng thc ny nh th no. Chng ta c th c hu ht cc thng tin chng ta c c t HTTPServletRequest (lu nhng phng thc ny vo v d k tip) v gi nhng gi tr ny tr li cho yu cu protected void doGet(HttpServletRequest request,
PrintWriter out = response.getWriter(); // in ra HTML header out.println("<HTML><HEAD><TITLE>"); out.println("Request info"); out.println("</TITLE></HEAD>"); // in ra than HTML out.println("<BODY><H1>Request info</H1><PRE>"); out.println("getCharacterEncoding: request.getCharacterEncoding()); out.println("getContentLength: " + request.getContentLength()); out.println("getContentType: " + request.getContentType()); out.println("getProtocol: " + request.getProtocol()); out.println("getRemoteAddr: " + request.getRemoteAddr()); out.println("getRemoteHost: " + request.getRemoteHost()); out.println("getScheme: " + request.getScheme()); out.println("getServerName: " + request.getServerName()); out.println("getServerPort: " + request.getServerPort()); out.println("getAuthType: " + request.getAuthType()); out.println("getMethod: " + request.getMethod()); out.println("getPathInfo: " + request.getPathInfo()); out.println("getPathTranslated: " + request.getPathTranslated()); out.println("getQueryString: " + request.getQueryString()); out.println("getRemoteUser: " + request.getRemoteUser()); out.println("getRequestURI: " + request.getRequestURI()); out.println("getServletPath: " + request.getServletPath()); out.println(); out.println("Parameters:"); Enumeration paramNames = request.getParameterNames(); While (paramNames.hasMoreElements()) { String name = (String) paramNames.nextElement(); String[] values = request.getParameterValues(name); out.println(" " + name + ":"); " +
for (int i = 0; i < values.length; i++) { out.println(" " + values[i]); } } out.println(); out.println("Request headers:"); Enumeration headerNames = request.getHeaderNames(); while (headerNames.hasMoreElements()) { String name = (String) headerNames.nextElement(); String value = request.getHeader(name); out.println(" " + name + " : " + value); } out.println(); out.println("Cookies:"); Cookie[] cookies = request.getCookies(); for (int i = 0; i < cookies.length; i++) { String name = cookies[i].getName(); String value = cookies[i].getValue(); out.println(" " + name + " : " + value); } // in ra footer HTML out.println("</PRE></BODY></HTML>"); out.close(); } Phng thc doGet trn s dng hu ht cc phng thc trong HTTPServletRequest nhm cung cp thng tin v yu cu. Bn c th c chng trong ti liu servlet API, v th y chng ta ch tm kim nhng g ng ch nht.
getParameterNames v getParameterValues gip bn truy cp nhng tham s HTTP nu servlet c yu cu vi phng thc GET hay post. getParameterValues tr v mt dy String bi v mt tham s c th c nhiu gi tr. V d nu bn yu cu servlet vi mt chui URL http://localhost:8080/servlet/ReqInfoServlet?foo=bar&foo=baz th bn s thy tham s foo c hai gi tr bar v baz. iu ny ng nu nh bn s dng chung mt tn nh danh cho nhiu thnh phn ca form HTML v s dng phng thc POST trong th ACTION. Nu nh bn chc chn rng mt tham s HTTP ch c th c mt gi tr th bn c th s dng phng thc getParameter thay v getParameterValues. N tr v mt chui String v nu c nhiu gi tr n s tr v gi tr u tin nhn c t yu cu. Bn truy cp n tt c header ca yu cu HTTP vi cc phng thc getHeaderNames v getHeader. getHeader tr v mt chui String ca header. Nu nh bn bit header c cha gi tr ngy hay mt gi tr integer bn c th nhn c s gip chuyn i header sang mt nh dng tng thch. getDateHeader tr v mt ngy l s mili giy bt u t 00:00:00 GMT . ngy 1/1/1970. y l s thay th s chun cho thi gian trong Java (tng t nh Unix). Bn c th s dng n khi dng mt i tng ngy. getIntHeader tr v header gi tr kiu int. getCookie s phn tch Cookie v tr v tt c cookie trong mt dy cc i tng Cookie. thm mt cookie vo tr li, HTTPServletResponse cung cp phng thc addCookie t mt i tng Cookie nh l mt i s. Nu nh bn bin dch ReqInfoServlet v ci t n trn servlet engine ca bn v gi n thng qua trnh duyt vi mt URL ging nh v mi th u ng theo sau http://localhost:8080/servlet/ReqInfoServlet/foo/bar?fee=baz th rong trnh duyt s hin th Request info
getCharacterEncoding: getContentLength: -1 getContentType: null getProtocol: HTTP/1.0 getRemoteAddr: 127.0.0.1 getRemoteHost: localhost getScheme: http getServerName: thangnc getServerPort: 8080 getAuthType: null getMethod: GET getPathInfo: /foo/bar getPathTranslated: D:\PROGRA~1\jsdk2.1\httproot\servlet\ReqInfoServlet\foo\bar getQueryString: fee=baz getRemoteUser: null getRequestURI: /servlet/ReqInfoServlet/foo/bar getServletPath: /servlet/ReqInfoServlet Parameters: fee: baz Request headers: Connection : Keep-Alive User-Agent : Mozilla/4.5 [en] (WinNT; I) Host : thangnc Accept : image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */* Accept-Encoding : gzip Accept-Language : en Accept-Charset : iso-8859-1,*,utf-8 Cookie : TOMCATID=TO04695278486734222MC1010AT
Cookies: TOMCATID : TO04695278486734222MC1010AT Nu bn mun servlet ny x l c yu cu GET v POST? Vic b sung mc nh doGet v doPost tr v mt thng ip thng bo rng phng thc ny cha c b sung. V th chng ta ch phi cung cp mt b sung mi ca doGet. c th x l mt yu cu POST theo cng mt cch, chng ta ch cn gi doGet t doPost protected void doPost(HttpServletRequest request, throws ServletException, IOException { doGet(request, response); }
HttpServletResponse response)
Mt trong nhng c im th v ca Servlet API l h tr persistent data. Khi mt servlet c ti theo cc request v cc servlet c ti vo trong cng mt x l, iu d dng nh thng tin t mt request ny n mt request khc v n nhng servlet chia s d liu khc nhau. D liu chia s v c nh (Persistent and shared data) Mt trong nhng c im th v ca Servlet API l h tr persistent data. Khi mt servlet c ti theo cc request v cc servlet c ti vo trong cng mt x l, iu d dng nh thng tin t mt request ny n mt request khc v n nhng servlet chia s d liu khc nhau. Servlet API cha mt s cc k thut h tr iu ny mt cch trc tip. Chng ta s xem xt v chng mt cch chi tit di y. Mt cch hu hiu khc x l d liu c chia s bng cch s dng mt i tng singleton. Mt lp HttpSession c gii thiu trong phin bn 2.0 ca Servlet API. Cc thc th ca lp ny c th nm gi thng tin v mt session ca ngi dng gia nhng yu cu khc nhau. Bn bt u mt session mi bng vic yu cu mt i tng HttpSession t lp HttpServletRequest trong phng thc doGet hay doPost ca bn: HttpSession session = request.getSession(true); Phng thc ny t vo mt i s kiu boolean. Nu i s c t vo l true th s c mt session mi c to ra nu n cha tn ti. Nu i s c t vo l false th ch c mt session tn ti c tr v. Servlet API h tr hai cch tp hp nhiu request vo mt session: cookie v ghi vo URL (URL rewriting). Nu cookie c s dng, mt cookie vi nh danh session ID duy nht c gi n client khi mt session c to ra. Khi , client bao gm cookie vi tt c request lin tc servlet engine c th tnh ton session no th request c i km. URL rewriting c thit k cho cc client khng h tr cookie hoc khi ngi dng khng cho php cookie. Vi URL rewriting, cookie s c m ha trong cc URL servlet ca bn gi n cho client. Khi ngi dng click vo mt URL c m ha, session ID s c gi n server, ni n c gii m v phi tp hp request ca client vi session ng. s dng URL rewriting, bn phi chc
chn rng tt c cc session c gi n client phi c m ha vi phng thc encodeURL hoc encodeRedirectURL trong HttpServletResponse. Mt HttpSession c th lu tr bt k mt kiu i tng no. Mt v d thng dng l mt kt ni database cho php nhiu request c t trong cng mt chuyn i database, hoc l thng tin v sn phm c mua trong mt ng dng Shopping cart cho php ngi dng c th thm vo mt mt hng trong gi hng ca h trong khi vn duyt qua site. lu mt i tng trong mt HttpSession, bn dng phng thc putValue Connection con = driver.getConnection(databaseURL, user, password); session.putValue(myApp.connection, con); Trong mt servlet khc hoc trong cng mt servlet nhng x l mt request khc, bn c th ly i tng vi phng thc getValue HttpSession session = request.getSession(true); Connection con = (Connection) session.getValue(myApp.connection); if(con != null) { // Thc thi nhng chuyn i d liu } Bn c th ngng tng i (lm mt hiu lc) mt session bng mt phng thc v hiu ha hoc n kt thc (time-out) mt cch t ng bng servlet engine. Session kt thc nu khng c mt request no i km vi session trong mt khong thi gian xc nh. Hu ht cc servlet engine u cho php bn xc nh di ca khong thi gian thng qua mt la chn cu hnh. Trong phin bn 2.1 ca Servlet API cng km theo mt phng thc setMaxInactiveInterval v th cho php bn chnh sa thi gian tng thch vi cc yu cu ca mi ng dng c th.
Tt c cc servlet thuc v mt ng cnh (context) servlet. Trong phin bn 1.0 v 2.0 ca Servlet API, tt c cc servlet trn mt host thuc v mt context, nhng vi phin bn 2.1 ca API, context tr nn hu dng hn v c th c xem nh xut pht im ca mt khi nim ng dng. Cc phin bn tng lai ca API s lm cho iu ny thm ch tr nn r rng hn.
//Xc nh mt style sheet mi cho ng dng Context.setAttribute(stylesheet, styleSheet); } on m trn c th l mt phn ca mt ng dng cu hnh servlet, x l request t mt HTML FORM c mt style sheet xc nh cho ng dng. Tt c cc servlet trong ng dng to ra HTML c th s dng attribute style sheet nh sau: ServletContext context = getServletContext(); String styleSheet = context.getAttribute(stylesheet); out.println(<HTML><HEAD>); out.println(<LINK Cc thuc tnh v ti nguyn yu cu (Request attributes and resources) Phin bn 2.1 ca API thm vo hai k thut chia s d liu gia cc servlet: request attibute v resource. Cc phng thc getAttribute, getAttributeNames v setAttribute c thm vo cho lp HttpServletRequest (hoc chnh xc hn l cho siu lp ServletRequest). Chng c xc nh s dng vi RequestDispatcher, mt i tng c s dng chuyn tip (forward) mt request t mt servlet ny n mt servlet khc v cha mt lung xut t mt servlet trong lung xut t servlet chnh. Cc phng thc getResourcev v getResourceAsStream ca lp ServletContext cho php bn truy cp n nhng ti nguyn bn ngoi, chng hn nh mt file cu hnh ng dng. Bn c th thn thuc vi nhng phng thc chia s cng mt tn ging nh nhng phng thc trong lp ClassLoader. Tuy nhin, nhng phng thc ca lp ServletContext c th cung cp cch truy cp n nhng ti nguyn khng tht s l file. Mt ti nguyn c th c lu tr trong mt database, c sn thng qua HREF= + styleSheet + TYPE=text/css REL=STYLESHEET>);
mt LDAP server, trong trng hp ny ti nguyn l mi th m servlet engine quyt nh h tr. Servlet engine cung cp mt la chn cu hnh context bn xc nh c gc ca c s ti nguyn, l mt ng dn th mc, mt HTTP URL, mt JDBC URL Cc v d v cch s dng nhng phng thc c th l mt ch trong mt article tng lai. Cho n sau khi bn c th c chng trong Servlet 2.1
Nh bn thy phn trc, cc request song song c mt servlet x l bng cch chia nh thnh cc thread thc thi tng ng vi phng thc x l request (v d doGet hoc doPost). iu ny v th tr nn quan trng bi v nhng phng thc ny l nhng thread an ton. Mnh ght ngy hm , ght lm, ci ngy bt u ca 1 chui cc li bun, gi nh ko c ngy , mnh s ko yu anh y, ko bao gi c. minh ght, mnh mun th qu, tht ngt ngt, tht mt mi,
a tuyn (Multithreading)
Nh bn thy phn trc, cc request song song c mt servlet x l bng cch chia nh thnh cc thread thc thi tng ng vi phng thc x l request (v d doGet hoc doPost). iu ny v th tr nn quan trng bi v nhng phng thc ny l nhng thread an ton. Cch d dng nht chc chn rng on m an ton l trnh kt thc cc bin thc th (instance variable) v thay vo hy t ton b thng tin cn thit vo mt phng thc nh nhng tham s. V d: private String someParam; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { someParam = request.getParameter(someParam); processParam(); } private void processParam() { // X l vi someParam } l khng an ton. Nu phng thc doGet thc thi hai phng thc. iu ny c ngha l gi tr ca instance variable someParam s c t vo thread th hai trong khi thread u tin vn cn s dng n. Chuyn sang mt thread an ton nh sau: private String someParam;
protected
void
doGet(HttpServletRequest
request,
HttpServletResponse
response) throws ServletException, IOException { someParam = request.getParameter(someParam); processParam(someParam); } private void processParam(String someParam) { //X l vi someParam } y, phng thc processParam nhn vo tt c d liu n cn nh nhng tham s thay v phi ph thuc vo cc instance variable. Mt l do khc trnh instance variable, l trong mt h thng a server (multi-server), c th c mt instance cho servlet cho mi server v cc request cho cng servlet c th c phn chia gia cc server. Vic gi cc thng tin c phn chia trong cc instance variable trong trng hp khng lm vic vi tt c, trong trng hp ny thay v s dng i tng HttpSession, cc attribute ServletContext hoc mt d liu lu tr bn ngoi l mt database hoc mt dch v RMI/CORBA sa cha trng thi ng dng. Thm ch nu bn bt u vi mt h thng n server (single-server), vn l mt tt vit cc servlet ca bn v chng c th c pht trin thnh mt h thng multi-server ln hn. Kt thc Article ny ch m t ngn gn v Servlet API v tt c nhng iu m bn c th lm vi servlet. Bn c th hc c nhiu hn bng vic c nhng cun sch hoc ving thm nhng trang web v Servlet.