亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

EL函數以及自定義標簽的應用

2019-11-15 01:18:13
字體:
來源:轉載
供稿:網友
EL函數以及自定義標簽的應用

一、EL函數(調用普通類的靜態方法)

編寫步驟(自定義EL函數的編寫步驟即自定義標簽的編寫步驟):

①編寫一個普通的java類,提供一個靜態方法,功能自定,例如下:

1 package cn.wzbrilliant.el;2 3 public class ElFunction {4     public static String toUpperCase(String str){5         return str.toUpperCase();6     }7 }

②在JavaWeb應用的WEB-INF目錄下建立一個擴展名是tld(taglib definition)的xml文件。內容如下:

 1 <?xml version="1.0" encoding="UTF-8"?> 2 <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" 4     version="2.0"> 5     <tlib-version>1.0</tlib-version> 6     <short-name>myfn</short-name> 7     <uri>/WEB-INF/myfn.tld</uri> 8      9     <function><!-- 定義函數 -->10         <name>toUpper</name> <!-- 調用名稱 -->11         <function-class>cn.wzbrilliant.el.ElFunction</function-class> <!-- 類全名 -->12         <function-signature>java.lang.String toUpperCase( java.lang.String )</function-signature>13     </function>14     15 </taglib>

<tlib-version>值隨意

<short-name>一般與文件名、前綴名稱相同,方便查找,不相同也可。

<uri>值隨意,只要與web.xml中的uri想對應即可

③(可選步驟)前提是把tld文件放到了WEB-INF目錄下。告知應用,tld文件和tld中的uri的對應。修改web.xml,增加以下內容:

1 <jsp-config>2         <taglib>3             <taglib-uri>/WEB-INF/myfn.tld</taglib-uri>4             <taglib-location>/WEB-INF/myfn.tld</taglib-location>5         </taglib>6 </jsp-config>

<taglib> 代表一個標簽庫,可以多個

<taglib-location> tld文件的位置

④ 在JSP中使用

用taglib指令,引入自定義的EL函數庫:<%@ taglib uri="/WEB-INF/myfn.tld"

使用方式如下:

1 <%2         pageContext.setAttribute("p", "abcdef");3 %>4 5 ${myfn:toUpper(h) } <br/>6 ${myfn:toUpper("abcdef") }

代碼第五行和第六行都可輸出"ABCDEF"。

二、EL自定義標簽開發

自定義標簽屬于JSP技術

1、標簽的作用

移除掉JSP中的Java腳本(<%%>)

2、編寫自定義標簽的步驟(自定義EL函數,步驟相同)

自定義標簽分為兩種,傳統標簽和簡單標簽:

這里只介紹簡單標簽的開發:

①編寫一個類,直接或間接實現javax.servlet.jsp.tagext.Tag接口

這里繼承SimpleTagSupport類,例子如下:

 1 package cn.wzbrilliant.el; 2  3 import java.io.IOException; 4  5 import javax.servlet.jsp.JspException; 6 import javax.servlet.jsp.tagext.SimpleTagSupport; 7  8 public class SimpleTag extends SimpleTagSupport { 9 10     @Override11     public void doTag() throws JspException, IOException {12 //        JspFragment jf=getJspBody();13 //        jf.invoke(getJspContext().getOut());14         15         getJspBody().invoke(null);16         17     }18     19 }

JspFragment對象的invoke方法將標簽內容輸入到給定的流中,如果為null,例如上面代碼,則其作用與注釋部分代碼相同。

下面以一個獲取遠程ip地址的代碼為例:

 1 package cn.wzbrilliant.el; 2  3 import java.io.IOException; 4  5 import javax.servlet.jsp.JspException; 6 import javax.servlet.jsp.PageContext; 7 import javax.servlet.jsp.tagext.SimpleTagSupport; 8  9 public class SimpleTag extends SimpleTagSupport {10 11     @Override12     public void doTag() throws JspException, IOException {13         PageContext pageContext=(PageContext)getJspContext();14         String ip=pageContext.getRequest().getRemoteAddr();15         pageContext.getOut().write(ip);16     }17     18 }

②在WEB-INF目錄下建立一個擴展名為tld(Tag Libary Definition)的xml文件。

 1 <?xml version="1.0" encoding="UTF-8"?> 2 <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" 4     version="2.0"> 5  6     <tlib-version>1.0</tlib-version> 7     <short-name>mytag</short-name> 8     <uri>/WEB-INF/mytag.tld</uri> 9 10     <tag><!-- 描述標簽 -->11         <description>Show Remote Address</description>12         <name>remoteIp</name><!-- 標簽名稱 -->13         <tag-class>cn.wzbrilliant.el.SimpleTag</tag-class>14         <body-content>empty</body-content><!-- 指示標簽的主體內容:沒有就寫empty -->15     </tag>16 17 </taglib>

標簽內容與EL函數中tld文件中相似??梢蕴砑佣鄠€標簽。具體如下:

taglib:根元素

    tlib-version:版本號    short-name:引用標簽時的短名稱。一般與tld文件的文件名一致,好找?!   ri:標簽綁定的名稱空間。只是一個名字,沒有實際的意義。

    tag:定義標簽元素

        name:標簽的名稱。

        tag-class:標簽的實現類的全名稱。

        body-content:指示標簽的主體內容的類型。

                可選值:empty:沒有主體內容。適用于傳統和簡單標簽。

                    JSP:說明JSP文件中能出現什么,標簽主體內容中就能出現什么。適用于傳統標簽。

                    scriptless:說明標簽的主體內容不能是java腳本。適用于簡單標簽。

                    tagdependent:說明標簽的主體內容是原封不動的傳遞給標簽處理類的,而不是傳遞的運算結果

        attribute:定義標簽的屬性

        name:屬性名。對應標簽處理類中的setter方法

        required:是否是必須的屬性

        rtexprvalue:是否支持表達式(EL或java表達式)。默認是false。

③(可選的)在web.xml中對tld文件和名稱空間進行映射對應。

1 <jsp-config>2         <taglib>3             <taglib-uri>/WEB-INF/mytag.tld</taglib-uri>4             <taglib-location>/WEB-INF/mytag.tld</taglib-location>5         </taglib>6 </jsp-config>

此處配置與EL函數相同

⑤ 在JSP中使用

首先引入:<%@ taglib uri="/WEB-INF/mytag.tld" prefix="mytag"%>

使用方法:在jsp頁面中使用:<mytag:remoteIp /> 即可輸出訪問服務器的遠程的ip地址

3.簡單標簽的原理:

三、自定義標簽實例:

①實現JSTL中forEach標簽的功能

類代碼如下:

 1 package cn.wzbrilliant.el; 2  3 import java.io.IOException; 4 import java.lang.reflect.Array; 5 import java.util.ArrayList; 6 import java.util.Collection; 7 import java.util.List; 8 import java.util.Map; 9 import java.util.Set;10 11 import javax.servlet.jsp.JspException;12 import javax.servlet.jsp.PageContext;13 import javax.servlet.jsp.tagext.SimpleTagSupport;14 15 public class ForEachTag extends SimpleTagSupport {16     private String var;17     private Collection items;18     19     public void setItems(Object items) {20         if(items instanceof List){21             this.items=(List)items;22         }else if(items instanceof Set){23             this.items=(Set)items;24         }else if(items instanceof Map){25             this.items=((Map)items).entrySet();26         }else if(items.getClass().isArray()){27             this.items=new ArrayList();28             int length=Array.getLength(items);29             for(int i=0;i<length;i++){30                 this.items.add(Array.get(items, i));31             }32         }else{33             throw new RuntimeException("對不起,不支持的類型");34         }35     }36     public void setVar(String var) {37         this.var = var;38     }39     @Override40     public void doTag() throws JspException, IOException {41         PageContext pageContext=(PageContext) getJspContext();42         for(Object obj:items){43             pageContext.setAttribute(var, obj);44             getJspBody().invoke(null);45         }46     }47     48 }

mytag.tld文件中添加如下內容:

 1 <tag><!-- forEach標簽 --> 2         <description>for each</description> 3         <name>forEach</name> 4         <tag-class>cn.wzbrilliant.el.ForEachTag</tag-class> 5         <body-content>scriptless</body-content> 6         <attribute> 7             <name>items</name> 8             <required>true</required> 9             <rtexprvalue>true</rtexprvalue>10         </attribute>11         <attribute>12             <name>var</name>13             <required>true</required>14             <rtexprvalue>true</rtexprvalue>15         </attribute>16 </tag>

使用方法:

1  <%2     int[] arr = new int[] {1,2,3,4};3 4     pageContext.setAttribute("p", arr);5  %>6         7  <mytag:forEach items="${p}" var="v">8             ${v}<br>9  </mytag:forEach>

與JSTL中forEach標簽使用無異,如此便可遍歷數組、集合的元素。

②實現JSTL中when otherwise功能(與if-else結構相似)

實現用到了父標簽。父標簽的作用:用于子標簽之間數據的傳遞。

該例使用了三個標簽,分別為choose(父標簽),when,otherwise,用三個類實現。

父標簽choose實現類:

 1 package cn.wzbrilliant.el; 2  3 import java.io.IOException; 4  5 import javax.servlet.jsp.JspException; 6 import javax.servlet.jsp.tagext.SimpleTagSupport; 7  8 public class ChooseTag extends SimpleTagSupport { 9     private boolean flag=false;10     11     protected boolean isFlag(){12         return flag;13     }14     15     protected void setFlag(boolean flag){16         this.flag=flag;17     }18 19     @Override20     public void doTag() throws JspException, IOException {21 22         getJspBody().invoke(null);23     }24     25     26 }

子標簽when實現類:

 1 package cn.wzbrilliant.el; 2  3 import java.io.IOException; 4  5 import javax.servlet.jsp.JspException; 6 import javax.servlet.jsp.tagext.SimpleTagSupport; 7  8 public class WhenTag extends SimpleTagSupport { 9     private boolean test;10     11     public void setTest(boolean test){12         this.test=test;13     }14 15     @Override16     public void doTag() throws JspException, IOException {17         if(test){18             ChooseTag parent=(ChooseTag)getParent();19             parent.setFlag(true);20             getJspBody().invoke(null);21         }22     }23     24     25 }

子標簽otherwise實現類:

 1 package cn.wzbrilliant.el; 2  3 import java.io.IOException; 4  5 import javax.servlet.jsp.JspException; 6 import javax.servlet.jsp.tagext.SimpleTagSupport; 7  8 public class OtherwiseTag extends SimpleTagSupport { 9 10     @Override11     public void doTag() throws JspException, IOException {12         ChooseTag parent=(ChooseTag)getParent();13         if(!parent.isFlag()){14             getJspBody().invoke(null);15         }16     }17     18 }

mytag.tld中添加如下內容:

 1 <tag><!-- choose標簽 --> 2         <description>when otherwise</description> 3         <name>choose</name> 4         <tag-class>cn.wzbrilliant.el.ChooseTag</tag-class> 5         <body-content>scriptless</body-content> 6 </tag> 7      8 <tag><!-- when標簽 --> 9         <description>when otherwise</description>10         <name>when</name>11         <tag-class>cn.wzbrilliant.el.WhenTag</tag-class>12         <body-content>scriptless</body-content>13                 <attribute>14             <name>test</name>15             <required>true</required>16             <rtexprvalue>true</rtexprvalue>17         </attribute>18 </tag>19     20 <tag><!-- otherwise標簽 -->21         <description>when otherwise</description>22         <name>otherwise</name>23         <tag-class>cn.wzbrilliant.el.OtherwiseTag</tag-class>24         <body-content>scriptless</body-content>25 </tag>        

使用方法,在jsp中:

 1 <% 2     pageContext.setAttribute("p", arr); 3 %> 4  5          6 <mytag:choose> 7     <mytag:when test="${empty p }"> 8             there is empty 9     </mytag:when>10     <mytag:otherwise>11             <mytag:forEach items="${p }" var="v">12                     <br>${v}13             </mytag:forEach>14     </mytag:otherwise>15 </mytag:choose>

③html顯示文本中html代碼的過濾

例如留言板中,有時候需要將html代碼原樣輸出,而不解析。

實現類代碼如下:

 1 package cn.wzbrilliant.el; 2  3 import java.io.IOException; 4 import java.io.StringWriter; 5  6 import javax.servlet.jsp.JspException; 7 import javax.servlet.jsp.tagext.SimpleTagSupport; 8  9 public class HtmlTextFilterTag extends SimpleTagSupport {10 11     @Override12     public void doTag() throws JspException, IOException {13         StringWriter sw=new StringWriter();14         getJspBody().invoke(sw);15         String content=sw.toString();16         content = filter(content);17         getJspContext().getOut().write(content);18     }19 20     private String filter(String message) {21         if (message == null)22             return (null);23 24         char content[] = new char[message.length()];25         message.getChars(0, message.length(), content, 0);26         StringBuffer result = new StringBuffer(content.length + 50);27         for (int i = 0; i < content.length; i++) {28             switch (content[i]) {29             case '<':30                 result.append("&lt;");31                 break;32             case '>':33                 result.append("&gt;");34                 break;35             case '&':36                 result.append("&amp;");37                 break;38             case '"':39                 result.append("&quot;");40                 break;41             default:42                 result.append(content[i]);43             }44         }45         return (result.toString());46     }47 }

mytag.tld中添加如下內容:

1 <tag><!-- 文本中Html代碼過濾標簽 -->2         <description>htmlfilter</description>3         <name>htmlfilter</name>4         <tag-class>cn.wzbrilliant.el.HtmlTextFilterTag</tag-class>5         <body-content>scriptless</body-content>6 </tag>

使用方式:在jsp頁面中輸出文本數據時添加此標簽便可將文本中html代碼原樣輸出,而不解析。

防盜鏈標簽

防止別的網站、應用盜鏈,可以利用EL自定義標簽,將請求轉向其他URI(自定義的廣告等等)

實現代碼如下:

 1 package cn.wzbrilliant.el; 2  3 import java.io.IOException; 4  5 import javax.servlet.http.HttpServletRequest; 6 import javax.servlet.http.HttpServletResponse; 7 import javax.servlet.jsp.JspException; 8 import javax.servlet.jsp.PageContext; 9 import javax.servlet.jsp.tagext.SimpleTagSupport;10 11 public class RefererTag extends SimpleTagSupport {12     private String site;13     private String redirectPath;14 15     public void setSite(String site) {16         this.site = site;17     }18 19     public void setRedirectPath(String redirectPath) {20         this.redirectPath = redirectPath;21     }22 23     @Override24     public void doTag() throws JspException, IOException {25         PageContext pageContext = (PageContext) getJspContext();26         HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();27         HttpServletResponse response = (HttpServletResponse) pageContext.getResponse();28         String referer = request.getHeader("referer");29         if (referer != null && !referer.startsWith(site)) {30             String path;31             if (redirectPath.startsWith("/")) {32                 path = request.getContextPath() + redirectPath;33             } else {34                 String uri=request.getRequestURI();35                 path=uri.substring(0, uri.lastIndexOf("/")+1)+redirectPath;36             }37             response.sendRedirect(path);38         }39     }40 41 }

mytag.tld中添加如下內容:

 1 <tag><!-- 防盜鏈 --> 2         <description>referer</description> 3         <name>referer</name> 4         <tag-class>cn.wzbrilliant.el.RefererTag</tag-class> 5         <body-content>empty</body-content> 6         <attribute> 7             <name>site</name> 8             <required>true</required> 9             <rtexprvalue>true</rtexprvalue>10         </attribute>11         <attribute>12             <name>redirectPath</name>13             <required>true</required>14             <rtexprvalue>true</rtexprvalue>15         </attribute>16 </tag>

使用方法:在防盜鏈的頁面頭部添加:<mytag:referer site="http://localhost:8080/JavaWeb" redirectPath="error.jsp"/>,其中site值為本應用的URI,redirectPath是將外部應用的請求轉發的目標地址,可以是相對路徑,也可以是絕對路徑。

四、JSTL中的核心標簽庫(替換掉JSP中的Java腳本)

① c:if

作用:判斷是否為true,如果為true,那么標簽的主體內容就會顯示。屬性:test:必須的。要求必須是boolean的。支持表達式(EL或Java表達式)   var:保存test運算結果的變量   scope: 保存的域范圍。默認是page②c:forEach

遍歷:數組、List、Set、Map屬性:items:要遍歷的目標對象。支持表達式   var:變量名。指向當前遍歷的集合中的一個元素   begin:開始的索引(含)   end:結束的索引(含)   step:步長。默認是1   varStatus:取一個名字,引用了一個對象。該對象有以下方法:        int getIndex():當前記錄的索引號。從0開始        int getCount():當前記錄的順序。從1開始        boolean isFirst():是否是第一條記錄        boolean isLast():是否是最后一條記錄


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产亚洲精品美女| 中文字幕无线精品亚洲乱码一区| 亚洲xxxxx电影| 日韩精品中文在线观看| 国产欧美精品一区二区三区-老狼| 欧美日韩美女在线| 色综合久久久久久中文网| 精品国产精品三级精品av网址| 欧美中文在线观看| 久久99热精品这里久久精品| 人人爽久久涩噜噜噜网站| 欧美高清第一页| 清纯唯美日韩制服另类| 亚洲精品www| 亚洲男人天堂2024| 欧美性生交xxxxx久久久| 人人做人人澡人人爽欧美| 国产精品揄拍500视频| 亚洲国产精品久久久久| 欧美一级视频一区二区| 成人在线视频福利| 国产精品高清网站| 国产日韩精品视频| 久久99亚洲热视| 亚洲精品成a人在线观看| 欧美国产日韩精品| 久久久国产精品亚洲一区| 亚洲视频在线观看| 欧洲亚洲女同hd| 精品亚洲一区二区三区在线观看| 国产精品一区二区三| 一区二区三区国产在线观看| 久久成人这里只有精品| 亚洲欧美激情视频| 国产在线精品自拍| 欧美性猛交xxxx久久久| 久久久久久成人| 欧美视频二区36p| 精品亚洲夜色av98在线观看| 国产精品高精视频免费| 久久久久久久久久久久av| 国产精品爽爽爽| 九九热这里只有在线精品视| 国产精品美女在线| 欧美电影院免费观看| 国产美女久久久| 久久综合久久美利坚合众国| 欧美激情视频网址| 精品伊人久久97| 亚洲最新视频在线| 日韩精品视频在线播放| 国产精品久久久久久久电影| 久久精品国亚洲| 韩国视频理论视频久久| 色婷婷久久一区二区| 久久精品视频99| 久久青草福利网站| 国内精品久久久| 亚洲第一福利网站| 久久免费视频在线观看| 91精品国产91久久久久久久久| 中文字幕欧美精品在线| 欧美性20hd另类| 欧美电影在线观看网站| 国产精品尤物福利片在线观看| 亚洲高清在线观看| 欧美视频一区二区三区…| 庆余年2免费日韩剧观看大牛| 在线观看不卡av| 欧美日韩国产影院| 亚洲天堂av在线免费| 久久亚洲精品一区| 午夜精品一区二区三区在线视| 国产精品99久久久久久白浆小说| 欧美一级高清免费播放| 亚洲国产日韩欧美在线图片| 久久免费视频在线| 亚洲国产高清高潮精品美女| 日韩视频―中文字幕| 精品久久久久久久久中文字幕| 欧美激情一区二区三区在线视频观看| 国产98色在线| 国产精品海角社区在线观看| 中文字幕日韩有码| 久久久精品在线观看| 精品亚洲精品福利线在观看| 91人成网站www| 91免费在线视频| 7m第一福利500精品视频| 欧美性xxxx极品hd欧美风情| 九九热视频这里只有精品| 亚洲老板91色精品久久| 亚洲美女av在线播放| 亚洲午夜av电影| 欧美中文在线视频| 久久伊人精品一区二区三区| 日韩在线视频观看| 日韩av中文在线| 色播久久人人爽人人爽人人片视av| 国产午夜一区二区| 日韩网站免费观看高清| 国产精品久久久久999| 91干在线观看| 久热精品视频在线| 欧美尤物巨大精品爽| 最好看的2019的中文字幕视频| 亚洲免费电影一区| 国产精品中文字幕在线观看| 成人写真视频福利网| 日韩电影免费观看中文字幕| 亚洲人午夜精品| 国产精品视频xxx| 日韩美女主播视频| 91免费精品视频| 日韩av在线网站| 国产精品三级在线| 久久精品国产亚洲| 午夜欧美大片免费观看| 亚洲国产高清高潮精品美女| 亚洲免费影视第一页| 亚洲国产精品yw在线观看| 久久精品视频一| 久久久久久国产精品三级玉女聊斋| 中文字幕精品久久| 精品国产乱码久久久久久婷婷| 欧美做爰性生交视频| 精品国产一区二区在线| 欧美电影电视剧在线观看| 亚洲大胆美女视频| 国产精品你懂得| 日韩av片免费在线观看| 日韩精品视频免费在线观看| 亚洲人成电影在线| 欧美猛交ⅹxxx乱大交视频| 日韩av大片免费看| 午夜精品蜜臀一区二区三区免费| 久久香蕉国产线看观看网| 色在人av网站天堂精品| 欧美性猛交xxxx黑人| 91精品国产综合久久香蕉的用户体验| 热久久这里只有| 国产精品国内视频| 原创国产精品91| 欧美麻豆久久久久久中文| 亚洲国产欧美一区二区三区久久| 日本精品视频在线播放| 亚洲一区美女视频在线观看免费| 国产精品亚洲一区二区三区| 久久亚洲欧美日韩精品专区| 国产丝袜视频一区| 欧美性极品xxxx做受| 2019中文字幕在线观看| 国产精品av网站| 久久精品国产一区二区三区| 国产日韩欧美夫妻视频在线观看| 伊人精品在线观看| 亚洲国产欧美久久| 亚洲黄色片网站| 成人午夜激情网| 日韩av在线电影网| 欧美在线xxx| 欧美激情在线有限公司| 91亚洲精品一区| 大胆人体色综合|