bài 7,8: custom tag - lập trình mạng nâng cao

22
Custom Tag ThS Văn Thiên Hoàng

Upload: tuan-nguyen

Post on 28-Jun-2015

202 views

Category:

Technology


3 download

DESCRIPTION

Lập Trình Mạng Nâng Cao - Custom Tag

TRANSCRIPT

Page 1: Bài 7,8: Custom Tag - Lập Trình Mạng Nâng Cao

Custom Tag

ThS Văn Thiên Hoàng

Page 2: Bài 7,8: Custom Tag - Lập Trình Mạng Nâng Cao

Mô hình công nghệ

Các mã gọi trực tiếp Servlet Các mã gọi Servlet không trực tiếp (JSP) Beans Servlet/JSP MVC với sự kết hợp JSP, Servlet, Bean Custom tag MVC với Bean, Custom tag, và các

framework hỗ trợ Structs hoặc JSF.

Ứng Dụng

đơn giản

Ứng Dụng phức tạp

Page 3: Bài 7,8: Custom Tag - Lập Trình Mạng Nâng Cao

Các dạng Custom Tag

Tag Files Simple Tag handlers Classic Tag handlers

Page 4: Bài 7,8: Custom Tag - Lập Trình Mạng Nâng Cao

Classic Tag

Page 5: Bài 7,8: Custom Tag - Lập Trình Mạng Nâng Cao

Nội dung

Mô hình phân cấp trong xử lý tag Các bước để tạo một classic Tag Xử lý nội dung trong classic tag Định nghĩa thuộc tính giữa cặp thẻ Định nghĩa thuộc tính bên trong thẻ Định nghĩa thuộc tính động Đánh giá lại thẻ Bỏ qua phần còn lại của trang. Tóm tắt.

Page 6: Bài 7,8: Custom Tag - Lập Trình Mạng Nâng Cao

Mô hình phân cấp trong xử lý tag

Page 7: Bài 7,8: Custom Tag - Lập Trình Mạng Nâng Cao

Các bước để tạo một classic Tag Bước 1: viết một lớp kết thừa lớp TagSupport

và viết dè phương thức doStartTag().

package my;public class Classic extends TagSupport {   public int doStartTag() throws JspException {     try {      pageContext.getOut().print("Hello from a classic tag handler!!");     } catch (IOException e) {      e.printStackTrace();    }     return SKIP_BODY;   }}

Page 8: Bài 7,8: Custom Tag - Lập Trình Mạng Nâng Cao

Các bước để tạo một classic Tag (1)

Định nghĩa tập tin (.TLD) miêu tả tag trong thư viện. Đặt tập tin này trong thư mục WEB-INF.

<?xml version=“1.0” encoding=“UTF-8” ?><taglib ...>  <uri>nikojava</uri>   <tag>     <name>classic</name>     <tag-class>my.Classic</tag-class><body-content>empty</body-content>   </tag> </taglib>

Page 9: Bài 7,8: Custom Tag - Lập Trình Mạng Nâng Cao

Các bước để tạo một classic Tag (2) Gọi thẻ ra sử dụng.

<%@ taglib prefix="show" uri="nikojava" %> <html>   

<body>     <show:classic />  

  </body> </html>

Page 10: Bài 7,8: Custom Tag - Lập Trình Mạng Nâng Cao

Xử lý nội dung trong classic tag trả lại hằng EVAL_BODY_INCLUDE để sử dụng

phần thân của thẻ.

public class Classic extends TagSupport {    public int doStartTag() throws JspException {      try {       

pageContext.getOut().print("This is my body: ");      } catch (IOException e) {       e.printStackTrace();     }      return EVAL_BODY_INCLUDE;    } }

Page 11: Bài 7,8: Custom Tag - Lập Trình Mạng Nâng Cao

Xử lý nội dung trong classic tag (1) Định nghĩa thông tin thẻ .TLD

<tag>   <name>classic</name>   <tag-class>my.Classic</tag-class><body-content>scriptless</body-content> </tag>

Page 12: Bài 7,8: Custom Tag - Lập Trình Mạng Nâng Cao

Xử lý nội dung trong classic tag (2) Gọi thẻ ra sử dụng.

<%@ taglib prefix="show" uri="nikojava" %> <html>    <body>      <show:classic>Really useful contents!</show:classic>    </body> </html>

Page 13: Bài 7,8: Custom Tag - Lập Trình Mạng Nâng Cao

Định nghĩa thuộc tính giữa cặp thẻ Gọi thẻ ra sử dụng.

public class Classic extends TagSupport {    public int doStartTag() throws JspException {      pageContext.setAttribute("friend", "Nikos");      return EVAL_BODY_INCLUDE;    } }

<%@ taglib prefix="show" uri="nikojava" %><html>   <body>      <show:classic>Hello my friend ${friend}!!</show:classic></body> </html>

Page 14: Bài 7,8: Custom Tag - Lập Trình Mạng Nâng Cao

Định nghĩa thuộc tính bên trong thẻ

public class Classic extends TagSupport {    private String friend;    public int doStartTag() throws JspException {      try {        pageContext.getOut().append("Hey you " + friend + "!!");      } catch (IOException e) {       e.printStackTrace();     }      return EVAL_BODY_INCLUDE;    }    public void setFriend(String friend) {     this.friend = friend;   } }

Phải định nghĩa các phương thức thiết lập

Page 15: Bài 7,8: Custom Tag - Lập Trình Mạng Nâng Cao

Định nghĩa thuộc tính bên trong thẻ (1)

<tag>   <name>classic</name>   <tag-class>my.Classic</tag-class>   <body-content>empty</body-content><attribute>      <name>friend</name> <required>true</required>     <rtexprvalue>true</rtexprvalue>   </attribute> </tag> <%@ taglib prefix="show" uri="nikojava" %> <html>   <body>      <show:classic friend="Niko" />   </body> </html>

Page 16: Bài 7,8: Custom Tag - Lập Trình Mạng Nâng Cao

Định nghĩa thuộc tính động

public class Classic extends TagSupport implements DynamicAttributes { private Map<String, Object> map = new HashMap<String, Object>();    public void setDynamicAttribute(String uri, String name, Object value) {     map.put(name, value);   } public int doStartTag() throws JspException {    try {      JspWriter out = pageContext.getOut();      out.append("These are the dynamic attributes:");     out.append("<ul>");      for (Map.Entry<String, Object> element : map.entrySet()) {      out.append("<li>");        out.append(element.getKey() + " ⇒ " + element.getValue());       out.append("</li>");      }      out.append("</ul>>");    } catch (IOException e) {     e.printStackTrace();   }    return SKIP_BODY; } }

Page 17: Bài 7,8: Custom Tag - Lập Trình Mạng Nâng Cao

Định nghĩa thuộc tính động (1)

<tag>    <name>classic</name>   <tag-class>my.Classic</tag-class>   <body-content>empty</body-content>   <dynamic-attributes>true</dynamic-attributes> </tag>

<%@ taglib prefix="show" uri="nikojava" %> <html>   <body>     <show:classic custom="tag" open="source" javafx="cool" />   </body> </html>

Page 18: Bài 7,8: Custom Tag - Lập Trình Mạng Nâng Cao

Lặp lại phần thân nhiều lần

public class Classic extends TagSupport {    private int counter;    public int doStartTag() throws JspException {      counter = 0;     return EVAL_BODY_INCLUDE;    }   public int doAfterBody() throws JspException {     while (counter < 3) {       counter++;       return EVAL_BODY_AGAIN;     }     return SKIP_BODY;   } }

Sử dụng phương thức doAfterBody() để thực hiện đánh giá lại thẻ.

Page 19: Bài 7,8: Custom Tag - Lập Trình Mạng Nâng Cao

Lặp lại phần thân nhiều lần (1)

<tag>   <name>classic</name>   <tag-class>my.Classic</tag-class>   <body-content>scriptless</body-content> </tag>

<%@ taglib prefix="show" uri="nikojava" %> <html>   <body>     <show:classic>Hello </show:classic>   </body> </html>

Page 20: Bài 7,8: Custom Tag - Lập Trình Mạng Nâng Cao

Bỏ qua phần còn lại của trang

public class Classic extends TagSupport {  public int doStartTag() throws JspException {    return EVAL_BODY_INCLUDE;  }  public int doEndTag() throws JspException {    return SKIP_PAGE;  }} <tag>  <name>classic</name>  <tag-class>my.Classic</tag-class>  <body-content>scriptless</body-content></tag> <%@ taglib prefix="show" uri="nikojava" %><html>  <body>    (Start of page)    <show:classic>Hello from a classic tag!</show:classic>    (End of page)  </body></html>

Page 21: Bài 7,8: Custom Tag - Lập Trình Mạng Nâng Cao

Tóm tắt

doStartTag được gọi đầu tiên. Các giá trị trả lại có thể là: EVAL_BODY_INCLUDE = đánh giá phần thân một lần. SKIP_BODY = bỏ qua không đánh giá phần thân thẻ.

doAfterBody được gọi khi doStartTag() trả lại giá trị 1. Nó trả lại các giá trị: EVAL_BODY_AGAIN = đánh giá lại phần thân thẻ lần

nữa. SKIP_BODY = dùng đánh giá phần thân thẻ.

doEndTag được gọi lần cuối. Giá trị trả lại có thể là: SKIP_PAGE = bỏ qua phần còn lại của trang. EVAL_PAGE = đánh giá phần còn lại của trang.

Page 22: Bài 7,8: Custom Tag - Lập Trình Mạng Nâng Cao

Câu hỏi