November 2, 2011

Servlet အတွင်းမှ ပါရာမီတာများကိုရယူခြင်း

ပြီးခဲ့သော Java EE အခန်းဆက် Java EE ၏နည်းပညာတစ်ခုဖြစ်သော Servlet  အကြောင်းကိုစတင်ခဲ့ပြီး၊ ပဋ္ဌမဦးဆုံး Servlet ပရိုဂရမ်တစ်ခုကို လက်တွေ့ရေးကြည့်ခဲ့ကြပါသည်။ HelloServlet ကိုရေးသားရာတွင် HttpServlet ဆိုသည့် Super Class ကို extends လုပ်၍ ရေးသားခဲ့သည် ကို သတိထားမိမည်ဖြစ်သည်။ HelloServlet သည် HttpServlet ၏အမွေဆက်ခံသော sub class ဖြစ်ပါသောကြောင့် HttpServlet တွင်ပိုင်ဆိုင်သော လုပ်ဆောင်ချက်များကို ခေါ်ယူအသုံးချနိုင်ခြင်း ဖြစ်သည်။

ယခုဘလောဂ်တွင်လည်း Servlet တစ်ခု၏ အခြေခံသဘောတရားဖြစ်သော Life Cycle ကိုအစပြု၍၊ အခြေခံ လုပ်ဆောင်ချက်များကို နမှုနာပရိုဂရမ်များကို ရေးရင်း ဆက်လက် လေ့လာ သွားပါဦးမည်။


Life Cycle Of A Servlet

ကျွှန်တော်တို့ Servlet ၏ အခြေခံ အသုံးပြုပုံတွေကို မသွားသေးခင် Servlet တစ်ခု၏ Life Cycle ကို ဖော်ပြချင်ပါသေးသည်။ Servlet အားလုံး၏ အခြေခံမှာ javax.servlet.GenericServlet ဖြစ်ပါသည်။  Servlet ၏ အခြေခံလုပ်ဆောင်ချက်များအားလုံးသည် ဤ GenericServlet တွင် စုစည်းထားပါသည်။ ထို့ကြောင့် Servlet တစ်ခု၏ Life Cycle ကို GenericServlet အားအခြေခံ၍ လေ့လာသွားပါမည်။

Client ထံမှ စတင်၍ Request လာသောအခါမှစပြီး Servlet အား Servlet Container အပေါ် Load လုပ်မည်ဖြစ်သည်။ Web Module ၏ သတ်မှတ်ချက်ဖြစ်သော web.xml တွင်၊ Module အား Deploy ချိန်တွင် Servlet အား Load လုပ်ရန် ရေးသားနိုင်ပါသော်လည်း၊ Default မှာ ဦးဆုံး Request လာတဲ့အခါတွင် Load လုပ်ခြင်း ဖြစ်ပါသည်။

Class File ကို Load လုပ်သောအခါ Servlet Container က Servlet ၏ GenericServlet#init လုပ်ဆောင်ချက်ကို ခေါ်ယူမည်ဖြစ်သည်။ init လုပ်ဆောင်ချက်အား Servlet ၏ သက်တမ်း တစ်လျှောက်တွင် တစ်ကြိမ်တည်းသာ ခေါ်ယူအသုံးပြုမည်ဖြစ်ပြီး၊ Servlet အတွက်လိုအပ်သော initialize လုပ်ဆောင်ချက်များကို ရေးသားလေ့ရှိပါသည်။

Client မှ Servlet ဆီသို့ Request လုပ်လာသောအခါ၊ ထိုRequest တစ်ခုချင်းစီအပေါ်တွင် Thread တစ်ခုစီ တည်ဆောက်၍ တာဝန်ထမ်းဆောင်စေပါသည်။ ထို Thread ထဲတွင် Servlet#service လုပ်ဆောင်ချက်ကို ခေါ်ယူမည်ဖြစ်သည်။ ထိုလုပ်ဆောင်ချက်ထဲတွင် Client ၏ တောင်းဆိုချက်ကို ခွဲချမ်းစိတ်ဖြာ၍၊ သင့်တော်သော တုံ့ပြန်ချက်ကို Response အဖြစ်ပြန် ပေးမည်ဖြစ်သည်။ ဤကဲ့သို့ Servlet တစ်ခုအား Thread ပေါင်းများစွာမှ ခေါ်ယူအသုံးပြုမည် ဖြစ်ပါသဖြင့်၊ တစ်ကြိမ်တည်းတွင် အခေါ်ခံရပါက အမှားအယွင်းများမရှိနိုင်အောင်၊ အထူးသတိပြု၍ ပရိုဂရမ်ကို ရေးသားသင့်ပါသည်။

Servlet Container သည် နောက်ဆုံးတွင် GenericServlet#destroy ကို ခေါ်ယူမည်ဖြစ်ပါသည်။ အတိုင်းအတာတစ်ခုအတွင်း Servlet အပေါ်တွင် Request မရှိသောအခါ၊ ဒါမှမဟုတ် Container ကို Stop လုပ်သောအခါတွင် destroy ကို ခေါ်ယူမည် ဖြစ်ပါသည်။ destroy လုပ်ဆောင်ချက်သည်လည်း init လုပ်ဆောင်ချက်ကဲ့သို့ပင် Servlet ၏ ဘဝတစ်လျှောက်တွင် တစ်ကြိမ်တည်းသာ အသုံးပြုမည့် လုပ်ဆောင်ချက် ဖြစ်ပါသည်။

Client ၏ HTTP Request အပေါ်တွင် လုပ်ဆောင်စေလိုသောအခါ၊ javax.servlet.HttpServlet Class ကို အသုံးပြုရန်လိုအပ်ပါသည်။ HttpServlet သည်လည်း GenericServlet ၏ Sub Class တစ်ခုဖြစ်ပါသောကြောင့်၊ အတွင်းပိုင်းရှိ လုပ်ဆောင်ချက်များမှာ GenericServlet နှင့် အတူတူပင်ဖြစ်သည်။ သို့ရာတွင် Http Request ၏Header အပေါ်တွင်မှုတည်၍ doGet၊ doPost ကဲ့သို့ လုပ်ဆောင်ချက်များကို ပြင်ဆင်ထားပါသည်။ အထက်ပါ လုပ်ဆောင်ချက်များသည်လည်း service လုပ်ဆောင်ချက်အတွင်းမှ header ၏ method အပေါ်မှုတည်၍ ခွဲခြားခေါ်ယူ အသုံးချနေခြင်းသာဖြစ်ပါသည်။


Sample Application

Servlet အတွင်းမှ ပြင်ပမှ Parameter များကိုရယူနိုင်ရန် နည်းများကိုပြင်ဆင်ထားလေသည်။ အသုံးများသော နည်းများမှာ အောက်ပါအတိုင်း ဖြစ်ကြ၏။
  1. Servlet ကို စတင် Load လုပ်ရာတွင် အသုံးပြုနိုင်ရန် Init Parameter အဖြစ်ရယူခြင်း။
  2. Http Request တွင် ပါဝင်သော Request Parameter များကို ရယူခြင်း။
  3. Http Header တွင် ရှိသော အချက်အလက်များကို ရယူခြင်း။
အထက်ပါ နည်းများအားလုံးကိုအသုံးပြု၍ ကျွှန်တော်တို့ နမှုနာ Servlet တစ်ခုရေးကြည့်ပါမည်။ ကျွှန်တော်တို့ရေးမည့် Servlet တွင် Client မှ get အနေရဲ့ရော post အနေနဲ့ပါ အသုံးပြုနိုင်ရန် ရေးသားပါမည်။ အဲ့ဒီအတွက် Servlet အထဲတွင် HttpServlet#doGet ရော HttpServlet#doPost ကိုပါ ရေးသားရန်လိုအပ်ပါသည်။

Client ဆီမှ အောက်ပါအတိုင်း ၃မျိုး Request လုပ်ရန်ရည်ရွယ်ထားပါသည်။
  1. Request Parameter မပါပဲ get ပုံစံဖြင့် Request လုပ်သည့်အခါ Init Parameter ကို ရယူ၍ ဖော်ပြပေးပါမည်။
  2. Request Parameter များဖြင့် post ပုံစံဖြင့် Request လုပ်သည့်အခါ header ၏တန်ဖိုးကိုစစ်ဆေး၍၊ တန်ဖိုးသည် 1 မဟုတ်ပါက Request Parameter များကို ရယူ၍ ပြန်လည်ဖော်ပြပေးပါမည်။
  3. အကယ်၍ headerအမည်ရှိ ပါရာမီတာ၏ တန်ဖိုးမှာ 1 ဖြစ်ခဲ့ပါက HTML ၏ Header ထဲမှ အချက်အလက်များကို ရယူ၍ ဖော်ပြပေးပါမည်။
အထက်ပါ အတိုင်း Servlet တစ်ခုကို ယခင်တစ်ခေါက်ရေးသားခဲ့သော MyFirstServlet ပရိုဂျက်အတွင်းတွင် ရေးသားသွားပါမည်။ Request လုပ်ရန် စာမျက်နှာကိုလည်း ယခင်တစ်ခေါက် အသုံးပြုခဲ့သော index.html ကိုပဲ ပြန်လည်ပြုပြင်၍ အသုံးပြုသွားပါမည်။ အသုံးပြုသွားမည့် ဖိုင်များမှာ အောက်ပါအတိုင်းဖြစ်ပါသည်။
  1. BasicServlet.java
  2. web.xml
  3. episode2.html

ဤတစ်ခေါက် Servlet တွင် get ပုံစံသာမက၊ post ပုံစံပါ အတူတူအလုပ်လုပ်စေရန်လိုအပ်ပါသဖြင့်၊ doPost ကို ပါရေးသားရန်လိုအပ်ပါသည်။

doPost
   /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
     *      response)
     */
    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }

ဤနမှုနာ၌ post ရော get ပါ အတူတူအလုပ်လုပ်စေလိုပါသဖြင့်၊ အတွင်းပိုင်းတွင် ရရှိလာသော Arguments များဖြင့် doGet ကို ပြန်ခေါ်နေခြင်း ဖြစ်ပါသည်။ လက်တွေ့ရေးသားရာတွင် System ၏ လိုအပ်ချက်အတိုင်း post နှင့် get ကို ခွဲခြား၍ ရေးသားလေ့ရှိပါသည်။

doGet
    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
     *      response)
     */
    protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        // response တွင် ယူနီကုဒ် Encoding အဖြစ် သတ်မှတ်ခြင်း
        response.setCharacterEncoding("UTF-8");
        
        // request တွင်ပါဝင်သော parameter အမည်များကို ရယူခြင်း
        Enumeration<String> params = request.getParameterNames();
        
        // request မှ header အမည်ရှိသော parameter ၏ တန်ဖိုးကို ထုတ်ယူခြင်း
        String isHeader = request.getParameter("header");
        
        // parameter အမည်များမရရှိခဲ့ပါက
        if(null == params || !params.hasMoreElements()) {
            // အခန်း ၁ လုပ်ဆောင်ချက်ကို ခေါ်ယူခြင်း
            this.doInitParamProcess(request, response);
        } else {
            // header ၏တန်ဖိုးသည် 1 ဖြစ်ပါက
            if("1".equals(isHeader) ) {
                // အခန်း ၃ လုပ်ဆောင်ချက်ကိုခေါ်ယူခြင်း
                this.doHeaderInfoProcess(request, response);
            } else {
                // အခန်း ၂ လုပ်ဆောင်ချက်ကို ခေါ်ယူခြင်း
                this.doRequestParamProcess(request, response);
            }
        }
    }

doGet အတွင်းတွင် Program အတွင်း၌ အသုံးပြုနိုင်ရန် Request ပါရာမီတာများနှင့် header အမည်ရှိ ပါရာမီတာ၏ တန်ဖိုးကိုဦးစွာရယူပါသည်။ Request ပါရာမီတာများအား HttpRequest#getParameterNames ဖြင့် ရယူနိုင်ပြီး၊ header အမည်ရှိ ပါရာမီတာ၏ တန်ဖိုးအား HttpRequest#getParameter ဖြင့် ရယူနိုင်ပါသည်။

ရရှိလာသော အချက်အလက်များဖြင့် အတွင်းပိုင်းတွင်ခွဲခြားလုပ်ဆောင်စေခြင်းဖြစ်ပါသည်။ ပါရာမီတာများ params သည် null သို့မဟုတ် မပါခဲ့ပါက၊ အခန်း၁ လုပ်ဆောင်ချက်ဖြစ်သော BasicServlet#doInitParamProcess ကို ခေါ်ယူလုပ်ဆောင်စေပါသည်။ တဖန် ပါရာမီတာများသည် တစ်ခုမကပါဝင်၍၊ header ၏ တန်ဖိုးသည် 1 ဖြစ်ခဲ့ပါက၊ အခန်း ၃ လုပ်ဆောင်ချက်ဖြစ်သော၊ BasicServlet#doHeaderInfoProcess ကို လုပ်ဆောင်စေပါသည်။ နောက်ဆုံးတွင် ပါရာမီတာများသည် ၁ခုထက်မကပါဝင်ပြီး၊ header ၏တန်ဖိုးသည် 1 မဟုတ်ခဲ့ပါက BasicServlet#doRequestParamProcess ကို လုပ်ဆောင်စေပါသည်။


Init Param များကိုရယူခြင်း

Servlet တစ်ခုသည် Client ထံမှ ပဋ္ဌမအကြိမ် Request လုပ်သောအခါတွင် တစ်ကြိမ်တည်းသာ Servlet Container အပေါ်ကိုယ် ခေါ်ယူခြင်းခံရပါသည်။ ပြီးလျှင် Servlet Container အပေါ်တွင် Object အဖြစ်တည်ရှိနေပြီး၊ Client ထံမှ Request လာတိုင်း သင့်တော်သည့် လုပ်ဆောင်ချက်များကို Thread များအဖြစ် ခေါ်ယူလေ့ရှိ၏။

ပဋ္ဌမဦးဆုံးအချိန်ခေါ်ဆိုသည့် လုပ်ဆောင်ချက်မှာ GenericServlet#init ဖြစ်ပြီး Servlet ၏ လိုအပ်သောလုပ်ဆောင်ချက်များကို init အတွင်းတွင် လုပ်ဆောင်လေ့ရှိပါသည်။ တဖန် init-param များကို web.xml ၏ သတ်မှတ်ချက်တွင် ထည့်သွင်းရေးသားချင်းအားဖြင့်၊ servlet ကို Load လုပ်သောအခါ memory အပေါ်ကိုယ်ခေါ်ယူထားလေ့ရှိပါသည်။

init-param
    <servlet>
        <description></description>
        <display-name>BasicServlet</display-name>
        <servlet-name>BasicServlet</servlet-name>
        <servlet-class>com.episode2.BasicServlet</servlet-class>
        <init-param>
            <param-name>param1</param-name>
            <param-value>မြန်မာစာပါရာမီတာ။</param-value>
        </init-param>
        <init-param>
            <param-name>param2</param-name>
            <param-value>web.xmlတွင် မြန်မာစာကို အသုံးပြုနိုင်ပါသည်။</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>BasicServlet</servlet-name>
        <url-pattern>/Basic</url-pattern>
        <url-pattern>/Episode2</url-pattern>
    </servlet-mapping>

အထက်ပါအတိုင်း web.xml တွင် BasicServlet တွင်အသုံးပြုမည့် init-param များကို ဖြည့်စွက်ရေးသားနိုင်ပါသည်။ ဤသို့ရေးသားခြင်းအားဖြင့်၊ BasicServlet ကို Load လုပ်သောအခါ၊ init-param များအဖြစ် param1 နှင့် param2 ကို Memory အပေါ်ကို ခေါ်ယူထားနိုင်မည်ဖြစ်သည်။ Memory အပေါ်ရှိ init-param များကို Servlet အတွင်းမှခေါ်ယူပုံမှာ doInitParamProcess ထဲတွင်ဖော်ပြထားပါသည်။

doInitParamProcess
    /**
     * အခန်း ၁ လုပ်ဆောင်ချက်
     * @param request
     * @param response
     * @throws IOException 
     */
    private void doInitParamProcess(HttpServletRequest request,
            HttpServletResponse response) throws IOException {
        
        PrintWriter writer = response.getWriter();
        writer.println(getHeaderHtml("လေ့ကျင့်ခန်း ၁ ။   ။ Init Parameters များကို အသုံးပြုခြင်း။"));
        writer.println("<p>web.xml ၏ init-param ၏ တန်ဖိုးများဖြစ်ကြပါသည်။</p>");
        writer.println("<ul>");

        // init-param အမည်များကို ရယူခြင်း
        Enumeration<String> names = getInitParameterNames();
        // init-param အမည်များ မကုန်မချင်း
            while(names.hasMoreElements()) {
                String name = names.nextElement();
                writer.println("<li>");
                // init-param အမည်နှင့် တန်ဖိုးကိုရေးသားခြင်း
                writer.println(name + " : " + getInitParameter(name));
                writer.println("</li>");
            }
        writer.println("</ul>");
        writer.println(getFooterHtml());
    }

အထက်ပါ လုပ်ဆောင်ချက်ထဲတွင် ဦးစွာ private လုပ်ဆောင်ချက်ဖြစ်သော getHeaderHtml ဖြင့် HTML စာသားများကို ရယူပြီးResponse ၏ printWriter ဖြင့် ရေးသားစေပါသည်။ အလားတူနောက်ဆုံးတွင်လည်း getFooterHtml ဖြင့် HTML ၏ အောက်ပိုင်းစာသားများကို ရေးသားစေပါသည်။ getHeaderHtml ရော getFooterHtmlပါ ရိုးရိုးစာလုံးများကို ပြန်ပေးသောလုပ်ဆောင်ချက်များဖြစ်ပြီး၊ Servlet နှင့် မပတ်သက်ပါသဖြင့် အသေးစိတ်ဖော်ပြတော့မည် မဟုတ်ပါ။

တဖန် init-param များ၏အမည်အားလုံးအား GenericServlet#getInitParameterNames ဖြင့်ရယူနေပါသည်။ GenericServlet သည် Servlet အားလုံး၏ Super Class ဖြစ်ပါသဖြင့် Servlet များအားလုံးမှ သူ၏လုပ်ဆောင်ချက်များကို ခေါ်ယူအသုံးပြုနိုင်ခြင်းဖြစ်သည်။ ရရှိလာသော ပါရာမီတာများကို while ဝါကျကိုအသုံးပြု၍ မကုန်မချင်း အောက်ပါ လုပ်ဆောင်ချက်များကို လုပ်ဆောင်စေပါသည်။ ရရှိလာသော init-param အမည်ဖြင့် GenericServlet#getInitParameter ကို အသုံးပြု၍ တန်ဖိုးကိုရယူပါသည်။ ရယူထားသော ပါရာမီတာအမည်နှင့် တန်ဖိုးကို Response ဆီကို တစ်ကြောင်းခြင်း ရေးသားနေစေခြင်းဖြစ်ပါသည်။


Request Parameter များကို ရယူခြင်း
doRequestParamProcess
    /**
     * အခန်း၂ လုပ်ဆောင်ချက်
     * @param request
     * @param response
     * @throws IOException
     */
    private void doRequestParamProcess(HttpServletRequest request,
            HttpServletResponse response) throws IOException {
        PrintWriter writer = response.getWriter();
        writer.println(getHeaderHtml("လေ့ကျင့်ခန်း ၂ ။   ။ Request Parameters များကို အသုံးပြုခြင်း။"));
        writer.println("<p>Request Parameter ၏ တန်ဖိုးများဖြစ်ကြပါသည်။</p>");
        writer.println("<ul>");

        // request တွင်ပါဝင်သော parameter အမည်များကို ရယူခြင်း
        Enumeration<String> params = request.getParameterNames();
        while(params.hasMoreElements()) {
            String name = params.nextElement();
            writer.println("<li>");
            String value =  request.getParameter(name);
            value = new String(value.getBytes(DEF_ENC), "UTF-8");
            // param အမည်နှင့် တန်ဖိုးကိုရေးသားခြင်း
            writer.println(name + " : " + value);
            writer.println("</li>");
        }
        writer.println("</ul>");
        writer.println(getFooterHtml());
    }

Request အဖြစ်ပေးပို့လိုက်သော Parameter များအား HttpServletRequest#getParameterNames ကို အသုံးပြု၍ ရယူပါသည်။ တဖန် ပါရာမီတာ၏ တန်ဖိုးကိုလည်း HttpServletRequest#getParameter ကိုအသုံးပြု၍ ရယူပါသည်။ တစ်ခုသတိထားရမည်မှာ URL မှတဆင့် RequestParameter ကို ရယူရာတွင် မြန်မာယူနီကုဒ်ကို အသုံးပြုပါက Encoding လုပ်ရန်လိုအပ်သည်ဆိုသည့်အချက်ပင်ဖြစ်သည်။

Servlet မှ RequestParameter ကို ရယူရတွင် Default ISO-8859-1 ဖြင့် ရယူနေပါသဖြင့်၊ မြန်မာယူနီကုဒ်ကို အသုံးပြုလိုသောအခါ UTF-8 ပုံစံသို့ ပြောင်းရန်လိုအပ်သည် ဆိုသောအချက်ဖြစ်ပါသည်။ request.getParameter(name) ဖြင့်ရရှိလာသော String value မှတဆင့်၊ value.getBytes("ISO-8859-1")ဖြင့်၊ byte [] ပုံစံကိုပြန်ပြောင်းပါသည်။ တဖန် new String (byte [], "UTF-8") ဖြင့် ယူနီကုဒ်ပုံစံကို ပြန်ပြောင်းယူရန်လိုအပ်ပါသည်။

ကျန်သောနေရာမှာမှာ doInitParamProcess အတိုင်း၊ ပါရာမီတာများကို တစ်ကြောင်းခြင်းပြန် ရေးနေခြင်းသာဖြစ်ပါသည်။


မှတ်ချက် ။  ။ နမှုနာ Application ကို လက်တွေ့စမ်းသပ်ကြည့်ရှုနိုင်စေရန်၊ ပရိုဂျက်ကို Google Project Hosting တွင် တင်ထားပြီး၊ Application ကို လည်း Google App Engine အပေါ်တွင် တင်ထားပါသည်။ GAE Project တစ်ခုကို အသစ်တည်ဆောက်ပြီး၊ လိုအပ်သော web.xml, index.html နှင့် servlet src ဖိုင်များကို ယခင်ပရိုဂျက်မှ import လုပ်ယူလိုက်ရုံဖြင့် အလုပ်လုပ်ပါသည်။ သို့ရာတွင် မြန်မာစာ ယူနီကုဒ်အတွက် ပြောင်းလည်းရန်မလိုအပ်ပါသဖြင့်၊ byte ကို ပြောင်းနေတဲ့နေရာနဲ့ အစားထိုးနေတဲ့နေရာကို ပြုပြင်ရေးသားလိုက်ပါသည်။
Tomcat နှင့် Glassfish တွင် request parameter ၏ default character set မှာ ISO-8859-1 ဖြစ်သော်လည်း၊ Google App Engine တွင်အသုံးပြုနေသော jetty မှာ utf-8 ကို encode လုပ်နိုင်ပုံရပါသည်။
ထို့ကြောင့် Google App Engine တွင် မြန်မာယူနီကုဒ်ကို Request Parameter အဖြစ်အသုံးပြုလိုပါကစာလုံးပုံစံပြောင်းရန် မလိုအပ်ပဲ၊ HttpRequest#getParameter လုပ်ဆောင်ချက်ဖြင့် ရရှိသောတန်ဖိုး အတိုင်းအသုံးပြုနိုင်မည် ဖြစ်သည်။

Sample Application
http://mmitp-servlet-tutorial.appspot.com/

Source Code
http://code.google.com/p/mmitpro-tutorials/source/browse/servlet-tu...

Google App Engine (Start Guide)
http://code.google.com/intl/my/appengine/docs/java/gettingstarted/

HTML Header အချက်အလက်များကို ရယူခြင်း
doHeaderInfoProcess
   /**
     * အခန်း၃ လုပ်ဆောင်ချက်
     * @param request
     * @param response
     * @throws IOException
     */
    private void doHeaderInfoProcess(HttpServletRequest request,
            HttpServletResponse response) throws IOException {
        PrintWriter writer = response.getWriter();
        writer.println(getHeaderHtml("လေ့ကျင့်ခန်း ၃ ။   ။ Header ၏တန်ဖိုးများကို အသုံးပြုခြင်း။"));
        writer.println("<p>Request Headerတွင်ပါဝင်သော တန်ဖိုးများဖြစ်ကြပါသည်။</p>");
        writer.println("<ul>");
        // request တွင်ပါဝင်သော Header အမည်များကို ရယူခြင်း
        @SuppressWarnings("unchecked")
        Enumeration<String> names = request.getHeaderNames();
        while(names.hasMoreElements()) {
            String name = names.nextElement();
            writer.println("<li>");
            // အမည်နှင့် တန်ဖိုးကိုရေးသားခြင်း
            writer.println(name + " : " + request.getHeader(name));
            writer.println("</li>");
        }
        writer.println("</ul>");
        writer.println(getFooterHtml());
    }

အထက်ပါ လုပ်ဆောင်ချက်သည်လည်း အခြားသောလုပ်ဆောင်ချက်များကဲ့သို့ပင်၊ Header တွင်ပါဝင်သော အချက်အလက်များကိုရယူ၍၊ ရရှိလာသော Header  အချက်အလက်များကို တစ်ခုချင်း Response တွင်ပြန် ရေးနေခြင်းသာဖြစ်သည်။ Header တွင်ပါဝင်သော အချက်အလက်များကိုရယူရာ၌ HttpServletRequest#getHeaderNames ကို အသုံးပြုပြီး၊ header ၏တန်ဖိုးများကိုရယူရာတွင် HttpServletRequest#getHeader ကို အသုံးပြုနေပါသည်။

Sample Application ကို စမ်းသပ်ခြင်း

ရေးသားထားသော နမှုနာများကို Sample Application Site http://mmitp-servlet-tutorial.appspot.com/  တွင် လက်တွေ့ စမ်းသပ်ကြည့်နိုင်ပါသည်။



ပြီးလျှင် Episode2 ၏ Init Parameters လင့်ခ်ကို နှိပ်ကြည့်ပါမည်။ လင့်ခ်၏ href attribute ၏ တန်ဖိုးတွင် "/Basic" ဟုရေးသားထားပါသဖြင့် ပါရာမီတာမပါပဲ get method ဖြင့် BasicServlet ကို ခေါ်မည်ဖြစ်သည်။ ထိုအခါ BasicServlet#doGet လုပ်ဆောင်ချက်ကို အခေါ်ခံရမည်ဖြစ်ပြီး၊ Request Parameter မပါပါသဖြင့် BasicServlet#doInitParamProcess လုပ်ဆောင်ချက်ကို ခေါ်ယူမည်ဖြစ်သည်။



တဖန် မာတိကာသို့လင့်ခ်ဖြင့် ပင်မစာမျက်နှာသို့ပြန်သွား၍ ဒုတိယလင့်ခ်ဖြစ်သော Request Parameters ကို နှိပ်ကြည့်ပါမည်။ Request Parameters လင့်ခ်၏ onclick event ဖြင့် javascript လုပ်ဆောင်ချက် getEp2Ls2 ကို ခေါ်ယူနေပါသည်။ တဖန် ထိုလုပ်ဆောင်ချက်အတွင်းတွင် ep2ls2 Form ကို submit လုပ်နေပါသည်။ ep2ls2 သည် post ပုံစံဖြစ်ပါသဖြင့်၊ BasicServlet#doPost က အလုပ်လုပ်ပါလိမ့်မည်။ doPost အတွင်းမှ doGet ကို ပြန်ခေါ်နေပါသည်။ ထို့အပြင် request parameter မှာ null မဟုတ်ပဲ၊ header အမည်ရှိ parameter မှာမပါဝင်ပါသဖြင့် BasicServlet#doRequestParamProcess ကို အလုပ်လုပ်စေမည်ဖြစ်ပါသည်။



နောက်ဆုံးတွင် မာတိကာစာမျက်နှာမှ Header အချက်အလက်များ လင့်ခ်ကိုစမ်းကြည့်ပါမည်။ လင့်ခ်၏ href attribute ၏ တန်ဖိုးတွင် "/Basic?header=1"ဟု တိုက်ရိုက်ရေးသားထားပါသောကြောင့် get method တွင် header ပါရာမီတာကို ပေး၍ request လုပ်နေခြင်းဖြစ်ပါသည်။ Servlet Container မှ BasicServlet#doGet လုပ်ဆောင်ချက်ကို အခေါ်ခံရပြီး၊ request Parameter အထဲတွင် header၏တန်ဖိုးသည် 1 ဖြစ်သောကြောင့်၊ doGet အတွင်းတွင်ရေးသားထားသော လော့ဂျစ်အတိုင်း BasicServlet#doHeaderInfoProcess ကို  အလုပ်လုပ်စေမည် ဖြစ်ပါသည်။



ကျွှန်တော်တို့ ဤဘလောဂ်ဖြင့် Servlet တစ်ခုအတွင်းမှ Init Parameter များကို ရယူပုံ၊ Request Parameter များကိုရယူပုံ နှင့် Header တွင်ပါဝင်သော အချက်အလက်များကို ရယူပုံတို့ကို လေ့လာခဲ့ပါသည်။ တဖန်မြန်မာယူနီကုဒ်ကို Request Parameter အဖြစ်အသုံးပြုလိုပါက စာလုံးပုံစံကို ပြန်ပြောင်းရန်လိုအပ်ကြောင်းကိုလည်းလေ့လာခဲ့ပါသည်။

ဤဘလောဂ်တွင် HTML Tag များကိုလည်း Servlet မှရေးသားနေစေသည်ကို တွေ့ရပေမည်။ ဤကဲ့သို့ရေး၍ရပါသော်လည်း လက်တွေ့တွင်မှု ဤကဲ့သို့ရေးသားလေ့မရှိပါ။ HTML များကို ဒီဇိုင်းရေးရလွယ်ကူသော JSP အဖြစ်ရေးသားပြီး Servlet မှ လိုအပ်သောအချက်အလက်များကိုသာ ပြန်ပို့ပေးစေပါသည်။ လက်တွေ့တွင်မှု JSP နှင့် Servlet ကို တွဲ၍ ရေးသားသည်က များသော်လည်း၊ JSP အကြောင်းကို နောက်အခန်းများတွင် ဖော်ပြမည်ဖြစ်ပါသောကြောင့် လက်ရှိအနေအထားအရ Servlet တစ်ခုတည်း ဖြင့်သာ ရေးသားနေခြင်းဖြစ်ပါသည်။

နောက်အခန်းများဖြင့် Session နှင့် ကွတ်ကီးအကြောင်းကို ဆက်လက်၍ ဖော်ပြသွားပါဦးမည်။

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

3 comments:

  1. ပုံတော်တော်များများ 404 ဖြစ်နေတယ်ခင်ဗျ

    ReplyDelete
  2. ဟုတ်ပါတယ်ခင်ဗျာ။ အရင်တုန်က Myanmar IT Pro မှာတင်ထာ:တာကို ဒီအတိုင်: ပြောင်:ခဲ့မိပါတယ်။ ပုံတွေကိုလဲ​ အဲ့ဒီ Link ကနေပဲ Reference လုပ်ထာ:ပါတယ်။ မကြာခင် Servlet Version ကို Update လုပ်ရင်: အကုန်ပြန်ပြင်ပါ့မယ်။

    ReplyDelete
  3. ၿမန္ၿမန္ေလးလုပ္ေပးပါခင္ဗ် ပံုမပါေတာ့ သိပ္မၿမင္ဘူး

    ReplyDelete