Monday, February 6, 2012

JSP သင္ခန္းစာ ၆

အခုဆိုရင္ သင္ခန္းစာ ၆ ကိုေရာက္ရိွလို႕လာပါျပီ။

ဒီတစ္ခါမွာေတာ႔ JSTL အေၾကာင္း နည္းနည္းေလာက္ေျပာပါမယ္။ သင္ခန္းစာေတြကိုေရးေနရင္းနဲ႕မွ ျပန္လုပ္ၾကည္႕ျဖစ္ပါတယ္။ ကြ်န္ေတာ္႔ရဲ႕ျပႆနာက ေရွ႕အလုပ္မွာတုန္းကလည္း စဥ္းစားခ်ိန္မေရေလာက္ေအာင္ အလုပ္မ်ားခဲ႔တဲ႔အတြက္ လုပ္ဖူးတာေတြကို ျပန္ျပီး ေက်ညက္ေအာင္ ေလ႔လာခ်ိန္မေရလိုက္ဘူး။ ဒုတိယအလုပ္မွာၾကေတာ႔ ဘာမွ မလုပ္ရတဲ႔အတြက္ စာေတြပဲဖတ္ေနေတာ႔ တကယ္မေရးျဖစ္ေတာ႔ဘူး။ လုပ္ဖူးတာေတြၾကေတာ႔ ေမ႔သြားျပီး၊ ဖတ္ထားတာေတြၾကေတာ႔ မစမ္းၾကည္႕ရေသးဘူးျဖစ္ေနပါတယ္။ ဒါနဲ႕ ကိုယ္႔ဘာသာကိုယ္လည္းစာေႏြႊးတယ္အမွတ္နဲ႕ ေလ႔က်င္႔ခန္းတစ္ခ်ိဳ႕ျပန္လုပ္ၾကည္႕ပါတယ္။

Tag ေတြအေၾကာင္းကို သိရင္ JSTL ကို ပိုနားလည္ႏုိင္ပါတယ္။ SCWCD ေျဖတုန္းကေတာ႔ TLD (Tag Library Descriptors) Tag Lib အေၾကာင္းေတြ ဖတ္ခဲ႔ဖူးပါတယ္။ Tag Library နဲ႕ပတ္သက္ျပီး Manning က Tag Libraries in action ဆိုတဲ႔စာအုပ္တစ္အုပ္လည္းထုတ္ပါတယ္။ hml မွာကိုပဲ tag ေတြအေၾကာင္းေလ႔လာၾကည္႕ႏိုင္ပါတယ္။ body tag က ဘာလုပ္သလဲ။ form ဆိုရင္ ဘာေတြလုပ္သလဲ။ စသျဖင္႔ သတ္မွတ္တာမ်ိဳးေပါ႔။ [c:forEach] ဆိုတာေလးကိုျမင္ရင္ looping ပတ္ဖုိ႕ အေနာက္မွာ code ေတြေရးထားျပီး jsp ကေန taglib ေၾကျငာျပီး အဲဒီ tag ေတြယူသံုးတာမ်ိဳးေပါ႔။ အဓိက အားသာခ်က္က clean code ျဖစ္ေစတာပါပဲ။ ရွင္းရွင္းေလးပဲ။ view မွာကို ရွဳပ္ေနျပီဆို မဟုတ္ေတာ႔ဘူး။ code ကို ရွင္းရွင္းေလး တကယ္ေရးတတ္ဖုိ႕က ပိုျပီးခက္တယ္လုိ႕ထင္မိတယ္။ တစ္နည္းအားျဖင္႔ view မွာ business logicနဲ႕ဆိုင္တဲ႔ code ေတြေရာ java code ေတြပါ မပါေလ ရွင္းေလလုိ႕ထင္ပါတယ္။ JSTL ဆိုတာကလည္း JSP Standard Tag Library ဆိုတဲ႔အတြက္ သူ႕မွာလည္း standard tag ေတြပါေနျပိဆုိတာကို သိႏုိင္ပါတယ္။

jstl ကုိ apache foundation ဘက္ကစေရးပါတယ္။ ေနာက္ဆံုး version 1.2 ကိုေတာ႔ sun ဘက္ကေရးျပီး glassfish project ထဲထည္႕ထားတာေတြ႕ရပါတယ္။ 1.2 မတိုင္ခင္မွာေတာ႔  jstl အတြက္ jar files ႏွစ္ခုလိုပါတယ္။ တစ္ခုကjstl.jar ပါ။ ေနာက္တစ္ခုက standard.jar ျဖစ္ပါတယ္။

အဲဒီ jar files ႏွစ္ခုကို web server နဲ႕ library folder မွာထည္႕ေလ႔ရိွပါတယ္။ အဲဒီမွာလည္း ေျပာစရာတစ္ခုရိွပါတယ္။ web server ေတြအေနနဲ႕ သူတုိ႕ရဲ႕ common\lib ေအာက္က jar file နဲ႕ application တစ္ခု စီရဲ႕ lib folder က jar file တူေနရင္ common\lib ေအာက္က jar ကိုပဲယူျပီး application lib ေအာက္က jar file ကိုေတာ႔ cannot load ဆိုတဲ႔ exception ျပပါလိမ္႔မယ္။ တူေနတဲ႔ jar ႏွစ္ခုကို တစ္ျပိဳင္နက္ load မလုပ္ဖူးဆိုတာကိုေျပာခ်င္တာပါ။

JSTL ရဲ႕ အေၾကာင္းက ေတာ္ေတာ္ေလးက်ယ္ျပန္႕ပါတယ္။ ေလာေလာဆယ္ေရးဖုိ႕အတြက္ကိုပဲ ဦးတည္ျပီးေျပာလုိက္ပါတယ္။ အခ်ိန္ရရင္ေတာ႔ JSTL နဲ႕ပတ္သက္တဲ႔စာအုပ္ေတြ ထပ္ဖတ္ျပီး သပ္သပ္တစ္ခုေရးလုိက္ပါဦးမယ္။ Manning ရဲ႕ JSTL in action စာအုပ္ကိုလည္း စင္ကာပူ အစိုးရက ႏွစ္အုပ္ထဲ၀ယ္ထားတဲ႔အတြက္ woodlands သို႕မဟုတ္ jurong ဘက္ေရာက္မွ ငွားျပီးဖတ္ၾကည္႕ပါဦးမယ္။
အရင္တုန္းကေတာ႔ အစိုးရက အနည္းဆံုး 5 copies ေလာက္၀ယ္ထားတဲ႔အတြက္ ငွားရတာ ပိုျပီးလြယ္ပါတယ္။ ေခြ်တာေရးမ်ားလားလို႕ေတာင္ေတြးမိပါတယ္။

web.xml အေၾကာင္းလည္း နည္းနည္းေလာက္ေျပာရမယ္ထင္ပါတယ္။ J2EE application ေတြမကင္းႏိုင္တဲ႔ config file ျဖစ္ပါတယ္။ အဲဒီမွာ အစံုေရးၾကပါတယ္။ security filter ေတြ၊ framework ရဲ႕ controller ေတြ၊ servlet mapping ေတြ၊ tag definition ေတြ၊ error handling ေတြ၊  db information ေတြ အစံုအစံုအစံု အဲဒီမွာေရးပါတယ္။

ထင္ရွားတဲ႔ Error 500, Error 404 ေတြကို မျမင္ခ်င္ရင္လည္း ကို္ယ္႔ဘာသာကိုယ္ web.xml မွာ error page ေလးေတြ လုပ္လုိ႕ရပါတယ္။ HTTP Error 500 Internal server error ကို ေတြ႕ရင္ users ေတြ စိတ္မခ်မ္းသာမွာစုိးတယ္ဆုိရင္ Http 500 အတြက္ Error Page ေလးကို myHttp500Err.jsp စတဲ႔ နာမည္လွလွေလးေပးျပီး။"We are sorry, you are unlucky today" ဆိုတာမ်ိဳး ျပခ်င္ျပလို႕ရပါတယ္။ အဲဒါမ်ိဳးကို web.xml မွာ


[error-page]
[error-code ] 500 [ /error-code]
[location ]  myHttp500Err.jsp  [ /location]
 [ /error-page]


ဆိုျပီး ေရးထားလုိ႕ရပါတယ္။ SCWCD မွာေတာ႔ web.xml အေၾကာင္း ေတာ္ေတာ္ေလးစံုစံုလင္လင္ပါပါတယ္။ အထူးသျဖင္႔ config ကေနျပီး Error Page လုပ္ထားႏိုင္တာ အင္မတန္ေကာင္းပါတယ္။ ျပင္ရတာလည္း လြယ္ပါတယ္။ web.xml ေလးဖြင္႔ျပီး file နာမည္ေလးေျပာင္းလိုက္ရံုနဲ႕ ေနာက္ထပ္ jsp တစ္ခုကို error page အေနနဲ႕ေျပာင္းလုိ႕ရႏုိင္ပါတယ္။  ဥပမာ Error Message အသစ္တစ္ခုကို ဒီဇိုင္း အပ်ံစားလုပ္ျပီး specilHttp500Err.jsp လုပ္တယ္ဆိုပါေတာ႔။ "Now is X'mas season, this error page is our X'mas present for you .." ဆိုတဲ႔ error message မ်ိဳးနဲ႕ဆိုပါေတာ႔။


[error-page]
[error-code ] 500 [ /error-code]
[location ]  specilHttp500Err.jsp  [ /location]
 [ /error-page]


အဲဒါေလးေျပာင္းလုိက္ရံုပါပဲ။ Error တင္မဟုတ္ပါဘူး။ Exception ေတြကိုလည္း အဲဒီမွာ Handling လုပ္ႏုိင္ပါေသးတယ္။

web.xml အေၾကာင္းေျပာရင္း error page config ေရာက္သြားပါတယ္။ နမူနာေျပာျပတာပါ။ အခုသိစရာလိုတာက TLD ေတြကိုဘယ္ေနရာမွထားျပီး ဘယ္လို config သလဲဆိုတာပါပဲ။
[tomcat]/webapps
[tomcat]/webapps/[your application]/

[tomcat]/webapps/[your application]/WEB-INF

[tomcat]/webapps/[your application]/WEB-INF ေအာက္မွာေတာ႔ lib folder ရိွပါတယ္။ အဲဒီမွာ META-INF folderထားေလ႔ရိွပါတယ္။ TLD extension နဲ႕အဆံုးသတ္တဲ႔ tag lib descripters files ေတြကို
[tomcat]/webapps/[your application]/WEB-INF/META-INF ေအာက္မွာထားေလ႔ရိွပါတယ္။ TLD file ေတြကို standard.jar ကို extract လုပ္လုိက္ရင္ MET-INF ဆိုတဲ႔ folder ကိုေတြ႕ရပါလိမ္႔မယ္။ အဲဒီ META-INF file ထဲမွာေတာ႔ c.tld, c-rt.tld, fmt.tld, fmt-rt.tld စတဲ႔ tld file ေတြကို ေတြ႕ႏိုင္ပါတယ္။
c.tld ကိုဖြင္႔ဖတ္ၾကည္႕ရင္ tag name ဆိုတာေလးေတြကိုေတြ႕ႏို္င္ပါတယ္။ choose/if/forEach စတာေတြကိုေတြ႕ႏိုင္ပါတယ္။ အဲဒါေတြကို jsp မွာထည္႕သံုးတဲ႔အခါ tld ကေနတစ္ဆင္႔ ေနာက္မွာ ေရးထားတဲ႔ java codes ေတြကို ေရာက္သြားေအာင္လုပ္ထားတာပါပဲ။ အခုနက Extract လုပ္ထားတဲ႔ META-INF ေလးကို ကူးျပီး WEB-INF ေအာက္ကိုပို႕ထားလုိက္ပါ။ အဲဒါဆိုရင္ TLD files ေတြဟာ [tomcat]/webapps/[your application]/WEB-INF/META-INF/ ေအာက္ကိုေရာက္သြားပါျပီ။
 [taglib>

   [ taglib-uri ] http://java.sun.com/jsp/jstl/core [ /taglib-uri]
   [ taglib-location ] /WEB-INF/META-INF/c.tld [ /taglib-location]
[/taglib]


အဲဒါေလးကို web.xml ထဲမွာ ထည္႕ေရးေပးရပါမယ္။ အေပၚမွာ uri တစ္ခုပါေနတာကို သတိထားမိမယ္ထင္ပါတယ္။ taglib တစ္ခုမွာ uri နဲ႕ location ဆိုျပီးေပးထားတာကို ေတြ႕မွာပါ။ အေပၚက uri ကုိညႊန္းရင္ ဘယ္မွာရွာရမွန္းမသိမွာစိုးလုိ႕ ေအာက္မွာ သက္ဆိုင္တဲ႔ tld ရဲ႕ location ကိုထည္႕ေပးတဲ႔သေဘာပါပဲ။ web.xml အျပည္႕အစံုကေတာ႔ ဒီလိုေနမွာပါ။



[?xml version="1.0"?]
[!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
  "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd"]
[web-app]
  [taglib]
           [taglib-uri]http://java.sun.com/jsp/jstl/core[/taglib-uri]
           [taglib-location]/WEB-INF/META-INF/c.tld[/taglib-location]
[/taglib]
 [/web-app]

အလြယ္ဆံုး နမူနာေလးတစ္ခုေရးၾကည္႕ပါမယ္။ jstlTest.jsp ဆိုၾကပါစုိ႕။


[%@ page language="java" contentType="text/html;
         charset=US-ASCII" pageEncoding="US-ASCII"%]

[%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %]

[!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"]
[html]
  [head]
    [meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"]
    [title]iteration with c:forEach loop[/title]
  [/head]
  [body]
    [h2]iteration with c:forEach loop[/h2]
 
    [c:forEach var="i" begin="1" end="10"]
            [c:out value="${i}" /]
    [/c:forEach]
  [/body]
[/html]



[%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %] 
ဒီဟာကေတာ႔ tag llib သံုးမယ္ဆိုတာကို အေၾကာင္းၾကားတာပါ။ version 1.1 JSTL အတြက္ေရးတဲ႔ပံုစံျဖစ္ပါတယ္။ 1.2 မွာဆုိရင္ uri နည္းနည္းေျပာင္းသြားပါလိမ္႔မယ္။ JSTL,JSP,Servlet နဲ႕ tomcat version အတြဲကို ဒီလိုသတ္မွတ္ပါတယ္။

JSTL 1.0 : Servlet 2.3 : JSP 1,2 (tomcat 4)
JSTL 1.1 : Servlet 2.4 : JSP 2.0 (tomcat 5)
JSTL 1.2 : Servlet 2.5 : JSP 2.1 (tomcat 6)

အဲဒါေလးေတြကို မသိရင္ တခါတေလ တစ္ခ်ိဳ႕ version မွာ ရ တစ္ခ်ိဳ႕မွာ မရတဲ႔ ျပႆနာတက္နုိင္ပါတယ္။ အထူးသျဖင္႔ migration လုပ္တဲ႔အခါမ်ိဳးနဲ႕ source code ေတြကို အဆင္႔ျမွင္႔တဲ႔အခါမ်ိဳးမွာ သတိျပဳဖုိ႕လိုပါတယ္။ ေနာက္တထပ္သတိျပဳစရာ J2EE 1.4 လား၊ J2EE 1.5 လားဆိုတာလဲရိွပါေသးတယ္။
servlet API history မွာၾကည္႕လို႕ရပါတယ္။

Servlet API history
Servlet API versionReleasedPlatformImportant Changes
Servlet 3.0December 2009JavaEE 6, JavaSE 6Pluggability, Ease of development, Async Servlet, Security, File Uploading
Servlet 2.5September 2005JavaEE 5, JavaSE 5Requires JavaSE 5, supports annotation
Servlet 2.4November 2003J2EE 1.4, J2SE 1.3web.xml uses XML Schema
Servlet 2.3August 2001J2EE 1.3, J2SE 1.2Addition of Filter
Servlet 2.2August 1999J2EE 1.2, J2SE 1.2Becomes part of J2EE, introduced independent web applications in .war files
Servlet 2.1November 1998UnspecifiedFirst official specification, added RequestDispatcherServletContext
Servlet 2.0JDK 1.1Part of Java Servlet Development Kit 2.0
Servlet 1.0June 1997



    [c:forEach var="i" begin="1" end="10"]
            [c:out value="${i}" /]
    [/c:forEach]

ဆိုတဲ႔  code ကိုၾကည္႕ရင္ အသံုးျပဳမယ္႔ tag lib ကို prefix c ဆိုျပီး ေၾကညာထားတဲပအတြက္ c: ဆိုျပီး သံုးမယ္႔ tag name ေတြေရးပါတယ္။ forEach ဆိုတာ looping ပတ္ဖို႕အတြက္ သံုးတဲ႔ tag ျဇစ္ပါတယ္။ begin နဲ႕ end ကေတာ႔  သူတို႕နာမည္ၾကည္႕ရံုနဲ႕နားလည္နုိင္ပါတယ္။ c: out ဆိုတာမွာ tag name out ကို အသံုးျပဳပါတယ္။ printWriter out ျဖစ္ပါလိမ္႔မယ္။ တစ္ခုခုကို စာသားအျဖစ္ရိုက္ထုတ္ျပတာပါ။ ဒီမွာေတာ႔ variable i ကို loop ပတ္ျပီး တန္ဖိုးေတြ ျပန္ေရးတာကိုေတြ႕ပါလိမ္႔မယ္။  forEach ကိုေရာ out ကိုပါ tag အဖြင္႔အပိတ္နဲ႕ထားပါတယ္။  [c:out value="${i}" /] ဆိုတာနဲ႕   [c:out value="${i}" ]
 [/c:out ] ဟာ အတူတူပါပဲ တစ္ေၾကာင္းတည္း ေရးတဲ႔ tag ေတြမွာ / ထည္႕လိုက္တာဟာ အပိတ္ပါပဲ။

တစ္ခ်ိဳ႕စာအုပ္ေတြမွာ JSTL ကိုေရးတဲ႔အခါ web.xml ကို မရွင္းျပထားပါဘူး။ တစ္ခါတစ္ခါ ရြာလည္တတ္ပါတယ္။ jar files ေတြ ထည္႕ထားေပမယ္႔ tag ေတြကို error ျပေနတာေတြဟာ web.xml မွာ config မလုပ္ထားလုိ႕ပါပဲ။

 jstlTest.jsp ကို run ၾကည္႕လုိ႕ အိုေကတယ္ဆိုရင္ေတာ႔ jstl အေျခခံေလးတစ္ခု ရသြားျပီလုိ႕ဆုိႏုိင္ပါျပီ။

ဒါကေတာ႔ jstl ရဲ႕ နမူနာ declaration ေလးေတြပါ။ အခုက c: ဆိုတဲ႔ core tag အတြက္ ေရးတာပါ။ က်န္တာေတြကို ေရးခ်င္ရင္လည္း ေရးလို႕ရပါတယ္။ တစ္ခုနားလည္သြားရင္ က်န္တာေတြက နားလည္ဖုိ႕မခက္ေတာ႔ပါဘူး။



c:   <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
fn:  <%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
fmt: <%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
xml: <%@taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %> 
ေနာက္ထပ္ေလ႔က်င္႔ခန္းမွာေတာ႔ MySql နဲ႕ခ်ိတ္ပါမယ္။ ဒါဆိုရင္ေတာ႔ jsp အေျခခံေလးတစ္ခုေလာက္ေတာ႔ ရလိုက္ျပီလို႕ဆိုႏိုင္ပါတယ္။

ကဲလက္ေတြ႕ ေလ႔က်င္႔ၾကည္႕ပါဦး။

Regards,
Zero