public static final int EVAL_BODY_AGAIN = 2;
<<interface Tag>>
public static final int SKIP_BODY = 0;
public static final int EVAL_BODY_INCLUDE = 1;
public static final int SKIP_PAGE = 5;
public static final int EVAL_PAGE = 6;
0、1給doStartTag()回傳
回傳0就調用doEndTag()
回傳1就調用doAfterBody()
0、2給doAfterBody()回傳
回傳0就調用doEndTag()
回傳2就調用自己,一直到回傳0為止
5、6給doEndTag()回傳
回傳5表示立即停止,忽略之後的頁面,但會將目前的輸出回傳到瀏覽器
回傳6表示正常結束
release():將資源全部釋放,修改後不重啟瀏覽器,過一下子就會直接調用
※SKIP_BODY、EVAL_BODY_INCLUDE
※AttrTag.java
public class AttrTag extends TagSupport { private String scope; private String content; // 這兩個屬性都給setter即可 @Override public int doStartTag() throws JspException { System.out.println("doStartTag"); Object value = null; if ("P".equals(scope)) { value = pageContext.getAttribute(content, PageContext.PAGE_SCOPE); } if ("R".equals(this.scope)) { value = pageContext.getAttribute(content, PageContext.REQUEST_SCOPE); } if ("S".equals(this.scope)) { value = pageContext.getAttribute(content, PageContext.SESSION_SCOPE); } if ("A".equals(this.scope)) { value = pageContext.getAttribute(content, PageContext.APPLICATION_SCOPE); } if (value == null) { return SKIP_BODY; } else { return EVAL_BODY_INCLUDE; } }
※attr.tld
<tag> <name>displayScope</name> <tag-class>attr.AttrTag</tag-class> <body-content>JSP</body-content> <attribute> <name>scope</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>content</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag>
body content變成JSP
※attr.jsp
<% String scope = "P"; if ("P".equals(scope)) { pageContext.setAttribute("ooo", scope); } else if ("R".equals(scope)) { request.setAttribute("ooo", scope); } else if ("S".equals(scope)) { session.setAttribute("ooo", scope); } else if ("A".equals(scope)) { application.setAttribute("ooo", scope); } %> <bruce:displayScope scope="<%=scope%>" content="ooo"> <h1>範圍:<%=scope%></h1> <h1>pageScope內容是${pageScope.ooo}</h1> <h2>requestScope內容是${requestScope.ooo}</h2> <h3>sessionScope內容是${sessionScope.ooo}</h3> <h4>applicationScope內容是${applicationScope.ooo}</h4> </bruce:displayScope>
※如果scope不輸入PRSA其中一個,就會調用SKIP_BODY
※SKIP_BODY、EVAL_BODY_AGAIN
※jsp
<% List<String> list = new ArrayList<String>(); list.add("A1"); list.add("B2"); list.add("C3"); request.setAttribute("ooo", list); %> <bruce:iterate content="ooo" id="abc"> ${abc}<br/> </bruce:iterate>
※
※tld
<tag> <name>iterate</name> <tag-class>attr.AttrHaveContent2</tag-class> <body-content>JSP</body-content> <attribute> <name>content</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>id</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag>
※
※java
public class AttrHaveContent extends TagSupport { private String content; private Iterator<?> it; public void setContent(String content) { this.content = content; } @Override public int doStartTag() throws JspException { System.out.println("doStartTag"); Object value = pageContext.getAttribute(content, PageContext.REQUEST_SCOPE); System.out.println("value=" + value); if (value == null) { return SKIP_BODY; } else { List<?> x = ((List<?>) value); // Set<String> x = ((Map<String, Object>) value).keySet(); // Collection<Object> x = ((Map<String, Object>) value).values(); it = x.iterator(); if (it.hasNext()) { pageContext.setAttribute(id, it.next()); return EVAL_BODY_INCLUDE; } return SKIP_BODY; } } @Override public int doEndTag() throws JspException { System.out.println("doEndTag"); return SKIP_PAGE; } @Override public int doAfterBody() throws JspException { System.out.println("doAfterBody"); if (it.hasNext()) { pageContext.setAttribute(id, it.next()); return EVAL_BODY_AGAIN; } else { return SKIP_BODY; } } }
※TagSupport.java裡有個屬性是id,是protected,所以可以不用宣告id,但要用時還是要在tld裡定義
※setValue、getValues
List<?> x = ((List<?>) value); for (int i = 0; i < x.size(); i++) { String s = (String) x.get(i); setValue(s.substring(1), "x"); } enu = getValues(); if (enu.hasMoreElements()) { pageContext.setAttribute(id, enu.nextElement()); return EVAL_BODY_INCLUDE; }
※TagSupport還有個Hashtable叫values,但它是private,但有setValue和getValues可以塞進去,getValues回傳值是Enumeration,和Iterator很像
※doAfterBody也改成Enumeration就可以取到值了,取到的是setValue的Key值
※SKIP_PAGE、EVAL_PAGE
※jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib uri="attrHaveContent" prefix="bruce"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head></head> <body> <bruce:endTagTest /> ooo </body> </html>
※
※web.xml
<jsp-config> <taglib> <taglib-uri>attrHaveContent</taglib-uri> <taglib-location>/WEB-INF/AttrHave.xml</taglib-location> </taglib> </jsp-config>
※
※tld
<taglib version="2.1" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"> <tlib-version>1.0</tlib-version> <short-name>ht</short-name> <tag> <name>endTagTest</name> <tag-class>attr.AttrHaveContent</tag-class> <body-content>empty</body-content> </tag> </taglib>
※
※java
public class AttrHaveContent extends TagSupport { @Override public int doEndTag() throws JspException { System.out.println("doEndTag"); JspWriter out = this.pageContext.getOut(); try { out.println("xxx"); } catch (IOException e) { e.printStackTrace(); } return SKIP_PAGE; } }
※回傳SKIP_PAGE時,不會印出ooo
沒有留言:
張貼留言