You are on page 1of 19

Cng ngh Servlet

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.

1. So snh JSP/Servlet v CGI, ASP, ISAPI


Nhc im ca CGI l tc , b nh. Mi ln trnh CGI c gi thc thi mt yu cu l mi ln web server np v gii phng trnh CGI khi b nh, hn th na nu c nhiu yu cu ng thi t trnh khch th web s phi np nhiu th hin ca trnh CGI vo trong b nh, dn n my ch c th b qu ti do c qu nhiu yu cu ng thi, cng ngh web a ra nhiu gii php khc nhau nhm gii quyt cc hn ch ca cng ngh CGI. Cc chng trnh CGI c th c vit bng bt c chng trnh bin dch no nh pascal, C/C++, VB, Microsoft a ra mt gii php khc phc nhc im ca cc trnh CGI, cng ngh ny ca Windows c gi l cng ngh ISAPI, cc chng trnh ISAPI cng tng t cc trnh CGI, cc trnh ISAPI dng th vin lin kt ng DLL, cc trnh ISAPI ch phi np mt ln

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.

Gii php vi Servlet


Servlet API c pht trin da trn nhng im mnh ca Java platform nhm gii quyt vn ca CGI v trnh ch server API. N l mt API n gin h tr tt c cc Web server v thm ch cc ng dng my ch dng kim tra v qun l cc cng vic trn server (load -balancing). N gii quyt vn thc thi bng vic thc hin tt c cc yu cu nh nhng thread trong mt x l, hoc trn mt h thng load-balancing s l mi x l trn mt server trong kt chm cluster. Cc servlet d dng chia s ti nguyn.

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.

Mi trng runtime ca servlet


Mt servlet l mt lp Java v v th cn c thc thi trn mt my o Java (JVM) bng mt dch v gi l servlet engine. Servlet engine ti lp servlet ln u tin servlet c yu cu, hoc ngay khi servlet engine c bt u. Servlet ngng ti x l nhiu yu cu khi servlet engine b tt hoc n b dng li. Mt vi Web server nh Java Web Server ca Sun, JigSaw ca W3C, hoc LiteWebServer ca Gefion c mt servlet engine c xy dng trn Java. Nhng Web server khc nh Enterprise Server ca Netscape, IIS ca Microsoft hoc Apache ca Apache yu cu mt module servlet engine add-on. Trnh add-on ny chuyn tt c cc yu cu cho cc servlet, thc thi chng v tr v tr li cho trnh duyt thng qua Web server. V d cc servlet engine add-on nh WAICoolRunner ca Gefion, WebSphere ca IBM, Jrun ca Live. Tt c cc lp servlet API v mt Web server cho php servlet n gin c tch hp vi J2SDK c sn download ti site servlet ca

Sun. bt u vi servlet, ti yu cu bn download J2SDK v chy nhng v d servlet n gin.

Giao tip v vng i ca servlet


Hy b sung servlet u tin ca chng ta. Mt servlet l mt lp Java b sung giao tip servlet. Giao tip ny b sung ba phng thc nh ngha vng i ca servlet: public void init(ServletConfig config) throws ServletException: phng thc ny c gi mt ln khi servlet c ti vo trong servlet engine, trc khi servlet c yu cu x l yu cu u tin ca n public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException: phng thc ny c gi x l mt yu cu. N c th khng gi, gi mt ln hay nhiu ln cho n khi servlet c ngng ti. Nhiu thread (mi yu cu) c th thc thi phng thc ny song song, v th n tr nn an ton. public void detroy(): phng thc ny ch c gi mt ln trc khi servlet c ngng ti v g b dch v. Phng thc init c mt thuc tnh ServletConfig, servlet c th c cc i s khi to ca n thng qua i tng ServletConfig. Chng thng c nh ngha trong mt file cu hnh. Mt v d thng thng ca mt i s khi to l nh danh database ... private String databaseURL; public void init(ServletConfig config) throws ServletException { super.init(config); databaseURL = config.getInitParameter("database"); } Servlet API c cu trc servlet c th cho php b sung mt giao

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

Cc i tng request v response

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,

HttpServletResponse response) throws ServletException, OException { response.setContentType("text/html");

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.

Cc thuc tnh ServletContext


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. Nhiu servlet engine b sung Servlet API 2.1 gip cho bn nhm mt tp cc servlet vo trong mt context v h tr nhiu context trong cng mt host. ServletContext trong API 2.1 c th ph thuc vo trng thi ca cc servlet ca n v s phn bit cc ti nguyn (resource) v thuc tnh (attribute) c sn cho cc servlet trong context. y, chng ta s ch xem xt cc attribute ca ServletContext c th c dng chia s thng tin gia mt nhm cc servlet nh th no. C ba phng thc ServletContext tng ng vi cc attribute: getAttribute, setAttribute v removeAttribute. Thm vo , servlet engine c th cung cp nhiu cch cu hnh servlet context vi cc gi tr attribute khi to. Vic qun l ny ging nh mt s chp nhn thm vo cc i s khi to servlet cho vic cu hnh thng tin s dng bi mt nhm cc servlet, cho thc th ca nh danh database m chng ta cp phn trc, mt bng kiu (style sheet) URL cho mt ng dng, tn ca mt mail server Mt server nhn mt tham chiu n i tng ServletContext ca n thng qua i tng ServletConfig. HttpServlet tht s cung cp mt phng thc thun li (thng qua siu lp ca n GenericServlet) mang tn getServletContext lm cho n tht s d dng ServletContext context = getServletContext(); String styleSheet = context.getParameter(stylesheet); If(styleSheet != null) {

//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.

You might also like