JSP - Custom Tag

<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
  http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd ">
  <tlib-version>1.2</tlib-version>
  <short-name>NMTOKEN</short-name>

  <uri>DiceFunction</uri>

  <!-- สำหรับ Custom Tag -->
  <tag>
    <description>random advice</description>
    <name>advice</name>
    <tag-class>package.AdvisorTagHandler</tag-class>
    <body-content> empty | scriptlet | tagdependent </body-content>

    <attribute>
      <name>user</name>
      <required> true | false </required>
      <rtexprvalue> true | false </rtexprvalue>
      <type>int | java.lang.String | etc. </type>
    </attribute>
    [<attribute> ... </attribute>]
    <dynamic-attributes> true | false </dynamic-attributes>
  </tag>

  <!-- สำหรับ tag file -->
  <tag-file>
    <name>Header</name>
    <path>/META-INF/tags/Header.tag</path>
  </tag-file>

  <!-- สำหรับ function -->
  <function>
    <name>rollIt</name>
    <function-class>com.amadmonster.scwcd.el.function.DiceRoller</function-class>
    <function-signature>int rollDice()</function-signature>
  </function>

  <!-- สำหรับ function ที่รับตัวแปร -->
  <function>
    <name>rollWith</name>
    <function-class>com.amadmonster.scwcd.el.function.DiceRoller</function-class>
    <function-signature>int rollDice(int)</function-signature>
  </function>

</taglib>

Custom Tag

<name> ของ <tag> จะเป็นชื่อที่ใช้อ้างใน JSP
<body-content> ของ <tag> สามารถเป็น
  • empty - ไม่มี body
  • scriptless - สามารถเป็น static text, EL expressions, standard action และ custom tags ได้ แต่จะใส่ JSP scriptlet () ไม่ได้
  • tagdependent - ค่า EL จะไม่ถูกแปล และถูกส่งให้ Custom Tag เสมือน plain-text เพื่อให้แปลด้วย Custom Tag เอง

<tag-class> เป็นชื่อ Package และ Class ของ Tag Handler
<attribute> จะบรรยายลักษณะของแต่ละ attribute ของ Custom Tag
<rtexprvalue> จะบอกว่า attribute ตัวนี้สามารถรับเป็น อย่างอื่นที่ไม่ใช่ text ได้หรือไม่ (เช่น EL expression, custom tag, scriptlet) (default: falue)
<type>
เป็นชนิดของ attribute ซึ่งใส่เป็น fully-qualified class name ยกเว้น primitive data type ซึ่งใส่ได้ตรงๆ เช่น int, char ในกรณีที่ไม่ใส่ ค่าอะไรเลย default จะเป็น java.lang.String
<dynamic-attributes> ใช้ config ว่า tag นี้จะรับ attribute แบบ dynamic หรือไม่ ซึ่งถ้าเป็น true ตัว tag handler จะต้อง implement DynamicAttributes


สำหรับ Custom Tag สามารถ implement ได้ 2 แบบ แบบแรกคือการ Simple Tag ซึ่งจะ extend SimpleTagSupport และมี life cycle ดังนี้




แบบที่ 2 คือ แบบ Classic Tag ซึ่งจะ extend TagSupport หรือ BodyTagSupport ซึ่งสามารถแก้ไข body ของ tag ที่จะแสดงออกไปได้ ซึ่งมี life cycle ดังนี้




และ State Diagram ของ TagSupport และ BodyTagSupport ดังนี้



Reference:
Tag Library Descriptor

No comments:

Post a Comment