熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> JSP教程 >> 正文

JSP自定義標簽實現數據字典

2013-11-15 12:06:31  來源: JSP教程 

  關於JSP標簽的好處就不再羅嗦

  數據字典就是使用的下拉框只要定義使用那個字典就會將這個字典可用的內容顯示出來

  顯示字典時只要定義那個字典和屬性值就可以顯示出字典的顯示值

  首先在webxml中定義自定義標簽加載的引用兩個屬性分別是引用的URI和加載路徑

  

  1. <?xml version="" encoding="UTF"?>    
  2. <webapp version="" xmlns="
  3.     xmlns:xsi="
  4.     xsi:schemaLocation="
  5.     
  6.     <welcomefilelist>    
  7.         <welcomefile>indexjsp</welcomefile>    
  8.     </welcomefilelist>    
  9.     <jspconfig>    
  10.         <taglib>    
  11.             <tagliburi>/tld/webhtml</tagliburi>    
  12.             <tagliblocation>    
  13.                 /WEBINF/tlds/webhtmltld    
  14.             </tagliblocation>    
  15.         </taglib>    
  16.     </jspconfig>    
  17. </webapp>   

  在webhtmltld中定義自己的標簽數據字典應用的話我們需要一個標簽庫三個標簽分別是select標簽options標簽和現實數據字典的標簽每個標簽都對應不同的實現類

  

  1. <?xml version="" encoding="UTF"?>    
  2. <!DOCTYPE taglib PUBLIC "//Sun Microsystems Inc//DTD JSP Tag Library //EN"      
  3.     "
  4. <taglib>    
  5.     <tlibversion></tlibversion><! 標簽庫版本 >    
  6.     <jspversion></jspversion>  <! 標簽庫要求的JSP規范版本 >    
  7.   &

  
nbsp; <shortname>html</shortname>   <! JSP頁面編寫工具可以用來創建助記名的可選名字 >    

  •     <tag>    
  •         <name>select</name>    
  •         <tagclass>comSelectTag</tagclass>    
  •         <bodycontent>JSP</bodycontent>    
  •         <attribute>    
  •             <name>name</name>    
  •             <rtexprvalue>true</rtexprvalue>    
  •         </attribute>    
  •         <attribute>    
  •             <name>style</name>    
  •             <rtexprvalue>true</rtexprvalue>    
  •         </attribute>    
  •     </tag>    
  •     <tag>    
  •         <name>options</name>    
  •         <tagclass>comOptionsTag</tagclass>    
  •         <bodycontent>JSP</bodycontent>    
  •         <attribute>    
  •             <name>collection</name>    
  •             <rtexprvalue>true</rtexprvalue>    
  •         </attribute>    
  •     </tag>    
  •     <tag>    
  •         <name>selectDisplay</name>    
  •         <tagclass>comSelectDisplay</tagclass>    
  •         <

  
;bodycontent>JSP</bodycontent>    

  •         <attribute>    
  •             <name>collection</name>    
  •             <rtexprvalue>true</rtexprvalue>    
  •         </attribute>    
  •         <attribute>    
  •             <name>name</name>    
  •             <rtexprvalue>true</rtexprvalue>    
  •         </attribute>    
  •         <attribute>    
  •             <name>value</name>    
  •             <rtexprvalue>true</rtexprvalue>    
  •         </attribute>    
  •     </tag>    
  • </taglib>   

  實現類

  實現類的作用就是在後台拼接所需HTML標簽內容然後由JSP進行輸出

  實現類最主要的兩個方法一個遇到這個標簽開始時輸出一個是結束時輸出

  如果需要定義屬性可以參考實現類定義屬性並在TLD中定義在JSP中使用標簽時快捷鍵就可以出來這個屬性

  首先是select標簽的代碼

  

  1. package com;    
  2. import javaioIOException;    
  3. import javaxservletjspJspException;    
  4. import javaxservletjspJspTagException;    
  5. import javaxservletjsptagextBodyTagSupport;    
  6. /**   
  7.  * TagSupport與BodyTagSupport的區別:   
  8.  * 主要看標簽處理類是否要讀取標簽體的內容和改變標簽體返回的內容如果不需要就用TagSupport否則就用BodyTagSupport   
  9.  * 用TagSupport實現的標簽都可以用BodyTagSupport來實現因為BodyTagSupport繼承了TagSupport   
  10.  */    
  11. @SuppressWarnings("serial")    
  12. public class SelectTag extends BodyTagSupport {    
  13.     @Override    
  14.     public int doStartTag() throws JspException {    
  15.      &nb

  
sp;  try {    

  •             StringBuffer results = new StringBuffer("<select");    
  •             if(name != null){    
  •                 resultsappend(" name=\"");    
  •                 resultsappend(name);    
  •                 resultsappend("\"");    
  •             }    
  •             if(style != null){    
  •                 resultsappend(" style=\"");    
  •                 resultsappend(style);    
  •                 resultsappend("\"");    
  •             }    
  •             resultsappend(">");    
  •             pageContextgetOut()write(resultstoString());    
  •         } catch (IOException ex) {    
  •             throw new JspTagException("錯誤");    
  •         }    
  •         return EVAL_BODY_INCLUDE;    
  •     }    
  •     @Override    
  •     public int doEndTag() throws JspException {    
  •         try {    
  •             StringBuffer results = new StringBuffer("");   &nbs

  
p;

  •             // 因為下拉中包含下拉內容所以只能在遇到結束標簽時才能寫select結束    
  •             resultsappend("</select>");              
  •             pageContextgetOut()write(resultstoString());    
  •         } catch (IOException ex) {    
  •             throw new JspTagException("錯誤");    
  •         }    
  •         return EVAL_PAGE;    
  •     }    
  •     // 樣式    
  •     protected String style;    
  •     // 名字    
  •     protected String name;    
  •     public String getStyle() {    
  •         return style;    
  •     }    
  •     public void setStyle(String style) {    
  •         thisstyle = style;    
  •     }    
  •     public String getName() {    
  •         return name;    
  •     }    
  •     public void setName(String name) {    
  •         thisname = name;    
  •     }       
  •     /**   
  •     doStartTag()方法是遇到標簽開始時會呼叫的方法其合法的返回值是EVAL_BODY_INCLUDE與SKIP_BODY前者表示將顯示標簽間的文字後者表示不顯示標簽間的文字   
  •     doEndTag()方法是在遇到標簽結束時呼叫的方法其合法的返回值是EVAL_PAGE與SKIP_PAGE前者表示處理完標簽後繼續執行以下的JSP網頁後者是表示不處理接下來的JSP網頁   
  •     doAfterBody()這個方法是在顯示完標簽間文字之後呼叫的其返回值有EVAL_BODY_AGAIN與SKIP_BODY前者會再顯示一次標簽間的文字後者則繼續執行標簽處理的下一步   
  •     EVAL_BODY_INCLU

  
DE把Body讀入存在的輸出流中doStartTag()函數可用   

  •     EVAL_PAGE繼續處理頁面doEndTag()函數可用   
  •     SKIP_BODY忽略對Body的處理doStartTag()和doAfterBody()函數可用   
  •     SKIP_PAGE忽略對余下頁面的處理doEndTag()函數可用   
  •     EVAL_BODY_BUFFERED申請緩沖區由setBodyContent()函數得到的BodyContent對象來處理tag的body如果類實現了BodyTag那麼doStartTag()可用否則非法   
  •     EVAL_BODY_AGAIN請求繼續處理body返回自doAfterBody()這個返回值在你制作循環tag的時候是很有用的     
  •     預定的處理順序是doStartTag()返回SKIP_BODYdoAfterBodyTag()返回SKIP_BODYdoEndTag()返回EVAL_PAGE   
  •     如果繼承了TagSupport之後如果沒有改寫任何的方法標簽處理的執行順序是doStartTag() >不顯示文字 >doEndTag()>執行接下來的網頁    
  •     如果您改寫了doStartTag()則必須指定返回值   
  •     如果指定了EVAL_BODY_INCLUDE則執行順序是doStartTag()>顯示文字>doAfterBodyTag()>doEndTag()>執行下面的網頁   
  •      */    
  • }   

  關於返回參數返回具體數字也可以不用過於糾結

  然後是下拉內容實現類

  

  1. package com;    
  2. import javaioIOException;    
  3. import javaxservletjspJspException;    
  4. import javaxservletjspJspTagException;    
  5. import javaxservletjsptagextBodyTagSupport;    
  6. @SuppressWarnings("serial")    
  7. public class OptionsTag extends BodyTagSupport {    
  8.     @Override    
  9.     public int doStartTag() throws JspException {    
  10.         return EVAL_BODY_INCLUDE;    
  11.     }    
  12.     @Override    
  13.     public int doEndTag() throws JspException {    
  14.         try {    
  15.             StringBuffer results = new StringBuffer("");    
  16.             if ("SEX"equals(collection)) {    
  17.                 resultsappend("<optio

  
n value=\"\"  selected=\"selected\">請選擇</option>");    

  •                 resultsappend("<option value=\"\">男</option>");    
  •                 resultsappend("<option value=\"\">女</option>");    
  •             }    
  •             pageContextgetOut()write(resultstoString());    
  •         } catch (IOException ex) {    
  •             throw new JspTagException("錯誤");    
  •         }    
  •         return EVAL_PAGE;    
  •     }    
  •     // collection只是傳遞一個標識具體下拉值內容是從數據庫取還是從請求中得到為不同具體實現    
  •     protected String collection;    
  •     public String getCollection() {    
  •         return collection;    
  •     }    
  •     public void setCollection(String collection) {    
  •         thiscollection = collection;    
  •     }    
  • }   

  具體你的字典數據從數據庫中如何存儲如何查詢可以自定義實現

  顯示的標簽實現為了將來可以在頁面取到標簽內容值我們定義隱藏域來保存屬性值然後在顯示顯示內容

  

  1. package com;    
  2. import javaioIOException;    
  3. import javaxservletjspJspException;    
  4. import javaxservletjspJspTagException;    
  5. import javaxservletjsptagextBodyTagSupport;    
  6. @SuppressWarnings("serial")    
  7. public class SelectDisplay extends BodyTagSupport {    
  8.     @Override    
  9.     public int doStartTag() throws JspExce

  
ption {    

  •         try {    
  •             StringBuffer results = new StringBuffer("");    
  •             pageContextgetOut()write(resultstoString());    
  •         } catch (IOException ex) {    
  •             throw new JspTagException("錯誤");    
  •         }    
  •         return EVAL_BODY_INCLUDE;    
  •     }    
  •     @Override    
  •     public int doEndTag() throws JspException {    
  •         try {    
  •             StringBuffer results = new StringBuffer("");    
  •             if ("SEX"equals(collection)) {    
  •                 resultsappend("<span>");    
  •                 resultsappend("<input type=\"");    
  •                 resultsappend("hidden\" name=\"");    
  •                 resultsappend(getName());    
  •                 resultsappend("\"");    
  •                 resultsappend(" value=\"");    
  •                 resultsappend(getValue());    
  •                 resultsappend("\">");     &nb

  
sp;             

  •                 if (""equals(getValue())) {    
  •                     resultsappend("男");    
  •                 } else if (""equals(getValue())) {    
  •                     resultsappend("女");    
  •                 } else {    
  •                     resultsappend("請選擇");    
  •                 }    
  •                 resultsappend("</span>");    
  •             }    
  •             pageContextgetOut()write(resultstoString());    
  •         } catch (IOException ex) {    
  •             throw new JspTagException("錯誤");    
  •         }    
  •         return EVAL_PAGE;    
  •     }    
  •     // collection只是傳遞一個標識具體下拉值內容是從數據庫取還是從請求中得到為不同具體實現    
  •     protected String collection;    
  •     // 傳遞的值    
  •     protected String value;    
  •     // 該屬性的名稱    
  •     protected String name;    
  •     public String getCollection() {    
  •         return collection;    
  •   
        }    

  •     public void setCollection(String collection) {    
  •         thiscollection = collection;    
  •     }    
  •     public String getName() {    
  •         return name;    
  •     }    
  •     public void setName(String name) {    
  •         thisname = name;    
  •     }    
  •     public String getValue() {    
  •         return value;    
  •     }    
  •     public void setValue(String value) {    
  •         thisvalue = value;    
  •     }    
  • }   
  •   JSP中引用直接在indexjsp中引用

      需要引入相應的標簽內容引入的方式在JSP頭部引用

      標簽的屬性可以設置也可以不設置標簽的使用和HTML標簽的使用是一樣的定義屬性即可

      

    1. <%@ page language="java" pageEncoding="UTF"%>    
    2. <%@ taglib uri="/tld/webhtml" prefix="html"%>    
    3. <!DOCTYPE HTML PUBLIC "//WC//DTD HTML  Transitional//EN">    
    4. <html>    
    5.     <head>    
    6.         <title>JSP 自定義標簽的實現</title>    
    7.     </head>    
    8.     <body>    
    9.         請選擇    
    10.         <html:select name="sex" style="width:px">    
    11.             <html:options collection="SEX"></html:options>    
    12.         </html:select>    
    13.         顯示性別 &nb

      sp;  


From:http://tw.wingwit.com/Article/program/Java/JSP/201311/20301.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.