August 5, 2012

Custom Tag (Part 1)


 JSP တွင် Standard အနေဖြင့် <jsp:useBean>, <jsp:setProperty> အစရှိသော Tag များအား JSP စပေါ်ကာစ ကတည်းက အသုံးပြုလာနိုင် ခဲ့ကြ၏။ အဆိုပါ Standard Tag များအပြင် မိမိ ကိုယ်ပိုင် Tag များကိုလည်း ရေးသားနိုင်ပါသည်။ ထို Tag များအား Custom Tag ဟု ခေါ်ဆိုပါသည်။ အမှန်ဆိုရမည် ဆိုလျှင် JSTL သည် Apache Software Foundation မှ ရေးသားခဲ့သော Custom Tag Lib ဖြစ်ခဲ့ပြီး၊ နောက်ပိုင်းတွင်မှ Java EE ၏ အခြေခံ လိုင်ဘရီ အဖြစ် ဖြည့်စွက်ခဲ့ခြင်း ဖြစ်ပါသည်။

ယခင်က Custom Tag ရေးသားပုံမှာ တနည်းတည်းသာ ရှိခဲ့သော်လည်း၊ ယနေ့ ၂၀၁၂ခု အချိန်တွင် လက်ရှိ နည်း၂မျိုးဖြင့် ရေးသားနိုင်ပါသည်။ ပဋ္ဌမတနည်းမှာ ယခင်ကတည်းက ရေးသားခဲ့သလို Java ဘာသာရပ်ဖြင့် Tag အော့ဘဂျက်များအား ရေးသားပြီး၊ ၎င်းအား JSP အတွင်းမှ ခေါ်ယူ အသုံးပြုသောနည်း ဖြစ်ပါသည်။

ဒုတိယနည်းမှာ JSP Fragment များကဲ့သို့ Tag ဖိုင်များအား ရေးသားပြီး Custom Tag အနေဖြင့် အသုံးပြုနည်း ဖြစ်ပါသည်။ Tag ဖိုင်များသည် JSP 2.0 မှ စတင် ဖြည့်စွက်လာသော နည်းပညာရပ် တစ်ခုဖြစ်ပြီး၊ အသုံးပြုသည့် ဘက်မှ ကြည့်ပါက Custom Tag နှင့်တူ၍၊ ရေးသားသည့် ဘက်မှ ကြည့်ပါက JSP Include ဖိုင်အား ရေးသားရသည်နှင့် တူပါသည်။


Java ကလပ်စ်အား အသုံးပြု၍ Custom Tag ရေးသားနည်း

Java ကလပ်စ်များအား ရေးသားကာ Tag များအား ရေးသားမည် ဆိုလျှင် အောက်ပါအတိုင်း အဆင့်ဆင့် ရေးသားရမည် ဖြစ်ပါသည်။
  • Tag Handler Class ရေးသားခြင်း
  • Tag Lib Descriptor ရေးသားခြင်း
  • web.xml တွင် ဖြည့်စွက် ရေးသားခြင်း (ယခုနောက်ပိုင်း Web မော်ဂျူးများတွင် ရေးသားရန် မလိုအပ်တော့)
  • JSP အတွင်း သတ်မှတ်ချက်ကို ရေးသားနည်း (Tag lib Directive)  
အခြားသော Tag Lib များအား အသုံးပြုမည်ဆိုပါက၊ Tag Handler Class နှင့် Tag Lib Descriptor များအား ရေးသားရန်မလိုပဲ အောက်မှ အဆင့် ၂ခုကိုသာ ရေးသားရုံဖြင့် အသုံးပြုနိုင်မည် ဖြစ်ပါသည်။ JSTL သည်လည်း ပံ့ပိုးထားသော Taglib ဖြစ်ပါသဖြင့် ကိုယ်တိုင် Class များအား ရေးသားစရာ မလိုအပ်ပဲ အသုံးပြုနိုင်ခြင်း ဖြစ်ပါသည်။

Custom Tag တစ်ခုအား ကိုယ်တိုင် ရေးသားတော့မည် ဆိုလျှင် ဦးစွာ Tag Handler ကလပ်စ်အား ရေးသားရန် လိုအပ်ပါသည်။ Tag Handler ကလပ်စ်များသည် Custom Tag များ၏ လုပ်ဆောင်ချက်ကို အဓိက လုပ်ဆောင်စေသော ကလပ်စ်များ ဖြစ်ကြပါသည်။

တဖန် Tag Handler ကလပ်စ်များအား Custom Tag အနေဖြင့် အသုံးပြုနိုင်ရန် အတွက် သက်မှတ်ချက်များအား ရေးသားရန် လိုအပ်ပါသေးသည်။ ထိုအထဲတွင် Custom Tag ၏ အမည်၊ အသုံးပြုမည့် Class နှင့် ပုံစံများ၊ အသုံးပြုမည့် Attribute များ အစရှိသည့် Custom Tag တစ်ခု အတွက် လိုအပ်ချက်များကို ရေးသားရပါမည်။ အဆိုပါ သတ်မှတ်ချက်များအား Tag Lib Descriptor (TLD) ဟု ခေါ်ဆိုပါသည်။

ယခင်က Web Module ဗားရှင်း အဟောင်းများတွင် TLD များအား အသုံးပြုမည့် URI နှင့် တွဲ၍ web.xml တွင် သတ်မှတ်ချက်များအား ရေးသားရန် လိုအပ်ခဲ့သော်လည်း၊ ယခုနောက်ပိုင်းတွင် JSP အတွင်းရှိ Tag Lib Directive များတွင် တိုက်ရိုက် ရေးသားနိုင်ပါသဖြင့် web.xml တွင် ရေးသားရန် မလိုအပ်တော့ပေ။

နောက်ဆုံးတွင် အသုံးပြုမည့် JSP အတွင်း၊ Taglib Directive များဖြင့် သတ်မှတ်ရေးသားပြီးပါက TLD အတွင်းရှိ Tag များအား Custom Tag အနေဖြင့် အသုံးပြုနိုင်မည် ဖြစ်ပါသည်။


Tag Handler Class

Tag Handler ကလပ်စ်များအား ရေးသားရာတွင် အသုံးပြုလိုသည့် Tag အမျိုးအစားအပေါ်မှုတည်၍ အသုံးပြုရန် လိုအပ်သော ကလပ်စ် နှင့် အင်တာဖေစ်များအား ပြင်ဆင်ထားပါသည်။ ဤနေရာတွင် အခြေခံအကျဆုံး Tag အင်တာဖေစ်အား အသုံးပြု၍ ရေးသားသွားပါမည်။

HelloTag.java
package com.mmju.jsp.ep7;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.Tag;

public class HelloTag implements Tag {
 
 private PageContext ctx = null;
 private Tag parrent = null;

 @Override
 public int doEndTag() throws JspException {
  
  try {
         ctx.getOut().print("Hello Custom Tag!");
        } catch (IOException e) {
         e.printStackTrace();
        }
  
  return EVAL_PAGE;
 }

 @Override
 public int doStartTag() throws JspException {
  return SKIP_BODY;
 }

 @Override
 public Tag getParent() {
  return this.parrent;
 }

 @Override
 public void release() {
 }

 @Override
 public void setPageContext(PageContext arg) {
  this.ctx = arg;
 }

 @Override
 public void setParent(Tag arg) {
  this.parrent = arg;
 }

}

Tag အင်တာဖေစ်အား implements လုပ်ပြီဆိုတာနဲ့ အောက်ပါ လုပ်ဆောင်ချက်များအား ဖြည့်စွက် ရေးသားရန် လိုအပ်ပါသည်။
  1. setPageContext
    JSP အတွင်း တွင် အသုံးပြုမည့် Resource အချက်အလက်များအား ထိမ်းသိမ်းနိုင်မည်ဖြစ်ပါသည်။ javax.servlet.jsp.PageContext အား set လုပ်မည် ဖြစ်ပါသည်။
  2. setParent
    လက်ရှိ Custom Tag အား ဝန်းရံထားမည့် Parent Tag အား သတ်မှတ်နိုင်မည် ဖြစ်ပါသည်။
  3. getParent
    Parent Tag အား ရလဒ် အဖြစ်ပြန် ပေးရမည်ဖြစ်၏။
  4. doStartTag
    Custom Tag ၏ အဖွင့် Tag အား ရေးသားရာတွင် ခေါ်ယူမည့် လုပ်ဆောင်ချက် ဖြစ်ပြီး၊ ရလဒ်အဖြင့် Tag.SKIP_BODY ကို ရေးသားပါက Body အပိုင်းအား ဖော်ပြမည် မဟုတ်ပဲ၊ Tag.EVAL_BODY_INCLUDE အား ရေးသားပါက Body အပိုင်းအား ဆက်လက်ဖော်ပြမည် ဖြစ်ပါသည်။
  5. doEndTag
    Custom Tag ၏ အပိတ် Tag အား ရေးသားချိန်တွင် ခေါ်ယူပါမည်။ ဤ နမှုနာထဲတွင် JSP Writer ဖြင့် "Hello Custom Tag!" ဟု ရေးသားစေပြီး နောက်ဆုံးတွင် EVAL_PAGE ကို ရလဒ်အဖြင့် ပြန်ပေးပါသည်။ EVAL_PAGE အား ရလဒ်အဖြင့် အသုံးပြုပါက Tag ၏ နောက်ပိုင်းရှိ စာမျက်နှာအား ဆက်လက်ဖော်ပြမည် ဖြစ်ပြီး၊ SKIP_PAGE ကို အသုံးပြုပါက လက်ရှိစာမျက်နှာအား ရေးသားနေရာမှ Return လုပ်မည် ဖြစ်ပါသည်။
  6. release
    JSP အတွင်း အသုံးပြုမည့် Resource များအား ပြန်လည် release လုပ်ရန်လိုအပ်ပါက ရေးသားရမည့် လုပ်ဆောင်ချက် ဖြစ်ပါသည်။


Tag Lib Descriptor

Tag Handler ကလပ်စ်အား ရေးသားပြီးပါက အဆိုပါ ကလပ်စ်များအား Custom Tag အဖြစ် အသုံးပြုနိုင်ရန် အတွက် သတ်မှတ်ချက်များအား ရေးသားရန် လိုအပ်ပါသည်။ အဆိုပါ သတ်မှတ်ချက် ဖိုင်များအား Tag Lib Description ဖိုင် (TLD ဖိုင်) ဟု ခေါ်ဆိုပါသည်။ အဆိုပါ ဖိုင်များအား ****.tld ဟု ရေးသားရန် လိုအပ်ပြီး၊ www အပလီကေးရှင်း Root ၏ အောက်တွင် ဘယ်နေရာတွင် မဆို သိမ်းဆည်းထားနိုင်ပါသည်။ အသုံးများသည်မှာ /WEB-INF ၏ အောက် ဒါမှမဟုတ် /WEB-INF/tld/ ၏ အောက်တွင် သိမ်းဆည်း ထားကြသည်က များပါသည်။

/WEB-INF/tld/mytag.tld
<?xml version="1.0" ?>
<!DOCTYPE taglib
  PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
  "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
  <tlib-version>1.0</tlib-version>
  <jsp-version>1.2</jsp-version>
  <short-name>my tags</short-name>
  <tag>
    <name>HelloTag</name>
    <tag-class>com.mmju.jsp.ep7.HelloTag</tag-class>
    <body-content>empty</body-content>
  </tag>
</taglib>
Tag Lib Descriptor သည် XML ပုံစံဖြင့် ရေးသားရန် လိုအပ်ပြီး၊ လိုအပ်သော Element များမှာ၊ tlib-version, jsp-version, short-name နှင့် အသုံးပြုမည့် tag များ ဖြစ်ကြသည်။

tag element တွင် ပါဝင်သော Element များမှာ အောက်ပါ အတိုင်းဖြစ်ကြပါသည်။
  1. name
    Custom Tag ၏ အမည်ကို ရေးသားရပါမည်။ JSP တွင် အသုံးပြုမည့် အမည် ဖြစ်ပါသည်။
  2. tag-class
    Custom Tag အဖြစ် အသုံးပြုမည့် Tag Handler ကလပ်စ်။
  3. body-content
    empty, jsp နှင့် tagdependent တို့မှ တစ်ခုခုကို ရေးသားရန် လိုအပ်ပါသည်။
  4. attribute
    Attribute အား အသုံးပြုမည် ဆိုပါက ရေးသားရန် လိုအပ်ပါသည်။
    name Attribute ၏ အမည်။
    required လိုအပ်ချက်ကို သက်မှတ်သည့် Element ဖြစ်ပါသည်။
    true : မရှိမဖြစ် လိုအပ်ပါသည်။
    false : မရှိမဖြစ် မဟုတ်ပါ။
    rtexprvalue တန်ဖိုးအား Evaluate လုပ်မည် မလုပ်မည်ကို သတ်မှတ်နိုင်သော Element ဖြစ်၏။
    true : Evaluate လုပ်မည် ဖြစ်ပြီး၊ value နေရာတွင် JSP ပုံစံဖြင့် ရေးသားထားပါက၊ ရလဒ်အား Attribute ၏ တန်ဖိုးအနေဖြင့် အသုံးပြုမည် ဖြစ်ပါသည်။
    false : Evaluate မလုပ်ပဲ ရိုးရိုး စာကြောင်းအနေဖြင့် အသုံးပြုမည် ဖြစ်ပါသည်။


JSP အတွင်းမှ အသုံးပြုခြင်း

ကျွှန်တော်တို့ Tag Handler ကလပ်စ်ကို ရေးပြီးပြီ၊ TLD ဖိုင်ကို ရေးပြီးပြီ၊ ကျန်သည်မှာ JSP အတွင်းမှ ရေးသားထားသော Custom Tag အား အသုံးပြုရန်ပင် ဖြစ်၏။ အမှန်မှာ ကျွှန်တော်တို့ JSTL တွင်လည်း Custom Tag များအား အသုံးပြုပြီးခဲ့ပြီ ဖြစ်၏။

Tag Directive ဖြင့် အသုံးပြုမည့် Custom Tag Lib အား ဖော်ပြပြီးနောက်၊ အတွင်းပိုင်းတွင် Custom Tag များအား အသုံးပြုသွားရုံသာ ဖြစ်၏။ လက်တွေ့ရေးသားထားသည် များကို လေ့လာကြည့်ပါဦးမည်။

hello.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<%@ taglib uri="/WEB-INF/tld/mytag.tld"  prefix="mytag"%>
<title>Insert title here</title>
</head>
<body>
<div style="width: 100%; text-align: right">
    <a href="javascript:history.back();">ယခင် စာမျက်နှာသို့</a>
</div>
<h3>7.1 Body မသုံးသော Tag</h3>
<div>
<mytag:HelloTag/>
</div>
<div>
Tag ၏ ဘော်ဒီအပိုင်းအား အသုံးမပြုသော Custom Tag တစ်ခု၏ နမှုနာတစ်ခုဖြစ်ပါသည်။<br/>
Tag#doEndTag လုပ်ဆောင်ချက်အတွင်းမှ JSP Writer အား အသုံးပြု၍ စာသားများအား ရိုက်ထုတ်နေခြင်းသာဖြစ်၏။
</div>
</body>
</html>
အထက် စာကြောင်း ၇ တွင် Tag Directive ဖြင့် အသုံးပြုမည့် Tag Lib အားဖော်ပြပြီး၊ စာကြောင်း ၁၆ တွင် ရေးသားထားသော Tagအား <mytag:HelloTag/> ဟု ခေါ်ယူ အသုံးပြုထားပါသည်။


အထက်ပါ ပွန်အတိုင်း Tag Handler ကလပ်စ်၏ Tag#doEndTag အတွင်း ရေးသားထားသည်များကို ဖော်ပြပေးနိုင်သည်ကို တွေ့ရပါသည်။

အထက်ပါနမှုနာ အတိုင်း Tagအင်တာဖေစ်အား ပံ့ပိုးပြီး Body အား အသုံးပြုသော Tag နှင့် Attribute အား အသုံးပြုသော နမှုနာများကိုလည်း ရေးသားထားပါသည်။ အောက်ပါ Src များတွင်နမှုနာ များကို လေ့လာနိုင်ပါသည်။

com.mmju.jsp.ep7.DateTag.java
com.mmju.jsp.ep7.HelloTag2.java

နောက်ရက်များတွင် Loop အနေဖြင့် အသုံးပြုမည့် Custom Tag ရေးသားပုံ အကြောင်းကို ဆက်လက် ဖော်ပြသွားပါဦးမည်။


ကိုးကား
http://www.techscore.com/tech/Java/JavaEE/JSP/5/

နမှုနာ
http://jsp-tutorials.minlwin.cloudbees.net/

Source
https://github.com/minlwin/mmju/tree/master/jsp-tutorials

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

No comments:

Post a Comment