September 5, 2020

Conversions

JSF Framework ကို အသုံးပြုနေတယ်ဆိုပေမဲ့ နောက်ကွယ်မှာတော့ Servlet ကိုသာ အသုံးပြုနေတာ ဖြစ်ပါတယ်။ JSF Framework ဖြစ်တဲ့ FacesServlet ဟာ Servlet တစ်ခုဖြစ်ပြီး Type 2 MVC ရဲ့ Front End Controller ကို ကိုယ်စားပြုပြီးရေးသားထားတာ ဖြစ်ပါတယ်။

Request တွေမှန်သမျှဟာ Front End Controller ဖြစ်တဲ့ FacesServlet ထဲကို ရောက်ရှိလာကြမှာ ဖြစ်ပါတယ်။ HTTP Servlet Request ရဲ့ Request Parameter တွေအားလုံးဟာ String Type အနေနဲ့ ရောက်ရှိလာမှာ ဖြစ်တဲ့ အတွက် JSF Framework ထဲရောက်လာတဲ့ အခါမှာ Model ထဲမှာ သတ်မှတ်ရေးသားထားတဲ့ Java Data Type တွေအဖြစ်ပြန်ပြီးပြောင်းလဲဖို့ လိုအပ်ပါတယ်။

တဖန် JSF Framework ကနေ Response ပြန်တော့မယ်ဆိုရင်လဲ View Object တွေကနေ HTML အဖြစ်ပြောင်းပြီး HTTP Servlet Response အဖြစ်ပြောင်းပေးဖို့လိုအပ်ပါတယ်။ ဒီနေရရာမှာလဲ HTML မှာ String တွေကိုသာ ဖေါ်ပြနိုင်တာ ဖြစ်တဲ့ အတွက် Model ထဲမှာရှိတဲ့ Java Data Type Value တွေကို String အဖြစ်ပြောင်းဖို့လိုအပ်ပါတယ်။

Request ရောက်လာတဲ့အခါ Request Parameter တွေကို String ကနေ သက်ဆိုင်ရာ Java Data Type တွေအဖြစ်ပြောင်းဖို့၊ တဖန် Response ကို Create လုပ်တဲ့ နေရာမှာလဲ Component Value တွေကို Java Data Type တွေကနေ String အဖြစ်ပြောင်းဖို့ Conversion တွေကို လုပ်ဆောင်စေတာဖြစ်ပါတယ်။

JSF Framework မှာ Conversion ကို လုပ်ဆောင်ဖို့အတွက် Build In Converters တွေကို ပြင်ဆင်ပေးထားသလို လိုအပ်လာရင် Custom ရေးသားနိုင်ဖို့ အတွက် Custom Converter တွေကိုလဲ ရေးသားနိုင်အောင် ပြင်ဆင်ပေးထားပါတယ်။

Build In Converters

JSF Framework တွေမှာရှိတဲ့ Component တွေဟာ View မှာရှိတဲ့ တန်ဖိုးတွေနဲ့ Model ထဲမှာရှိတဲ့ တန်ဖိုးတွေကို အလို်အလျောက် ပြောင်းပေးနိုင်အောင် ပြင်ပေးထားပါတယ်။ ဥပမာအားဖြင့် UISelectBoolean Component ရဲ့ value မှာ Model ထဲမှာရှိတဲ့ Boolean Type Variale နဲ့ Bind လုပ်ထားတယ်ဆိုရင် Request Parameter ထဲမှာရှိတဲ့ String တန်ဖိုးကနေ Boolean အဖြစ် ပြောင်းပေးနိုင်သလို၊ Model ထဲက Boolean တန်ဖိုးအလိုက် HTML မှာပြမည့် တန်ဖိုးကို ပြသပေးနိုင်ပါတယ်။

ဒီလိုဖေါ်ပြပေးနိုင်အောင် JSF Implementation တွေမှာ Standard Converter တွေကို ရေးသားပေး ထားကြပါတယ်။ JSF Standard Converter တွေကို javax.faces.convert Package အောက်မှာ ထားရှိပါတယ်။

Converter Converter ID
BigDecimalConverter javax.faces.BigDecimal
BIgIntegerConverter javax.faces.BigInteger
BooleanConverter javax.faces.Boolean
ByteConverter javax.faces.Byte
CharacterConverter javax.faces.Character
DateTimeConverter javax.faces.DateTime
DoubleConverter javax.faces.Double
EnumConverter javax.faces.Enum
FloatConverter javax.faces.Float
IntegerConverter javax.faces.Integer
LongConverter javax.faces.Long
NumberConverter javax.faces.Number
ShortConverter javax.faces.Short

အထက်ပါ Standard Converter ထဲမှာ DateTimeConverter နဲ့ NumberConverter တွေမှာ သူတို့ရဲ့ ကိုယ်ပိုင် Tags တွေကိုပိုင်ဆိုင်ကြပါတယ်။ သတ်မှတ်ထားတဲ့ Attribute တွေကို အသုံးပြုပြီး လိုအပ်သလို Format လုပ်တာတွေကို လုပ်ဆောင်နိုင်မှာ ဖြစ်ပါတယ်။ <f:convertDateTime /> နဲ့ <f:convertNumber /> Tags တွေကို အသုံးပြုပြီးရေးသားကြရမှာ ဖြစ်ပါတယ်။ တဖန် မိမိကိုယ်ပိုင် Custom Converter တွေကို ရေးသားအသုံးပြုချင်ရင်တော့ <f:converter /> ကို အသုံးပြုပြီး ရေးသားနိုင်ပါတယ်။


Using Standard Converter

မိမိရေးသားထားတဲ့ Component တွေမှာ Converter တွေကို အသုံးပြုလိုတယ်ဆိုရင် UI Component ရဲ့ converter attribute မှာလဲ အသုံးပြုလိုတဲ့ Converter ID ကို သတ်မှတ်ရေးသားနိုင်သလို၊ Nested Converter Tag ကို အသုံးပြုပြီးလဲ ရေးသားနိုင်ပါတယ်။

private BigInteger data;

public BigInteger getData() {
    return data;
}

public void setData(BigInteger data) {
    this.data = data;
}

UI Component ရဲ့ Value နဲ့ Bind လုပ်ဖို့အတွက် Backing Bean ရဲ့ Instance Variable မှာ Getter Setter တွေ ရေးသားထားဖို့လိုအပ်ပါတယ်။


အထက်ပါအတိုင်း <h:inputText /> Component ရဲ့ converter attribute မှာ Backing Beans ထဲမှာ Bind လုပ်မည့် Data Type ရဲ့ Converter ID ကို ရေးသားပေးရမှာ ဖြစ်ပါတယ်။


    

တဖန် <f:converter /> Tag ကို Input Text Component ရဲ့ Nested Tag အနေနဲ့ သတ်မှတ်ရေးသား အသုံးပြုနိုင်ပါတယ်။


    

Conversion Error ဖြစ်လာတဲ့ အခါမှာ Error Message ကို Custom ရေးသားလိုပါက Input Text Component ရဲ့ converterMessage Attribute မှာ သတ်မှတ်ရေးသားနိုင်မှာ ဖြစ်ပါတယ်။


Using Date Time Converter

Date, Calendar, Date Time တွေကို Component Data တွေမှာ အသုံးပြုလိုတယ်ဆိုရင် <f:convertDateTime /> Tag ကို အသုံးပြုရမှာ ဖြစ်ပါတယ်။

private LocalDate localDate = LocalDate.now();

public LocalDate getLocalDate() {
    return localDate;
}

public void setLocalDate(LocalDate localDate) {
    this.localDate = localDate;
}

အထက်ပါနမူနာမှာတော့ Java 8 ရဲ့ Date Time API ထဲက LocalDate ကို Model Data Type အနေနဲ့ အသုံးပြုထားပါတယ်။


    

LocalDate ကို အသုံးပြုထားတယ်ဆိုရင် type Attribute မှာ localDate လို့ ရေးသားဖေါ်ပြရန်လိုအပ်ပြီး၊ pattern attribute မှာတော့ မိမိဖေါ်ပြလိုတဲ့ Date Pattern ကို ရေးသားရမှာ ဖြစ်ပါတယ်။ Render Response Phase ရောက်ပြီး Component Value ကနေ HTML အဖြစ် ပြောင်းတဲ့ အခါမှာ သတ်မှတ်ထားတဲ့ Pattern အတိုင်း String အဖြစ် Format ချပြီး ပြန်ပေးမှာ ဖြစ်ပါတယ်။


    

အထက်ပါအတိုင်း Date Time Converter ကို UI Input Component ဖြစ်တဲ့ Tag မှာ တွဲဖက် ရေးသားထားတယ်ဆိုရင် Process Validation Phase မှာ Request Parameter ထဲကနေ ပါလာတဲ့ String တန်ဖိုးကနေ LocalDate အဖြစ် သတ်မှတ်ထားတဲ့ Pattern နဲ့ Parse လုပ်ပေးနိုင်မှာ ဖြစ်သလို၊ Render Response Phase မှာလဲ LocalDate ကနေ String အဖြစ် သတ်မှတ်ထားတဲ့ Pattern နဲ့ Formmat လုပ်ပေးနိင်မှာ ဖြစ်ပါတယ်။

Conversion မှာ Error ဖြစ်တဲ့ အခါ Custom Error Message ကို ရေးသားလိုတယ်ဆိုရင် အသုံးပြုမည့် UI Component ရဲ့ converterMessage attribute မှာ သတ်မှတ်ရေးသားနိုင်ပါတယ်။


Attribute of Date Time Converter

Date Time Converter တွေဟာ type, pattern တို့လို ကိုယ်ပိုင် Attribute တွေပါဝင်ပြီး Developer တွေကနေ Convert လုပ်တဲ့ အခါ Format လုပ်တဲ့အခါ ဘယ်လို လုပ်ရမယ်ဆိုတာကို သတ်မှတ်နိုင်အောင် ပြင်ဆင်ပေးထားပါတယ်။ Date Time Converter မှာ ပါဝင်တဲ့ Attribute တွေကတော့ အောက်ပါ အတိုင်း ဖြစ်ပါတယ်။

Attribute Type Description
binding DateTimeConverter Backing Bean Property နဲ့ Bind လုပ်လိုတဲ့ အခါ Unified EL Expression နဲ့ ရေးသားရပါမယ်။
dateStyle String Date Format ကို သတ်မှတ်လိုတဲ့ အခါမှာ ရေးသားရပါမယ်။
“default”, “short”, “medium”, “long”, “full” တို့ကို သတ်မှတ် ရေးသားနိုင်ပါတယ်။ ဘာမှ မရေးထားရင် “default” ကို အသုံးပြုပါမယ်။
for String Composite Component တွေမှာ Converter ကို အသုံးပြုလိုတဲ့ အခါ အသုံးပြုလိုတဲ့ Composite Component ထဲက Tag ကို သတ်မှတ်ရေးသားပေးရမှာ ဖြစ်ပါတယ်
locale String or Locale အသုံးပြုလိုတဲ့ Locale ကို သတ်မှတ်ရေးသားပေးရမှာ ဖြစ်ပါတယ်။ ဘာမှ မရေးထားရင်တော့ FacesContext ရဲ့ getLocale() Method ကနေရတဲ့ Locale ကို အသုံးပြုသွားမှာ ဖြစ်ပါတယ်
pattern String Custom Date Format ကို ရေးသားလိုတဲ့ အခါမှာ Pattern ကို ရေးသားနိုင်ပါတယ်။ Pattern ကို ရေးသားထားမယ်ဆိုရင် dateStyle, timeStyle မှာ ရေးသားထားတာတွေကို Ignore လုပ်သွားပါမယ်
timeStyle String Date Format ကို သတ်မှတ်လိုတဲ့ အခါမှာ ရေးသားရပါမယ်။
“default”, “short”, “medium”, “long”, “full” တို့ကို သတ်မှတ် ရေးသားနိုင်ပါတယ်။ ဘာမှ မရေးထားရင် “default” ကို အသုံးပြုပါမယ်။
timeZone String or TimeZone အသုံးပြုလိုတဲ့ Time Zone ကို သတ်မှတ်ရေးသား နိုင်ပါတယ်။
type String Parse ဒါမှမဟုတ် Format လုပ်တဲ့ အခါမှာ အသုံးပြု မည့် Type ကို ရေးသားပေးရပါမယ်။
both, date, time, localDate, localDateTime, localTime, offsetTime, offsetDateTime, or zonedDateTime ကို အသုံးပြုနိုင်ပါတယ်။

Using Number Converter

Component Value တွေနဲ့ java.lang.Number Type ကို Convert လုပ်ပြီး အသုံးပြုလိုတဲ့ အခါမှာ <f:convertNumber /> Tag ကို အသုံးပြုနိုင်ပါတယ်။

private long number = 10000;

public long getNumber() {
    return number;
}

public void setNumber(long number) {
    this.number = number;
}

အထက်နမူနာမှာတော့ Backing Bean ထဲမှာ long type Variable တစ်ခုကို ရေးသားထားပြီး Number Converter ကို နဲ့ Conversion ကို ပြုလုပ်သွားမှာ ဖြစ်ပါတယ်။ UI Output Component အတွက်ဆိုရင်တော့ Getter တစ်ခုသာလိုအပ်ပေမဲ့၊ UI Input Component တွေနဲ့ Bind လုပ်မယ် ဆိုရင်တော့ Getter ကော Setter ပါ ရေးသားထားဖို့လိုအပ်ပါတယ်။


    

အထက်ပါအတိုင်း <f:convertNumber /> Tag ရဲ့ pattern နေရာမှာ “$ #,##0” လို့ ရေးသားထားတဲ့ အတွက် Output ပြတဲ့ အခါမှာ အောက်ပါအတိုင်း ဖေါ်ပြသွားမှာ ဖြစ်ပါတယ်။

	$ 10,000

တဖန် Number တွေကို Currency Type အနေနဲ့ သတ်မှတ်ရေးသားလိုတဲ့ အခါမျိုးတွေမှာလဲ အောက်ပါ အတိုင်း ရေးသားနိုင်ပါတယ်။


    

Type Attribute မှာ “currency” လို့ ရေးသားပြီး currencyCode ဒါမှမဟုတ် currencySymbol နေရာမှာ မိမိအသုံးပြုလိုတဲ့ Currency ကို သတ်မှတ်ရေးသားနိုင်ပါတယ်။


Attributes of Nummber Converter

Number Converter မှာလဲ ကိုယ်ပိုင် Attribute တွေပိုင်ဆိုင်ပြီး နှစ်သက်ရာ Format နဲ့ Convert လုပ်မည့် Type ကို သတ်မှတ်နိုင်မှာ ဖြစ်ပါတယ်။

Attribute String Descriptions
binding NumberConverter Backing Bean Property နဲ့ Bind လုပ်လိုတဲ့ အခါ Unified EL Expression နဲ့ ရေးသားရပါမယ်။
currencyCode String Currency တွေကို Format လုပ်တဲ့ အခါမှာ အသုံးပြုမည့် ISO 4217 Currency Code ကို ရေးသားပေးရပါမယ်
currencySymbol String Currency တွေကို Format လုပ်တဲ့ အခါမှာ အသုံးပြုမည့် Currency Symbol ကို ရေးသားပေးရပါမယ်
for String Composite Component တွေမှာ Converter ကို အသုံးပြုလိုတဲ့ အခါ အသုံးပြုလိုတဲ့ Composite Component ထဲက Tag ကို သတ်မှတ်ရေးသားပေးရမှာ ဖြစ်ပါတယ်
groupingUsed Boolean Format လုပ်တဲ့ အခါမှာ Grouping separators ပါမပါ သတ်မှတ်ပေးနိုင်ပါတယ်
integerOnly Boolean Parse လုပ်တဲ့ အခါမှာ Integer အပိုင်းကို သာအသုံး ပြုမယ် ဆိုတာကို သတ်မှတ်ပေးနိုင်ပါတယ်
locale String or Locale အသုံးပြုလိုတဲ့ Locale ကို သတ်မှတ်ရေးသားပေးရမှာ ဖြစ်ပါတယ်။ ဘာမှ မရေးထားရင်တော့ FacesContext ရဲ့ getLocale() Method ကနေရတဲ့ Locale ကို အသုံးပြုသွားမှာ ဖြစ်ပါတယ်
maxFractionalDigits int အပြည့်ကိန်းနဲ့ ဒဿမကိန်းရဲ့ အများဆုံးနဲ့ အနဲဆုံး Digit ကို သတ်မှတ်လိုတဲ့ အခါမှာ ရေးသား အသုံးပြုနိုင်ပါတယ်
maxIntegerDigits int
minFractionalDigits int
minIntegerDigits int
pattern String Parse ဒါမှမဟုတ် Format လုပ်မည့် Pattern ကို ရေးသားပေးရပါတယ်
type String Parse ဒါမှမဟုတ် Format လုပ်မည့် ပုံစံကို ရေးပေးရပါတယ်။ number, currency ဒါမှမဟုတ် percentage တို့ကို အသုံးပြုနိုင်ပါတယ်။

Custom Object အတွက်လဲ Custom Converter တွေကို ရေးသားအသုံးပြုနိုင်အောင် ပြင်ဆင်ပေးထားပါသေးတယ်။ Custom Converter များအကြောင်းကိုတော့ နောက်တစ်ခေါက်မှာ ဖေါ်ပြသွားပါမယ်။

ဆက်ပါဦးမည်။
မင်းလွင်

No comments:

Post a Comment