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

Post on 28-Jun-2015

199 Views

Category:

Technology

3 Downloads

Preview:

Click to see full reader

DESCRIPTION

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

Transcript

Custom Tag

ThS Văn Thiên Hoàng

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

Các dạng Custom Tag

Tag Files Simple Tag handlers Classic Tag handlers

Classic Tag

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.

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

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;   }}

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>

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>

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;    } }

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>

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>

Đị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>

Đị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

Đị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>

Đị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; } }

Đị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>

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ẻ.

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>

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>

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.

Câu hỏi

top related