JSTL自定義標籤和核心標籤

自定義標籤:html

jsp中自定義標籤使用形式
代碼:
1<itcast:showtime/>
itcast 爲標籤的名字,即tld配置文件的名稱
showtime爲tld配置文件中tag標籤中的name值java

2書寫java類:
public class ShowTime extends SimpleTagSupport {程序員

 public void doTag() throws JspException, IOException {
  Date now=new Date();
  PageContext pc=(PageContext)getJspContext();   //繼承SimpleTagSupport的類中有jspContext的對象,這裏強轉成pagecontext的對象
  pc.getOut().write(now.toLocaleString());
 }
}web

 

java類須要實現simpleTag接口,咱們一把繼承SimpleTagSupport類
覆蓋doTag方法
java類中封裝須要執行的java代碼便可數組

3書寫配置文件 tld文件
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
    version="2.0">
    <tlib-version>1.0</tlib-version>
    <short-name>itcast</short-name>  //name和uri只是和jsp創建聯繫,並無實際意義
    <uri>www.itcast.cn</uri>
     <tag>
        <name>showtime</name>        //標籤的方法名
        <tag-class>text.jsp.ShowTime</tag-class>   //java類的全名
        <body-content>empty</body-content>     //開始標籤和結束標籤有沒有內容
    </tag>
 </taglib>緩存


simpleTag接口中的方法:
void doTag():由服務器調用。在JSP中遇到標籤時調用。
JspTag getParent():由程序員調用。獲取該標籤的父標籤對象。沒有返回nulltomcat

如下三個方法的共同特色:由服務器調用,在調用doTag以前就調完了。
void setJspBody(JspFragment jspBody):由服務器調用。傳入標籤的內容。
void setJspContext(JspContext pc):由服務器調用。傳入當前頁面的pageContext對象
void setParent(JspTag parent):由服務器調用。傳入你的爹。沒爹傳入null服務器

標籤的實際做用:
得到主體內容並輸出:
JspFragment jf=getJspBody();
jf.invoke(null);session

簡易寫法:
getJspBody().invoke(null);app

1 使得主體內容不顯示
<body-content>scriptless</body-content>//主體內容爲非腳本

2控制結束標籤後的內容不執行
throw new SkipPageException();

3控制主體內容重複運行
在類中寫入循環代碼便可
循環輸出主體內容代碼體現:
jsp:<itcast:ShowFor count="5">saq</itcast:ShowFor>  //count爲標籤屬性

itcast.tld:
<tag>
    <name>ShowFor</name>
    <tag-class>text.jsp.ShowFor</tag-class>
    <body-content>scriptless</body-content>
    //配置屬性
    <attribute>   
    <name>count</name>//屬性名
    <required>true</required>//是否必須輸入屬性值
    <rtexprvalue>true</rtexprvalue>//是否支持表達式
    </attribute>
</tag>

類:
public class ShowFor extends SimpleTagSupport {
 private int count;
 public void setCount(int count) {
  this.count = count;
 }


 public void doTag() throws JspException, IOException {
  for(int i=0;i<count;i++){
   getJspBody().invoke(null);//輸出主體內容,當爲null時,就輸出主體內容
  }
 }

}


4獲取主體內容,並操做主體內容後輸出
public void doTag() throws JspException, IOException {
 //獲取主體內容
 JspFragment jf=getJspBody();
 //將主體內容寫入字符緩存
 StringWriter sw=new StringWriter();
 jf.invoke(sw);
 //調用string的大寫轉換方法
 String jfString=sw.getBuffer().toString();
 jfString=jfString.toUpperCase();
 //輸出
 PageContext pc=(PageContext) getJspContext();
 pc.getOut().write(jfString);
}

 

body-content中的內容:
1 jsp 不考慮,傳統標籤處理類中
2 empty 傳統標籤和普通標籤都能用,主體中不能有內容
3 scriptless 簡單標籤使用,要求主體中有內容,但不能有「<」「%」,能夠有EL表達式,但不能有java表達式
4 tagdependent 簡單標籤使用,告訴類,主體標籤中的爲文本

 

實現if功能的標籤:
類:
public class IfSimpleTag extends SimpleTagSupport{
 private Boolean test;

 public void setTest(Boolean test) {
  this.test = test;
 }
 public void doTag() throws JspException, IOException {
  if(test){
   getJspBody().invoke(null);
  }
 }
}

jsp:
<%session.setAttribute("user", "djw");%>
<itcast:if test="${SessionScope.user==null}">
<a href="#">登陸</a>
</itcast:if>
<itcast:if test="${SessionScope.user!=null }">
<a href="#">註銷</a>
</itcast:if>


實現ifelse功能:
jsp:
<%pageContext.setAttribute("gender", "man");%>
  <itcast:choose>
  <itcast:when test="${gender=='man'}">
   男性
  </itcast:when>
  <itcast:else>
   女性
  </itcast:else>
   </itcast:choose>
父標籤類:

public class ChooseSimpleTage extends SimpleTagSupport {
 private Boolean flag=true;
 
 public Boolean getFlag() {
  return flag;
 }

 public void setFlag(Boolean flag) {
  this.flag = flag;
 }

 public void doTag() throws JspException, IOException {
   getJspBody().invoke(null);
 }
}

when類:
public class WhenSimpleTage extends SimpleTagSupport{
 private boolean test;
 
 public void setTest(boolean test) {
  this.test = test;
 }
 public void doTag() throws JspException, IOException {
  if(test){
   getJspBody().invoke(null);
   ChooseSimpleTage cst=(ChooseSimpleTage) getParent();
   cst.setFlag(false);
  }
 }
}
else類:
public class ElseSimpleTage extends SimpleTagSupport {

 public void doTag() throws JspException, IOException {
  ChooseSimpleTage cst=(ChooseSimpleTage) getParent();
  if(cst.getFlag()){
   getJspBody().invoke(null);
  }
 } 
}

for循環標籤(簡易)
jsp:
<body>
  <%
  List list=new ArrayList();
  list.add("aaa");
  list.add("bbb");
  list.add("ccc");
  pageContext.setAttribute("list", list);
  %>
 <itcast:for items="${list}" var="s">
  ${s}<br/>
 </itcast:for>
  </body>

 處理類:
 private List items;
 private String var;
 public void setItems(List items) {
  this.items = items;
 }
 public void setVar(String var) {
  this.var = var;
 }
 public void doTag() throws JspException, IOException {
  PageContext pc=(PageContext) getJspContext();
  if(items!=null){
   for(Object obj:items){
    pc.setAttribute(var, obj);
    getJspBody().invoke(null);
   }
  }
 }

 for循環加強版:
 jsp:
  <%
  Map map=new HashMap();
  map.put("a", "aaa");
  map.put("b", "bbb");
  map.put("c", "ccc");
  pageContext.setAttribute("map", map);
  %>
 <itcast:for2 items="${map.}" var="me">
  ${me.key}=${me.value}<br/>
 </itcast:for2>

 處理類:
 public class ForSimpleTage2 extends SimpleTagSupport {
 private Object items;
 private String var;
 private Collection collection=new ArrayList();
 public void setItems(Object items) {
  if(items instanceof List){
   collection=(Collection) items;
  }else if(items instanceof Map){
   collection=((Map) items).entrySet();
  }else if(items.getClass().isArray()){
  //基本類型數組不屬於Object[],屬於基本類型的數組,
  這裏的處理方式一併處理了基本類型數組和Object[]類型的數組

   int len=Array.getLength(items);
   for(int i=0;i<len;i++){
    collection.add(Array.get(items, i));
   }
  }
 }
 public void setVar(String var) {
  this.var = var;
 }
 public void doTag() throws JspException, IOException {
  PageContext pc=(PageContext) getJspContext();
   for(Object obj:collection){
    pc.setAttribute(var, obj);
    getJspBody().invoke(null);
   }
 }
 
}

實現html轉義的標籤:
jsp代碼:
 <%
pageContext.setAttribute("s", "<hr/>");
%>
<itcast:filter>
${s}
</itcast:filter>

處理類代碼:
public class Filter extends SimpleTagSupport {

 public void doTag() throws JspException, IOException {
  StringWriter sw=new StringWriter();
  getJspBody().invoke(sw);
  String str=sw.getBuffer().toString();
  String new_str=filter(str);
  getJspContext().getOut().write(new_str);
 }

 private String filter(String message) {
   if (message == null)
             return (null);

         char content[] = new char[message.length()];
         message.getChars(0, message.length(), content, 0);
         StringBuilder result = new StringBuilder(content.length + 50);
         for (int i = 0; i < content.length; i++) {
             switch (content[i]) {
             case '<':
                 result.append("&lt;");
                 break;
             case '>':
                 result.append("&gt;");
                 break;
             case '&':
                 result.append("&amp;");
                 break;
             case '"':
                 result.append("&quot;");
                 break;
             default:
                 result.append(content[i]);
             }
         }
         return (result.toString());

 }
}
其中filter方法在tomcat中有例子代碼,複製便可
 
 導入標籤庫:<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
jsptlcore核心標籤:
1   out:
<%
pageContext.setAttribute("s", "<hr/>");
%>
<c:out value="${s}" default="輸入錯誤" escapeXml="true"></c:out>
 default:輸入的對象沒法找到時輸出的值
 escapeXml:自動轉義html符號,默認值爲true

2 set標籤:
<c:set value="上海" var="s" scope="page"></c:set>

3 設置javabean的屬性:
<jsp:useBean id="person" class="jsp.core.Person"></jsp:useBean>
<c:set property="name" target="${person }" value="djw"></c:set>
${person.name}

4設置map的值:
<%
    Map map=new HashMap();
    map.put("a", "aaa");
    pageContext.setAttribute("map", map);
     %>
     <c:set property="b" value="bbb" target="${map }"></c:set>
     ${map.a}<br/>
     ${map.b }


5從指定域中刪除數據

 <c:set var="s1" value="pp" scope="page"></c:set>
 <c:remove var="s1" scope="page"/>
 入股scope不設置,則爲全部域範圍

6 除咯i異常:
<c:catch>
    
</c:catch>

7 循環遍歷:
<c:forEach items="" begin="" end="" step=""> 須要遍歷的內容</c:forEach>
items:須要遍歷的對象
begin:起始索引
end:結束索引
step: 遍歷間隔 默認爲1

foreach 遍歷集合數組和表格集合:
<%
     List<Person> list=new ArrayList<Person>();
     list.add(new Person("djw","男","上海"));
     list.add(new Person("www","男","北京"));
     pageContext.setAttribute("p", list);
      %>
      <table border="1">
       <tr>
       <th>姓名</th>
       <th>性別</th>
       <th>城市</th>
       </tr>
       <c:forEach items="${p}" var="fp" varStatus="vs">
       //varStatus是指向一個對象,該對象記錄着當前元素的一些信息
       //int getIndex  元素的索引
       //int getCount 元素的位數
       //boolean isFirst 是不是第一個元素
       //boolean isLast 是否爲最後一個元素
       <tr>
       <td>
       ${fp.name}
       </td>
       <td>
       ${fp.gender}
       </td>
       <td>
       ${fp.city}
       </td>
       </tr>
       </c:forEach>
      </table>

8 遍歷字符串標籤:

 <%
pageContext.setAttribute("s", "2014-06-11");
%>
<c:forTokens items="${s }" delims="-" var="p">
${p}<br/>
</c:forTokens>

9 包含標籤:
</c:forTokens>
<c:import url="/3.jsp"></c:import>       包含本應用中的地址
  <c:import url="http://www.baidu.com"></c:import> 包含外部地址

10轉發:
 <c:redirect url="/3.jsp"></c:redirect>

11  url(這裏完成了中文參數的編碼和url的重寫)<c:url value="/3.jsp" var="url"></c:url><c:param name="username" value="djw"></c:param>//上面語句至關調用了(<%pageContext.setAttribute("url", request.getContextPath()+"/3.jsp");%>)這個語句<a href="url"></a>

相關文章
相關標籤/搜索