June 23, 2012

JSTL

ကျွှန်တော်သည် JSP များအကြောင်းကို မရေးဖြစ်သည်မှာ ကြာပြီဖြစ်၏။ အလုပ်ရှုပ်နေသည်က တကြောင်း၊ အခြေခံ Java ကို ပြီးပြတ်အောင် ရေးချင်သည်ကတစ်ကြောင်းကြောင့် တော်ရုံနဲ့ JSP ဘက်ကို မရေးဖြစ်ဖြစ်နေပါသည်။ အခြေခံ Java သည်လည်း ရေးပြီးပြီဖြစ်ပြီး၊ Essential Java ဘက်ကို မစသေးခင် JSP ဘက်ကို ပြီးအောင်ရေးရပါဦးမည်။ မရေးတာကြာပြီ ဖြစ်သောကြောင့် ဘယ်ကို ရောက်ပြီလည်းဟု မနည်း စဉ်းစား ယူရပါသည်။ ဤတစ်ခေါက်တွင်လည်း jsp ၏ အခြေခံ နည်းပညာ တစ်ခု ဖြစ်သော JSTL အကြောင်းကို ရေးသား သွားပါဦးမည်။


JSTL ဆိုသည်မှာ

JSTL သည် Java Server Page Standard Tag Library ၏အတိုခေါက် အခေါ်အဝေါ်ဖြစ်ပြီး၊ JSP တွင် အသုံးပြုနိုင်သော အခြေခံ Tag လိုက်ဘရီ တစ်ခုဖြစ်ပါသည်။ JSTL ကို ရင်းမြစ်မှာ Apache Tag Lib ပရိုဂျက်ဖြစ်ပြီး နောက်ပိုင်းတွင် Java EE ၏ နည်းပညာတစ်ခု ဖြစ်လာခဲ့ပါသည်။

သမိုင်းကြောင်းကို ပြန်ကောက်ရမည်ဆိုလျှင် ၂၀၀၀ခုနှစ်ပိုင်းတွင် Java EE ၏ ဆာဗာပိုင်းဆိုင်ရာ နည်းပညာဖြစ်သော Servlet ကို စတင်ခဲ့ကြပါသည်။ ထိုအချိန် Dynamic Web Page များကို အသုံးပြုနေသည့် Client ထံမှ Request လာပါမှ အလုပ်စလုပ်စေသော CGI များနှင့်စာလျှင်၊ Server ပေါ်တွင် Process အဖြစ် Run နေပြီး၊ Request လာလျှင် ချက်ချင်း တုံ့ပြန်နိုင်သော Servlet သည် Java အား Server Side ပရိုဂရမ်မင်း ဘာသာရပ်တစ်ခုအဖြစ် နေရာတစ်နေရာ အခိုင်အမာရရှိစေခဲ့ပါသည်။

Servlet သည် Request လာပါက HTML စာသာများကို ပြန်ပြီး Response လုပ်စေခဲ့ပါသည်။ ထို့ကြောင့် တစ်ခုခုဖြစ်၍ ပြုပြင်လိုသည့်အခါမျိုးတွင် လွန်စွာခက်ခဲခဲ့၏။ ထိုအားနည်းချက်များအား ပြုပြင်နိုင်ရန် JSP ဆိုသည့်နည်းပညာကို Sun Microsystem က တီထွင် ခဲ့ပါသည်။ HTML Tag များအတွင်းတွင် Java ကုဒ်များကို ရေးသားခြင်းဖြင့် HTML ကုဒ်များကို Servlet ထဲတွင် ရေးသားခြင်းမှ သက်သာစေခဲ့ပါသည်။ သို့ရာတွင် JSP တွင်လည်း Tag များအကြားတွင် Java ကုဒ်များကို ရေးသားရသည်မှာ ဖတ်ရခက်ခဲစေခြင်း၊ တဖန် စာမျက်နှာ ဒီဇိုင်းများကို ရေးသားရာတွင် ခက်ခဲစေခြင်း အစရှိသည့် အခက်အခဲများကို ဖြစ်ပေါ်စေခဲ့၏။

ထိုကြောင့် တတ်နိုင်သ၍ Web စာမျက်နှာအတွင်းတွင် Java ကုဒ်များကို ရေးစရာမလိုစေရန် ကိုယ်ပိုင် Tag Lib များကို အသီးသီး ရေးသား အသုံးပြုလာကြပါသည်။ ထင်ရှားသည်မှာ Struts Framework ၏ Tag Lib များပင် ဖြစ်၏။ နောက်ပိုင်းတွင် သုံးရလွယ်ကူသော Tag များအား စုစည်း၍ အခြေခံ Tag လိုင်ဘရီ အဖြစ် သတ်မှတ်ခဲ့ကြခြင်း ဖြစ်၏။



ဗားရှင်းများ


JSTL ဗားရှင်း အခြေခံ JSP ဗားရှင်း အခြေခံ Servlet ဗားရှင်း
jstl 1.0 JSP 1.2 Servlet 2.3
jstl 1.1 JSP 2.0 Servlet 2.4
jstl 1.2 JSP 2.1 Servlet 2.5
ဤဘလောဂ်တွင် jstl 1.2 အား အခြေခံ၍ ရေးသားပုံကို ဖော်ပြသွားပါမည်။


အခြေခံ လိုင်ဘရီများ

JSTL အဖြင့် အသင့်ပြင်ထားသော Tag Library များမှာ အောက်ပါအတိုင်းဖြစ်ကြ၏။ Tag Lib များအား အသုံးပြုရန်မှာ ပြီးခဲ့သော အခန်း ဖြစ်သော Directives ဖြင့် ဖော်ပြခဲ့သော taglib directive ဖြင့် အစပိုင်းတွင် သတ်မှတ်ရန် လိုအပ်ပါသည်။ JSTL ဗားရှင်း အပေါ်မှုတည်၍ ရေးသားရန်လိုအပ်သော URI မှာ အသီးသီး ကွာခြားပါသည်။ ဤဘလောဂ်တွင်မှု jstl 1.2 ၏ ရေးသားပုံကို ဖော်ပြထားပါသည်။

အမည် prefix URI
Core c http://java.sun.com/jsp/jstl/core
XML Processing x http://java.sun.com/jsp/jstl/xml
L18N Formatting fmt http://java.sun.com/jsp/jstl/fmt
Database Access sql http://java.sun.com/jsp/jstl/sql


Core လိုင်ဘရီ၏ Tag များ


Core tag lib ရှိ tag များသည် လက်ရှိ jsp ရေးသားရာတွင် လွန်စွာအသုံးဝင်လှပါသည်။ ယခု ဖော်ပြမည့် jstl 1.2 သည် EL Expression အား အသုံးပြုနိုင်ပါသဖြင့်၊ jstl tag များနှင့် EL Expression ကို တွဲဖက်ရေးသားခြင်းအားဖြင့် JSP စာမျက်နှာများအား ရှင်းလင်း သပ်ရပ်စွာ ရေးသားနိုင်ပါသည်။

Tag အမည် ရှင်းလင်းချက်
set jsp စာမျက်နှာများတွင် ကိန်းရှင်များအား အသုံးပြုရာတွင် သတ်မှတ်နိုင်ပါသည်။

Attributes
  • var : ကိန်းရှင်၏ အမည်ကို သတ်မှတ်နိုင်ပါသည်။
  • target : property နှင့် အတူတွဲ၍အသုံးပြုနိုင်ပါသည်။ Map ဒါမှမဟုတ် javabean များကို အသုံးပြုသည့်အခါတွင် အသုံးပြုရန်လိုအပ်ပါသည်။ var ဒါမှမဟုတ် target တစ်ခုခုကို သုံးရန်လိုအပ်ပါသည်။
  • property : target နှင့် အတူ အသုံးပြုရသော Attribute တစ်ခုဖြစ်ပြီး၊ Map ၏ Key၊ ဒါမှမဟုတ်၊ javabean ၏ property ကို ရေးသားရန် လိုအပ်ပါသည်။
  • value : ကိန်းရှင်၏ တန်ဖိုးကို သတ်မှတ်နိုင်ပါသည်။
  • scope : ကိန်းရှင်အား အသုံးပြုမည့် Scope ကို သတ်မှတ်နိုင်ပါသည်။ အသုံးပြုနိုင်သော Scope များမှာ page, request, session, application တို့ ဖြစ်ကြပါသည်။
remove သတ်မှတ်ထားသော ကိန်းရှင်များအား ဖျက်ပစ်လိုလျှင် အသုံးပြုနိုင်ပါသည်။

Attributes
  • var : ကိန်းရှင်၏ အမည်ကို သတ်မှတ်ရန် လိုအပ်ပါသည်။
  • scope : အသုံးပြုနေသော ကိန်းရှင်၏ Scope ကို ဖော်ပြနိုင်ပါသည်။ Scope များမှာ page, request, session, application တို့ ဖြစ်ကြပါသည်။
out JSP စာမျက်နှာပေါ်တွင် စာကြောင်းတန်ဖိုးများအား ရေးထုတ်လိုပါက out tag ကို အသုံးပြုနိုင်ပါသည်။

Attributes
  • value : ဖော်ပြပေးမည့် တန်ဖိုးကို သတ်မှတ်ရန်လိုအပ်ပါသည်။
  • default : အကယ်၍ value သည် null ဖြစ်ပါက ဖော်ပြပေးမည့် တန်ဖိုးဖြစ်ပါသည်။
  • escapeXml : HTML အထူး စာလုံးများအား escape လုပ်မည် မလုပ်မည်ကို သတ်မှတ်နိုင်ပါသည်။ true ဆိုပါက HTML အထူးစာလုံးများအား အလိုအလျှောက် escape လုပ်ပေးနိုင်မည် ဖြစ်သည်။
if အနေအထားတစ်ခုအပေါ် မှုတည်၍ လုပ်ဆောင်ချက်များအား ခွဲခြားလုပ်ဆောင်စေလိုပါက if Tag ကို အသုံးပြုနိုင်ပါသည်။

Attiubutes
  • test : အနေအထား ဖော်ပြချက်ကို ရေးသားရန် လိုအပ်ပါသည်။
  • var : အနေအထားအား စမ်းစစ်၍ ရသောရလဒ်ကို သိမ်းဆည်းရန်လိုအပ်သော ကိန်းရှင်အား ရေးသားနိုင်ပါသည်။
  • scope : အသုံးပြုလိုသည့် Scope ကို ရေးသားနိုင်ပါသည်။
choose အခြေအနေ အမျိုးမျိုးပေါ်မှုတည်၍ လုပ်ဆောင်ချက်ကို အမျိုးမျိုး ပြောင်းလည်း အသုံးပြုလိုသည့် အခါတွင် choose Tag အား အသုံးပြုနိုင်ပါသည်။ choose tag အား အသုံးပြုရာတွင် when နှင့် otherwise tag များအား child tag များ အနေဖြင့် အသုံးပြုရန် လိုအပ်ပါသည်။
when choose tag ၏ child tag တစ်ခုဖြစ်ပါသည်။ အသုံးပြုလိုသည့် အခြေအနေကို ဖော်ပြရာတွင် အသုံးပြုရန် လိုအပ်ပါသည်။

Attributes
  • test : အခြေအနေ၊ အနေအထား၏ ဖော်ပြချက်ကို ရေးသားရန် လိုအပ်ပါသည်။
otherwise choose tag ၏ child tag တစ်ခု ဖြစ်ပါသည်။ when tag များတွင် ဖော်ပြခဲ့သော အခြေအနေများသည် ဖြစ်မလာခဲ့ပါက otherwise tag ၏ လုပ်ဆောင်ချက်များကို လုပ်ဆောင်သွားမည် ဖြစ်ပါသည်။
foreach Array, List, Collection အစရှိသည့် အချက်အလက် အစုအစည်းများ၏ တန်ဖိုးများအား တစ်ခုစီ လုပ်ဆောင်စေလိုသည့် အခါတွင် foreach tag ကို အသုံးပြုနိုင်ပါသည်။

Attributes
  • var : Loop အတွင်းမှ တစ်ခုချင်းသော ကိန်းရှင်။
  • items : အသုံးပြုမည့် အချက်အလက် အစုအစည်း။
  • begin : စတင် အလုပ်လုပ်စေမည့် နံပါတ်။
  • end : နောက်ဆုံးလုပ်ဆောင်စမည့် နံပါတ်။
  • step : Collection များအား လုပ်ဆောင်စေရာတွင် တစ်ကြိမ်နှင့် တစ်ကြိမ်ကြား ခြား၍ လုပ်ဆောင်ရမည့် အကြိမ်။
  • varStatus : လက်ရှိ Loop ၏ အနေအထားအား ဖော်ပြနိုင်သော Object။ ရရှိနိုင်သော အချက်အလက်များမှာ အောက်ပါအတိုင်းဖြစ်၏။
    current var attribute ဖြင့် သတ်မှတ်ထားသော ကိန်းရှင်တွင် လက်ရှိ အစားထိုးထားသော Object
    index လက်ရှိ index နံပါတ်။ (0 မှစသော နံပါတ်)
    count လက်ရှိ index နံပါတ်။ (1 မှစသော နံပါတ်)
    first လက်ရှိနံပါတ်သည် စစဦးချင်း နံပါတ်ဟုတ်မဟုတ်။ (true/false)
    last လက်ရှိနံပါတ်သည် နောက်ဆုံး နံပါတ်ဟုတ်မဟုတ်။ (true/false)
    begin begin Attribute တွင် သတ်မှတ်ထားသော တန်ဖိုး။
    end end Attribute တွင် သတ်မှတ်ထားသော တန်ဖိုး။
    step step Attribute တွင် သတ်မှတ်ထားသော တန်ဖိုး။
fortokens စာကြောင်းတစ်ခုအား စာလုံးတစ်ခုခုဖြင့် Split လုပ်ကာ၊ ရရှိလာသော ကိန်းစဉ်အား အသုံးပြု၍ အကြိမ်ကြိမ် အလုပ်လုပ်စေလိုသည့် အခါမျိုးတွင် fortokens tag ကို အသုံးပြုနိုင်ပါသည်။

Attributes
  • var : Loop အတွင်းမှ တစ်ခုချင်းသော ကိန်းရှင်။
  • items : အသုံးပြုမည့် အချက်အလက် အစုအစည်း။
  • delims : Split လုပ်ရာတွင် အသုံးပြုမည့် စကားလုံး။
  • begin : စတင် အလုပ်လုပ်စေမည့် နံပါတ်။
  • end : နောက်ဆုံးလုပ်ဆောင်စမည့် နံပါတ်။
  • step : Collection များအား လုပ်ဆောင်စေရာတွင် တစ်ကြိမ်နှင့် တစ်ကြိမ်ကြား ခြား၍ လုပ်ဆောင်ရမည့် အကြိမ်။
  • varStatus : လက်ရှိ Loop ၏ အနေအထားအား ဖော်ပြနိုင်သော Object။ ရရှိနိုင်သော အချက်အလက်များမှာ အောက်ပါအတိုင်းဖြစ်၏။
    current var attribute ဖြင့် သတ်မှတ်ထားသော ကိန်းရှင်တွင် လက်ရှိ အစားထိုးထားသော Object
    index လက်ရှိ index နံပါတ်။ (0 မှစသော နံပါတ်)
    count လက်ရှိ index နံပါတ်။ (1 မှစသော နံပါတ်)
    first လက်ရှိနံပါတ်သည် စစဦးချင်း နံပါတ်ဟုတ်မဟုတ်။ (true/false)
    last လက်ရှိနံပါတ်သည် နောက်ဆုံး နံပါတ်ဟုတ်မဟုတ်။ (true/false)
    begin begin Attribute တွင် သတ်မှတ်ထားသော တန်ဖိုး။
    end end Attribute တွင် သတ်မှတ်ထားသော တန်ဖိုး။
    step step Attribute တွင် သတ်မှတ်ထားသော တန်ဖိုး။
import အခြားသော JSP စာမျက်နှာများအား include လုပ်ရာတွင် အသုံးပြုနိုင်သော Tag တစ်ခု ဖြစ်ပါသည်။ import လုပ်မည့် Source တွင် parameter များကို အသုံးပြုလိုပါက param tag ဖြင့် တွဲဖက်အသုံးပြုနိုင်ပါသည်။

Attributes
  • url : import လုပ်မည့် source ၏ နေရာ၊ အတိအကျနေရာ ဒါမှမဟုတ် နှိုင်းယှဉ်နေရာကို အသုံးပြုနိုင်ပါသည်။
  • context : ပြင်ပ Context မှ include လုပ်ရာတွင် အသုံးပြုမည့် context ၏ အမည်။ Servlet#getContext() နှင့် အတူတူပင် ဖြစ်၏။
  • charEncoding : import လုပ်မည့် Source ၏ Encoding အား သတ်မှတ်နိုင်ပါသည်။
  • var : import ၏ ရလဒ်အား var နေရာတွင် သတ်မှတ်ရယူနိုင်ပါသည်။
  • varReader : import ၏ ရလဒ်အား သတ်မှတ်ရယူနိုင်ပါသည်။ Binary Data များအား ရလဒ်အဖြစ် ရယူရာတွင် အသုံးပြုနိုင်ပါသည်။
  • scope : အသုံးပြုမည့် Scope အား သတ်မှတ်နိုင်ပါသည်။ အသုံးပြုနိုင်သော Scope များမှာ page, request, session, application တို့ဖြစ်ကြသည်။
redirect သတ်မှတ်ထားသော Source တစ်ခုဆီသို့ လမ်းညွှန်လိုသည့် အခါတွင် အသုံးပြုနိုင်ပါသည်။ Servlet#redirect() နှင့် ဆင်တူသော လုပ်ဆောင်ချက်တစ်မျိုး ဖြစ်ပါသည်။
import tag ကဲ့သို့ပင် ပါရာမီတာများကို အသုံးပြုလိုသည့်အခါ param tag နှင့် တွဲဖက် အသုံးပြုနိုင်ပါသည်။

Attributes
  • url : လမ်းညွှန်လိုသည့် URL ကို ရေးသားရန် လိုအပ်ပါသည်။
  • context : context ၏ Path ကို ရေးသားနိုင်ပါသည်။
url URL ရှိ Source များအား Encode လုပ်လိုသည့်အခါတွင် url tag ကို အသုံးပြုနိုင်ပါသည်။ url tag တွင်လည်း param tag ကို အသုံးပြုနိုင်ပါသည်။

Attributes
  • url : Encode လုပ်မည့် URL။
  • context : Context ၏ Path။
  • var : Encode ရလဒ်အား အစားထိုးမည့် ကိန်းရှင်၏ အမည်။
  • scope : အသုံးပြုမည့် Scope အား သတ်မှတ်နိုင်ပါသည်။ အသုံးပြုနိုင်သော Scope များမှာ page, request, session, application တို့ဖြစ်ကြ၏။ ဘာမှမသတ်မှတ်ထားပါက Default အနေဖြင့် page Scope ကို သတ်မှတ်သွားမည် ဖြစ်သည်။
param param tag အား အထက်ပါ import, redirect, url tag များ၏ child tag အနေဖြင့် အသုံးပြုနိုင်ပါသည်။

Attributes
  • name : ပါရာမီတာ၏ အမည် ဖြစ်၏။
  • value : ပါရာမီတာ၏ တန်ဖိုးဖြစ်၏။
catch JSP စာမျက်နှာများအတွင်း Exception များဖြစ်ပေါ်လာပါက catch tag များကို အသုံးပြု၍ control လုပ်နိုင်ပါသည်။

Attributes
  • var : ဖြစ်ပေါ်လာသည့် Exception Object အား အစားထိုးမည့် ကိန်းရှင် အမည်။


XML သုံးလိုင်ဘရီ၏ Tag များ


Tag အမည် ရှင်းလင်းချက်
choose
foreach
if
otherwise
out
param
parse
set
transform
when


Locale သုံးလိုင်ဘရီ၏ Tag များ


Tag အမည် ရှင်းလင်းချက်
bundle
formatDate
formatNumber
message
param
parseDate
parseNumber
requestEncoding
setBundle
setLocale
setTimeZone
timeZone


အခြေခံ လိုင်ဘရီများ


Tag အမည် ရှင်းလင်းချက်
dateParam
param
query
setDataSource
setTransaction
update
JSTL Tag များအား အသုံးပြုပုံ


JSP စာမျက်နှာထဲတွင် JSTL tag များအား အသုံးပြုရန်မှာ မိမိ၏ Web Application အတွင်းတွင် jstl 1.2 အား lib အဖြစ်ဖြည့်စွက်ရန်လိုအပ်ပါသည်။ အချို့သော Application Server များတွင် jstl ကို အသင့်ပြင်ဆင် ထားတတ်ခြင်း၊ အချို့သော web profile များတွင် ကြိုတင်ဖြည့်စွက်ထားတတ်ခြင်းများ ရှိတတ်သည်။ ဤနေရာတွင် jstl အား မိမိ၏ lib ထဲထည့်ကာ အသုံးပြုသည့်နည်းကို ဖော်ပြသွားပါမည်။

jstl jar ဖိုင်အား java.net မှ ဒေါင်းလုဒ်လုပ်ယူနိုင်ပါသည်။ (http://jstl.java.net/download.html)




ဒေါင်းလုဒ်လုပ်ပြီးပါက အထက်ပါပုံအတိုင်း WEB-INF/lib အောက်တွင် import လုပ်ရန်လိုအပ်ပါသည်။ ဤကဲ့သို့ WEB-INF/lib အောက်တွင် ထားရှိခြင်းအားဖြင့် jstl tag lib အား web application အတွင်းရှိ JSP များမှ အသုံးပြုနိုင်မည် ဖြစ်သည်။

Jsp အတွင်းမှ JSTL ကို အသုံးပြုနိုင်ရန်မှာ ယခင်တစ်ခေါက် ဖော်ပြခဲ့သော Directives မှ Taglib Directive ကို အသုံးပြု၍ အသုံးပြုလိုသည့် JSTL lib ကို ကြိုတင်ဖော်ပြထားရန် လိုအပ်ပါသည်။ အမှန်ဆိုလျှင် ပြီးခဲ့သော နမှုနာထဲမှစ၍ JSTL Tag အချို့ကို အသုံးပြု၍ရေးသားခဲ့ပါသည်။ ယခုတစ်ခေါက်တွင်လည်း ပြီးခဲ့သော နမှုနာကို အသုံးပြု၍ သုံးလို့ရတဲ့ နေရာတွေမှာ JSTL Tag များကို အသုံးပြုကာ ရှင်းလင်းသွားပါမည်။



နမှုနာ အပလီ၏ ပြောင်းလည်းထားပုံ


JSTL ကို မဖော်ပြခင် ယခုတစ်ခေါက် နမှုနာ၏ ပြုပြင်ပြောင်းလည်းထားပုံကို ဦးစွာဖော်ပြပါမည်။
ယခုတစ်ခေါက်တွင် Servlet ကိုလည်း အသစ်ပြုပြင်ရေးသားထား၏။ ယခင်ကဆိုလျှင် Servlet အတွင်းတွင် လုပ်ဆောင်ချက်ပြီး၍ ဖော်ပြလိုသော JSP ဆီသို့ လမ်းညွှန်ရာတွင် တိုက်ရိုက် ရေးသားနေခဲ့ရ၏။ ထို့ကြောင့် လော့ဂျစ်အသစ် တစ်ခု ဖြည့်စွက်တိုင်း၊ ပြုပြင်လိုသည့်အခါတိုင်း Servlet ကို ပြုပြင်ရန်လိုအပ်နေခဲ့သည်။ ထို့အတွက် Request နှင့် ဖော်ပြမည့် Jsp ကို ပူတွဲထားသော flows.properties ကို ရေးသားကာ၊ Servlet အတွင်းမှ ထို flow ကိုကြည့်၍ သင့်တော်သော Jsp ကို လမ်းညွှန်ရန် ပြုပြင်ထား၏။ ထို့ကြောင့် Flow ပြောင်းလိုပါက flows.properties ကို ပြောင်းလည်းရုံသာ ဖြစ်မည်။

com.mmju.jsp.ep4.BLController.java
 @SuppressWarnings("unchecked")
 @Override
 public void init() throws ServletException {

  flowsProp = new Properties();

  try {
   InputStream in = getServletContext().getResourceAsStream(
     "/WEB-INF/conf/flows.properties");
   flowsProp.load(in);

   ObjectInputStream os = new ObjectInputStream(new FileInputStream(
     getObjPath()));
   this.carList = (List<Car>) os.readObject();

   super.init();
  } catch (Exception e) {
   this.carList = new ArrayList<Car>();
  }
 }

 @Override
 protected void doGet(HttpServletRequest req, HttpServletResponse resp)
   throws ServletException, IOException {

  String action = this.getKey(req.getRequestURI());

  if ("list".equals(action)) {
   this.showCarList(req, resp);
  } else if ("add".equals(action)) {
   this.addCar(req, resp);
  } else if ("confirm".equals(action)) {
   this.comfirm(req, resp);
  }

  this.getDispetcher(req.getRequestURI()).forward(req, resp);
 }

 private RequestDispatcher getDispetcher(String reqInfo) {
  if (null != reqInfo && !reqInfo.isEmpty()) {
   String[] infos = reqInfo.split("/");
   StringBuilder sb = new StringBuilder("/jsp");
   for (int i = 0; i < infos.length; i++) {

    if (infos[i].length() > 0) {
     sb.append("/");
     if (infos.length - 1 == i) {
      String key = infos[i].replace(".ep4", "");
      sb.append(flowsProp.getProperty(key));
     } else {
      sb.append(infos[i]);
     }
    }
   }
   return getServletContext().getRequestDispatcher(sb.toString());
  }
  return null;
 }

အထက်ပါ ကုဒ်ထဲတွင် ဖော်ပြခဲ့သည့်အတိုင်း စာကြောင်း ၈မှ ၁၀ဖြင့် flowsProp ထဲတွင် flows.properties ကို ခေါ်ယူထားပြီး၊ နောက်ဆုံး စာကြောင်း ၃၆တွင် Dispatch လုပ်လိုသည့်အခါတွင် getDispetcher ကို ခေါ်ယူပြီး၊ စာကြောင်း ၄၉ဖြင့် သင့်တော်သော မျက်နှာကို ခေါ်ယူပြီး Dispatcher ကို ပြန်ပို့ပေးနေခြင်း ဖြင့် Request အပေါ်မှုတည်၍ သင့်တော်သော စာမျက်နှာကို ဖော်ပြပေးနိုင်ခြင်း ဖြစ်ပါသည်။

/WEB-INF/web.xml
  <servlet>
  <servlet-name>episode4</servlet-name>
  <servlet-class>com.mmju.jsp.ep4.BLController</servlet-class>
  <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
  <servlet-name>episode4</servlet-name>
  <url-pattern>*.ep4</url-pattern>
  </servlet-mapping>

အထက်ပါအတိုင်း web.xml ၏ servlet သတ်မှတ်ချက်တွင် BLController.java ၏ url-pattern အား *.ep4 ဟု ရေးသားထားခြင်းဖြင့် Request URL ၏ နောက်ဆုံးတွင် .ep4 ကို ရေးသားထားပါက BLController ကို ခေါ်ယူမည် ဖြစ်၏။

/WEB-INF/conf/flows.properties
#controller=targetView
add=list.jsp
list=list.jsp
edit=new.jsp
confirm=confirm.jsp
delete=list.jsp

တဖန် flows.properties ထဲတွင် request အမည်နှင့် ဖော်ပြရမည့် jsp ကို ပူးတွဲထားပါသည်။

/page/episode4.html
<H3 id="title">Episode 4 : JSTL</h3>
<div style="padding-left:20px">
<ul>
   <li><a href="/episode4/list.ep4">ကားစာရင်း</a></li>
   <li><a href="/episode4/edit.ep4">ကားအသစ်သွင်းရန်</a></li>
</ul>
</div>

ဤနည်းအားဖြင့် /episode4/list.ep4 ဟု ရေးသားထားခြင်းဖြင့် BLController ကို ခေါ်မည်ဖြစ်သည်။ BLController#getDispetcher လုပ်ဆောင်ချက်ကြောင့် /jsp/episode4/list.jsp ကို ဖော်ပြပေးနိုင်သော RequestDispatcher ကို ရရှိမည်ဖြစ်ပြီး၊ ရလဒ်အား/jsp/episode4/list.jsp view ကို အသုံးပြု၍ ဖော်ပြပေးနိုင်မည် ဖြစ်ပါသည်။


ကားစာရင်းသွင်းရန်စာမျက်နှာ


Web Application များတွင် အတွေ့များသော Create လုပ်သည့် စာမျက်နှာဖြစ်သည်။ ဘလောဂ်ဆိုပါက Post လုပ်သည့်နေရာ၊ comment ရေးသည့်နေရာ၊ စာရင်းတစ်ခုခု အသစ်သွင်းရသည့် စာမျက်နှာ ဖြစ်ပါသည်။

/jsp/episode4/new.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
 pageEncoding="utf-8"%>
<%@ taglib uri='http://java.sun.com/jsp/jstl/core' prefix='c'%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<c:import url="/jsp/header.jsp"></c:import>
</head>
<body>
 <div style="width: 100%; text-align: right">
  <a href="javascript:history.back();">ယခင် စာမျက်နှာသို့</a>
 </div>
 <h3>ကားအသစ် စာရင်းသွင်းရန်</h3>
 <div id="left">
  <c:out value="${param.error_message}" />
  <form action="/episode4/confirm.ep4" method="post">
   <table>
    <tr>
     <td width="180px">ကားအမည်</td>
     <td><input type="text" name="model"></input></td>
    </tr>
    <tr>
     <td>ကားကုမ္ပဏီ</td>
     <td><input type="text" name="brand"></input></td>
    </tr>
    <tr>
     <td>ထုတ်လုပ်သည့်နှစ်</td>
     <td><input type="text" name="year"></input></td>
    </tr>
    <tr>
     <td></td>
     <td><input type="submit" value="စာရင်းသွင်းမည်"></input></td>
    </tr>
   </table>
  </form>
 </div>
 
 <c:import url="../episode3/ep3-14.jsp">
  <c:param name="p" value="11"></c:param>
 </c:import>
</body>
</html>
စာကြောင်း နံပါတ် ၃ တွင် taglib directive ကို အသုံးပြု၍၊ jstl ၏ core လိုင်ဘရီကို အသုံးပြုရန် ဖော်ပြထားပါသည်။ ဤနည်းအားဖြင့် ဤစာမျက်နှာထဲတွင် <c: ကို အစပြုသော tag များကို အသုံးပြုနိုင်ပါသည်။

စာကြောင်း ၇ နှင့် ၃၈တို့တွင် အသီးသီး <c:import> Tag ကို အသုံးပြု၍ ပြင်ပမှာ jsp များအား import လုပ်နေပါသည်။

တဖန် စာကြောင်း ၁၅ တွင် <c:out value="${param.error_message}" /> ဟု ရေးသားထားပြီး၊ အကယ်၍ request parameter ထဲတွင် error_message ကို အသုံးပြုထားပါက ဤနေရာတွင် ဖော်ပြရန် ရေးသားထားပါသည်။

ဤစာမျက်နှာ၏ အဓိကမှာ post method ကို အသုံးပြုထားသော form ဖြစ်ပြီး အတွင်းတွင်၊ model, brand, year အမည်ရသော input tag များပါဝင်ပါသည်။ ထို from အား commit လုပ်ပါက၊ အလုပ်လုပ်စေမည်မှာ action attribute အတွင်းရှိ /episode4/confirm.ep4 ဖြစ်ပါသည်။


ရေးသားထားသည့်အတိုင်း စာရင်းသွင်းမည် မသွင်းမည် မေးမြန်းသည့် စာမျက်နာ


.ep4 ဖြင့်ဆုံးသောကြောင့် BLController#doPost ကို ခေါ်ယူမည် ဖြစ်ပါသည်။ ဤ servlet တွင် doPost သည် doGet ကို ခေါ်ယူနေခြင်းသာဖြစ်သောကြောင့် doGet ကို ခေါ်ယူမည် ဖြစ်၏။

တဖန် request ၏ အမည်သည် comfirm ဖြစ်သောကြောင့် doGet အတွင်းတွင် BLController#comfirm ကို ခေါ်ယူပြီး၊ နောက်ဆုံးတွင် ရလဒ်အား /jsp/episode4/comfirm.jsp ဖြင့် ဖော်ပြပေးမည် ဖြစ်သည်။

BLController#comfirm
 private void comfirm(HttpServletRequest req, HttpServletResponse resp)
   throws ServletException, IOException {
  HttpSession session = req.getSession(true);
  session.removeAttribute("new_car");
  Car car = new Car();
  car.setBrand(req.getParameter("brand"));
  car.setModel(req.getParameter("model"));
  car.setYear(req.getParameter("year"));
  session.setAttribute("new_car", car);
 }
ဤလုပ်ဆောင်ချက်အတွင်းတွင် session အတွင်းရှိ new_car attribute အား ဖျက်ပစ်ပါသည်။ ပြီးပါက Car Object အား instanciate လုပ်ပြီး request အတွင်းမှ ပါရာမီတာများအား HttpServletRequest#getParameter ဖြင့် ရယူပြီး Car ၏ တန်ဖိုးများအား set လုပ်စေပါသည်။ နောက်ဆုံးတွင် session အတွင်း၌ new_car အမည်ဖြင့် သိမ်းဆည်းထားလိုက်ပါသည်။

BLController#comfirm အပြီး၊ /jsp/episode4/comfirm.jsp ကို အသုံးပြု၍ ရလဒ်ကို ဖော်ပြနေစေပါသည်။

/jsp/episode4/comfirm.jsp
<%@page import="com.mmju.jsp.ep2.Car"%>
<%@ page language="java" contentType="text/html; charset=utf-8"
 pageEncoding="utf-8"%>
<%@ taglib uri='http://java.sun.com/jsp/jstl/core' prefix='c'%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<c:import url="/jsp/header.jsp"></c:import>
</head>
<body>
 <div style="width: 100%; text-align: right">
  <a href="javascript:history.back();">ယခင် စာမျက်နှာသို့</a>
 </div>
 <h3>စာရင်းသွင်းရန် ကား</h3>

 <div id="left">
  <form action="/episode4/add.ep4" method="post">
   <table>
    <tr>
     <td width="180px">ကားအမည်</td>
     <td><c:out value="${sessionScope.new_car.model }" /></td>
    </tr>
    <tr>
     <td>ကားကုမ္ပဏီ</td>
     <td><c:out value="${sessionScope.new_car.brand }" /></td>
    </tr>
    <tr>
     <td>ထုတ်လုပ်သည့်နှစ်</td>
     <td><c:out value="${sessionScope.new_car.year }" /></td>
    </tr>
    <tr>
     <td colspan="2"><input onclick="javascript:history.back();"
      type="button" value="ပြန်ပြင်မည်" /> <input type="submit"
      value="စာရင်းသွင်းမည်" /></td>
    </tr>
   </table>
  </form>
 </div>
 <c:import url="../episode3/ep3-14.jsp">
  <c:param name="p" value="10"></c:param>
 </c:import>
</body>
</html>

ဤစာမျက်နှာအတွင်းတွင် စာကြောင်း ၂၂၊ ၂၆ နှင့် ၃၀တို့တွင် sessionScope အတွင်းမှ new_car အမည်ရှိ Object ၏ တန်ဖိုးများအား အသီးသီး <c:out> Tag ကို အသုံးပြု၍ ဖော်ပြနေပါသည်။ စာရင်းသွင်းမည် ခလုပ်ကိုနှိပ်ပါက /episode4/add.ep4 ကို submit လုပ်မည်ဖြစ်သည်။



စာရင်းသွင်းခြင်း


အထက်ပါအတိုင်း /episode4/add.ep4 ဟု submit လုပ်သောကြောင့်၊ BLController#addCar ကို ခေါ်ယူမည်ဖြစ်ပြီး၊ ရလဒ်အား /jsp/episode4/list.jsp ဖြင့် ဖော်ပြပေးမည် ဖြစ်ပါသည်။

BLController#addCar
  /**
  * Check the car to add, and if the car is not on the list<br />
  * Add this car to list and show the car list.
  * 
  * @param req
  * @param resp
  * @throws ServletException
  * @throws IOException
  */
 private void addCar(HttpServletRequest req, HttpServletResponse resp)
   throws ServletException, IOException {
  boolean isNew = true;
  HttpSession session = req.getSession(true);
  Car inCar = (Car) session.getAttribute("new_car");

  if (null != inCar) {
   for (Car car : this.carList) {
    if (car.getBrand().equals(inCar.getBrand())
      && car.getModel().equals(inCar.getModel())
      && car.getYear().equals(inCar.getYear())) {
     isNew = false;
    }
   }

   if (isNew) {
    this.carList.add(inCar);
    this.save();
   }
  }

  req.setAttribute(CAR_LIST, this.carList);
 }
addCar လုပ်ဆောင်ချက်၏ စာကြောင်း ၁၄တွင် session အတွင်းရှိ new_car ကို ခေါ်ယူပြီး၊ စာကြောင်း ၁၇မှစ၍ ကားလစ်အတွင်းတွင် ရှိမရှိ စမ်းစစ်ပါသည်။ ကားအသစ်ဖြစ်ပါက စာကြောင်း ၂၆၊ ၂၇ဖြင့် ကားလစ်အတွင်း ဖြည့်စွက်၍ သိမ်းဆည်းပါသည်။

နောက်ဆုံးတွင် HttpServletRequest#setAttribute ကို အသုံးပြုကာ ကားလစ်အား request အတွင်း ဖြည့်စွက်လိုက်ပါသည်။

နောက်ဆုံးတွင် /jsp/episode4/list.jsp ကို အသုံးပြု၍ အထက်ပါ ရလဒ်အား ဖော်ပြစေပါသည်။

/jsp/episode4/list.jsp
<%@page import="com.mmju.jsp.ep2.Car"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=utf-8"
 pageEncoding="utf-8"%>
<%@ taglib uri='http://java.sun.com/jsp/jstl/core' prefix='c'%>
<%@ taglib uri='http://java.sun.com/jsp/jstl/functions' prefix='fn'%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<c:import url="/jsp/header.jsp"></c:import>
</head>
<body>

 <c:if test="${fn:length(car_list) == 0}">
  <c:redirect url="/episode4/edit.ep4">
   <c:param name="error_message"
    value="There is No Car in the List! Please add the car."></c:param>
  </c:redirect>
 </c:if>

 <div style="width: 100%; text-align: right">
  <a href="javascript:history.back();">ယခင် စာမျက်နှာသို့</a>
 </div>
 <h3>ကားစာရင်း</h3>

 <div id="left">
  <table class="lineTbl">
   <thead>
    <tr>
     <td>ကားကုမ္ပဏီ</td>
     <td>ကားအမျိုးအစား</td>
     <td>ထုတ်လုပ်သည့်နှစ်</td>
    </tr>
   </thead>
   <tbody>
    <c:forEach items="${car_list}" var="car">
     <tr>
      <td><c:out value="${car.brand }" /></td>
      <td><c:out value="${car.model}" /></td>
      <td><c:out value="${car.year }" /></td>
     </tr>
    </c:forEach>
   </tbody>
  </table>
 </div>

 <c:import url="../episode3/ep3-14.jsp">
  <c:param name="p" value="10"></c:param>
 </c:import>

</body>
</html>
list.jsp ၏ စာကြောင်း ၁၅ နှင့် ၁၆ တွင် <c:if> နှင့် <c:redirect> Tag များအား အသုံးပြု၍ request အတွင်းရှိ car_list အတွင်းတွင် ကားမရှိပါက /episode4/edit.ep4 အား redirect လုပ်နေပါသည်။ တဖန် ပါရာမီတာအဖြစ် စာကြောင်း ၁၇ တွင် error_message ကို ဖြည့်စွက်နေပါသည်။

ထို့ကြောင့် car_list အတွင်းတွင် ကားမရှိပါက edit.jsp တွင် error_message ကို ဖော်ပြပြီး ကားသွင်းရန် စာမျက်နှာကို ဖော်ပြပေးမည် ဖြစ်သည်။

အကယ်၍ ကားလစ်အတွင်းတွင် ကားရှိခဲ့ပါက redirect ကို မလုပ်ပဲ အောက်ရှိ စာမျက်နှာများကို ဖော်ပြသွားမည် ဖြစ်သည်။ စာကြောင်း ၃၇မှ ၄၂တွင် <c:foreach> ကို အသုံးပြု၍ ကားလစ်အတွင်းရှိ ကားများအား တစ်စီးခြင်း ဖော်ပြသွားမည် ဖြစ်ပါသည်။



ပြန်လှန်သုံးသပ်ချက်


ကျွှန်တော်တို့သည် ဤတစ်ခေါက်ဘလောဂ်ဖြင့် JSTL tag များအကြောင်းကို လေ့လာခဲ့ပြီး၊ နမှုနာ အပလီကေးရှင်းအား အသုံးပြုကာ jstl tag များ၏ အသုံးပြုပုံကို လေ့လာခဲ့၏။ jstl tag များကို အသုံးပြုခြင်းအားဖြင့် jsp အတွင်းjava code များအား တိုက်ရိုက် ရေးသားရန်မလိုအပ်ပါသဖြင့် အမြင်ရှင်း၍ နားလည်ရ လွယ်ကူစေသည်ကို တွေ့ရပါသည်။ တဖန် ဤနမှုနာတွင်လည်း ဤခေါင်းစဉ်တွင် မဖော်ပြရသေးသော EL (Expression Language) ၏ ရေးသားပုံကို အသုံးပြုထားပါသည်။

JSTL 1.2 မှစ၍ EL ကို အသုံးပြုနိုင်ပါသဖြင့် အမြင်ရှင်းသော EL ရေးသားပုံကို အသုံးပြုထားခြင်း ဖြစ်၏။ နောက်အခန်းတွင် ဆက်လက်၍ EL ရေးသားပုံ အကြောင်းကို ရေးသားသွားပါမည်။

နမှုနာ အပလီကေးရှင်းကို http://jsp-tutorials.minlwin.cloudbees.net/ တွင် လက်တွေ့ စမ်းသပ် လေ့လာနိုင်ပါသည်။

လေးစားစွာဖြင့်။
မင်းလွင်


No comments:

Post a Comment