bài 7,8: custom tag - lập trình mạng nâng cao
DESCRIPTION
Lập Trình Mạng Nâng Cao - Custom TagTRANSCRIPT
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