Thứ Sáu, 4 tháng 7, 2014

Custom tag in JSP page

         1.Custom tags
Custom tag được mô tả chi tiết trong 1 file XML gọi là tag library, trong file XML chúng ta khai báo các thẻ có trong bộ custom tag và các class thực thi của từng thẻ. Các class thực thi được gọi là các tag handler; chúng ta có 2 loại class handler:
-         Simple tag handler: chỉ dùng cho các thẻ không có các thành phần chứa scripting và không có body
-         Classic tag handler: được sử dụng khi các thành phần của thẻ có chứa scripting.
Khi một trang JSP có chứa custom tag được chuyển đổi sang servlet, các custom tag sẽ được chuyển đổi sang các phương thức được khai báo trong tag handler. Khi Web container thực thi trang JSP, các phương thức này sẽ được gọi kèm theo.

 Ưu điểm của Custom tags:
Custom tag có 3 ưu điểm chính sau:
-         Tách rời các phương thức logic khỏi lớp View: Custom tag và Scriptlet cung cấp các chức năng tương đương. Điểm khác biệt giữa 2 kỹ thuật này là chúng được viết ở nơi nào. Trong khi scriptlet cho phép nhúng trực tiếp 1 đoạn code vào trong trang JSP, custom tag là những đoạn code chạy phía sau để tổ chức lại HTML.
-         Dễ sử dụng: Custom tag rất dễ sử dụng cho người lập trình Java hay người không biết lập trình Java.
-         Dễ cài đặt: Custom tag sau khi xây dựng xong sẽ được đóng gói vào file jar và có thể sử dụng cho nhiều trang web khác nhau.
Hình sau mô tả các thành phần của Custom tag:


         2.Tag library descriptor

         Đây là một file XML mô tả các custom tags trong ứng dụng JSP. Nó định nghĩa 1 custom tag và được          lưu với phần mở rộng .tld.

      3.Tag handler

         là một file java đơn giản chứa code cho các chức năng của custom tag. Có 2 loại classic simple.

             Từng bước tạo 1 custom tag:

TLD là một xml file định nghĩa thư viện thẻ và các thẻ. Dòng đầu tiên là xml header chuẩn:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
"http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
     TLD file chứa thẻ gốc <taglib. Thẻ này có các thẻ con sau:
·         tlibversion
·         jspversion
·         shortname
·         info
·         uri
·         tag
1)    tlibversion chỉ định version của thư viện thẻ có định dạng sau:
([0-9])* ("." [0-9])? ("." [0-9])? ("." [0-9])?
 
2)    The jspversion chỉ định JSP version. Định dạng giống với tlibversion:
([0-9])* ("." [0-9])? ("." [0-9])? ("." [0-9])?
3)    shortname chỉ định shortname của thu viện tag library. Giá trị này phải bắt đầu bằng chữ và không chứa khoảng trắng.
4)    info chứa thông tin cho mục đích làm tài liệu. Dữ liệu mặc định là rỗng.
5)    uri chỉ định link trỏ đến thư viện thẻ.
     6)  tag là thành phần quan trọng nhất của tag library. Bạn có thể chỉ định hơn 1 thẻ tag.


      Demo tạo custom tags:
Tạo TLD có nội dung như sau:
       <?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
"http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
<taglib>
    <tlibversion>1.0.123.123.234</tlibversion>
    <jspversion>1.2</jspversion>
    <shortname></shortname>
    <info>Example tags</info>
    <uri></uri>
    <tag>
        <name>myTag</name>
        <tagclass>com.aptech.customtag.HelloTag</tagclass>
        <attribute>
            <name>name</name>
            <required>true</required>
        </attribute>
    </tag>
</taglib>

Khai báo trong web.xml

<jsp-config>
      <taglib>
            <taglib-uri>/hello</taglib-uri>
            <taglib-location>/WEB-INF/tlds/hello.tld</taglib-location>
      </taglib>
</
jsp-config>

Tạo Tag Handler

package com.aptech.customtag;

import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;

public class HelloTag extends TagSupport {

    private String name;

    public int doEndTag() throws JspException {
        JspWriter out = pageContext.getOut();
        try {
            out.println("<hr/>");
        } catch (Exception e) {
        }
        return super.doEndTag();
    }

    /**
     * @return the name
     */
    public String getName() {
        return name;
    }

    /**
     * @param name the name to set
     */
    public void setName(String name) {
        this.name = name;
    }

    public int doStartTag() {
        try {
            JspWriter out = pageContext.getOut();
            out.println("<hr/>");
                out.println("Hello " + name);
        } catch (Exception ex) {
            throw new Error("All is not well in the world.");
        }
        return SKIP_BODY;
    }                  
}

Xử lý tag trong JSP

<%@ taglib uri="/WEB-INF/tlds/hello.tld" prefix="hello" %>
<html>
        <head>
                <title>Your Standard Hello World Demo</title>
        </head>
        <body bgcolor="#ffffff">
                <hello:myTag name="Hai"/>
        </body>
</html>

Không có nhận xét nào:

Đăng nhận xét