<?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