el表达式

【el表达式】
EL全名为Expression Language EL主要作用:
获取数据:
EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域中检索java对象、获取数据。(某个web域中的对象,访问javabean的属性、访问list集合、访问map集合、访问数组)
执行运算:
利用EL表达式可以在JSP页面中执行一些基本的关系运算、逻辑运算和算术运算,以在JSP页面中完成一些简单的运算。${user==null}
获取web开发常用对象
EL表达式定义了一些隐式对象,web开发人员可以很轻松获得对web常用对象的引用,从而获得这些对象中的数据。
调用Java方法
EL表达式允许用户开发定义EL函数,已在JSP页面中通过EL表达式调用Java类的方法。


【获取数据】
使用EL表达式获取数据语法:"${标识符}"
EL表达式语句在执行时,会调用pageContext.findAttribute方法,使用标识符为关键字,分别从page、request、session、application四个域中查找相应对象,找到则返回相应对象,找不到则返回""(注意,不是null,而是空字符串)。

示例:${user}

基本用法如下:

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <body>  
  2.  <%  
  3.         //分别在4个域对象中存储数据  
  4.         pageContext.setAttribute("name1", "唐僧");  
  5.         session.setAttribute("name2", "猪八戒");  
  6.         application.setAttribute("name3", "孙悟空");  
  7.         request.setAttribute("name4", "哆啦A梦");  
  8.  %>  
  9.  <pre>  
  10.         name1=${name1}  
  11.         name2=${name2}  
  12.         name3${name3}  
  13.         name4${name4}  
  14.  </pre>  
  15.    
  16.  <h3>演示使用er表达式:支持对象的导航</h3>  
  17.  <%  
  18.         User user=new User();  
  19.         user.setUsername("哆啦A梦");  
  20.         user.setAge(14);  
  21.           
  22.         Friend f=new Friend();  
  23.         f.setName("大雄");  
  24.           
  25.         Cat[] ct=new Cat[2];  
  26.         ct[0]=new Cat("胖虎","黑色");  
  27.         ct[1]=new Cat("小夫","绿色");  
  28.         f.setCats(ct);  
  29.         user.setFriend(f);  
  30.         session.setAttribute("user", user);  
  31.  %>  
  32.  <pre>  
  33.  //注意,这样的方式获取的值,相对应的属性必须提供get方法。  
  34.     获取"哆啦A梦"的名字:${user.username}  
  35.     或者这样获取:${user["username"]}  
  36.     获取"年龄":${user["age"] }  
  37.     获取哆啦A梦朋友的名字:${user.friend.name }  
  38.     或者这样获取:${user["friend"]["name"] }  
  39.     获取朋友的第一只猫:${user.friend.cats[0].name }  
  40.     或者这样获取:${user["friend"]["cats"][0]["name"]}  
  41.  </pre>  
  42.  <h3>ER表达式对运算符的支持:</h3>  
  43.  <pre>  
  44.     3+4=${3+4 }  
  45.     5*9=${5*9 }  
  46.     6/4=${6/4 }  
  47.     5/3=${5/3 }  
  48.     <% session.setAttribute("n", 10); %>  
  49.     n+5=${n+5 }  
  50.     n/10=${n/10 }  
  51.     对一元运算符号的支持:${-n }  
  52.     对比较运算符的支持:${n>10 }||${n==10 }||${n gt 9 }||${n eq 11 }  
  53.     对逻辑运算符的支持:${n>5 && n<10 }||${n>5 || n<10 }  
  54.     对善缘运算符的支持:${n>5?"真的":"假的" }  
  55.     <%   
  56.         pageContext.setAttribute("gdy", null);  
  57.         List<String> list=new ArrayList<String>();  
  58.         list.add("aaaa");  
  59.         list.add("bbbb");  
  60.         list.add("cccc");  
  61.         pageContext.setAttribute("list", list);  
  62.       
  63.     %>  
  64.     对empty(是否为null)运算符的支持:${empty gdy }||${not empty gdy  }  
  65.     获取集合中的全部数据${list}  
  66.     获取集合中的第一个数据${list[0]}  
  67.  </pre>  
  68. </body>  

【EL的11个隐式对象】(注意:容易和jsp的隐式对象混淆)

EL表达式表示类型备注对应的jsp内置对象
pageContextjavax.servlet.jsp.PageContext和jsp的内置对象完全一样pageContext
requestScopejava.util.Map<String,Object>代表者ServletRequest中的那个Map没有
pageScopejava.util.Map<String,Object>代表者PageContext中的那个Map没有
sessionScopejava.util.Map<String,Object>代表者HttpSession中的那个Map没有
applicationScopejava.util.Map<String,Object>代表者ServletContext中的那个Map没有
paramjava.util.Map<String,String>代表一个请求参数没有
paramValuesjava.util.Map<String,String[]>代表重命名的请求参数没有
headerjava.util.Map<String,String>代表一个请求消息头没有
headerValuesjava.util.Map<String,String[]>代表重命名的请求消息头没有
initParamjava.util.Map<String,String>代表web.xml中配置文件的全局参数没有
cookiejava.util.Map<String,Cookie>获取cookie值的key,是cookie的name,Value是cokie对象本身没有

param可以直接获取客户端传递过来的值。

例如:

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <body>  
  2.     <!-- 使用pageContext对象获取工程路径 -->  
  3.   <form action="${pageContext.request.contextPath }/jsp/ER/JER03.jsp" >  
  4.     姓名:<input type="text" name="username" />  
  5.     <br>  
  6.     <input type="submit" value="提交" />  
  7.   </form>  
  8. </body>  
JER03.jsp通过param获取传递过来的值代码为:

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <body>  
  2.     <!-- 通过param。username自己获取request请求中传递过来的值 -->  
  3.     preage获取姓名为:${param.username }  
  4. </body>  

paramValues可以获取请求参数中同名的数据

用法如下:

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <body>  
  2.     <% request.setCharacterEncoding("UTF-8"); %>  
  3.     <!-- 使用pageContext对象获取工程路径 -->  
  4.   <form action="${pageContext.request.contextPath }/jsp/ER/JER03.jsp" method="post" >  
  5.     姓名:<input type="text" name="username" />  
  6.     姓名2<input type="text" name="username" />  
  7.     <br>  
  8.     <input type="submit" value="提交" />  
  9.   </form>  
  10. </body>  
JER03.jsp中通过paramValues获取方法为:

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <body>  
  2. <% request.setCharacterEncoding("UTF-8"); %>  
  3.     <!-- 通过param。username自己获取request请求中传递过来的值 -->  
  4.     preage获取姓名为:${param.username }||${param["username"] }  
  5.     <br>  
  6.     el表达式获取表单中同名控件的数据:${paramValues.username[0] }||${paramValues.username[1] }  
  7. </body>  

el内置对象header获取请求头中的数据Host:${header["Host"] }
el内置对象initParam获取web.xml中的全局配置name1:${initParam.name1 }
el内置对象cookie获取浏览器携带的cookie :${cookie }</br>
el内置对象cookie获取浏览器携带的cookie Jsessionid的key:${cookie.JSESSIONID.name }</br>
el内置对象cookie获取浏览器携带的cookie Jsessionid的value:${cookie.JSESSIONID.value }</br>

【EL表达式-----自定义函数】

自定义函数类代码为:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. package com.gdy.jjsp;  
  2.   
  3. public class JSELFunction {  
  4.       
  5.     /** 
  6.      * 将字符串转换为大写 
  7.      * @param str 
  8.      * @return 
  9.      */  
  10.     public static String upper(String str){  
  11.           
  12.         return str.toUpperCase();  
  13.     }  
  14.   
  15. }  

注意:要想在el表达式中使用自定义函数类中的方法,必须要满足一下几点
1.使用的方法在类函数中必须是静态方法。
2.必须使用后缀为.tld的文件中定义函数,在引用该函数的jsp页面中使用<%@ taglib uri="在tld文件中定义的地址" prefix="名字可以自己定义" %>引入在tld文件中定义的规范。
3.tld文件(即:标签库的描述文件)必须在WEB-INF文件夹里面。但不能在WEB-INF/lib文件夹里面。

在.tld文件引入上面自定义类的代码为:

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <taglib xmlns="http://java.sun.com/xml/ns/j2ee"  
  3.   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.   xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"  
  5.   version="2.0">  
  6.     
  7.   <description>描述,注释</description>  
  8.   <display-name>gdfunn</display-name>  
  9.   <!--  标签库的版面     -->  
  10.   <tlib-version>1.1</tlib-version>  
  11.   <!-- 标签库的名称,推荐名称   -->  
  12.   <short-name>gdyfun</short-name>  
  13.   <!-- 命名空间名称(可以自定义) -->  
  14.   <uri>com.gdy.function</uri>  
  15.   <function>  
  16.     <!--  name表示页面上函数的名字    -->  
  17.     <name>upper</name>  
  18.     <!-- function-class定义包名加类名。引用那个内的那个方法 -->  
  19.     <function-class>com.gdy.jjsp.JSELFunction</function-class>  
  20.     <!-- 返回参数和调用方法里面的数据类型都必须用包名和类名全些 -->  
  21.     <function-signature>java.lang.String upper(java.lang.String)</function-signature>  
  22.   </function>  
  23.     
  24. </taglib>  
在页面中引入在tld文件中定义的类的代码为:

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <!-- uri为在fn.tld文件中定义的uri prefix可以自己命名,重新命名函数名 -->  
  2. <%@ taglib uri="com.gdy.function" prefix="fun" %>  
在jsp页面中调用的代码为:

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <body>  
  2.   <h3>EL表达式自定义函数${fun:upper("abcD") }</h3>  
  3. </body>  

整个jsp页面源码为:

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
  2. <!-- uri为在fn.tld文件中定义的uri prefix可以自己命名,重新命名函数名 -->  
  3. <%@ taglib uri="com.gdy.function" prefix="fun" %>  
  4. <%  
  5. String path = request.getContextPath();  
  6. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
  7. %>  
  8.   
  9. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  10. <html>  
  11.   <head>  
  12.     <base href="<%=basePath%>">  
  13.       
  14.     <title>EL表达式</title>   
  15.     <meta http-equiv="pragma" content="no-cache">  
  16.     <meta http-equiv="cache-control" content="no-cache">  
  17.     <meta http-equiv="expires" content="0">      
  18.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
  19.     <meta http-equiv="description" content="This is my page">  
  20.   </head>  
  21.     
  22.   <body>  
  23.     <h3>EL表达式自定义函数${fun:upper("abcD") }</h3>  
  24.   </body>  
  25. </html>  

注意点:

1.在页面${fun:upper("abcD")}表达式中fun是由taglib引入tld的类时后面prefix字段的值决定的,名字可以在引入时自己随便修改。

2.在taglib引入表达式中uri=“com.gdy.function”的值是在tld文件中 <uri>com.gdy.function</uri>属性定义的,该属性的值可以自己随便定义。

3.在tld文件中
<!--  name表示页面上函数的名字    -->
    <name>upper</name>
    <!-- function-class定义包名加类名。引用那个内的那个方法 -->
    <function-class>com.gdy.jjsp.JSELFunction</function-class>
    <!-- 返回参数和调用方法里面的数据类型都必须用包名和类名全些 -->
    <function-signature>Java.lang.String upper(java.lang.String)</function-signature>

代码中的<function-class>定义了需要在EL表达式中使用的自定义方法的类。而<function-signature>标签定义了该方法的出入参数和返回参数。注意的是入参和出参的类型必须要使用全路径。

在<name>方法中定义了jsp页面引用该方法后调用该方法时的调用名称。可以和自己定义的类方法名称不一致。但jsp引入方法是必须要使用<name>标签中定义的方法名调用。


由于EL表达式不支持字符串的任何运算,所以在EL表达式中使用自定义函数来解决

自定义标签简介
自定义标签主要用于移除Jsp页面中的java代码。
使用自定义标签移除jsp页面中的java代码,只需要完成以下两步骤
1.编写一个狮蝎Tag接口的java类型(标签接口处理器)。
2.编写标签库描述符(tld)文件,在tld文件中吧标签处理器进行描述。


【EL表达式-----自定义标签】
功能:使用自己定义的标签:
例如要实现使用自己定义的标签来打印出当前时间
自定义的标签为:<my:showTime />

注意:在定义自定义标签处理类,类必须要继承SimpleTag接口。或者继承实现了SimpleTag接口的类,当页面匹配到自定义标签后,会执行自定义处理类的toTag()方法。

自定义处理类代码为:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. package com.gdy.jjsp;  
  2.   
  3. import java.io.IOException;  
  4. import java.util.Date;  
  5.   
  6. import javax.servlet.jsp.JspException;  
  7. import javax.servlet.jsp.JspWriter;  
  8. import javax.servlet.jsp.PageContext;  
  9. import javax.servlet.jsp.tagext.SimpleTagSupport;  
  10.   
  11. /** 
  12.  * 演示自定义标签 打印当前时间 
  13.  * @author Administrator 
  14.  * 执行原理: 
  15.  *  SimpleTag接口中的方法; 
  16.  *  Void doTag();由服务器调用。在JSP中遇到标签时调用。 
  17.  *  JspTag getParent();由程序员调用。获取该标签的父标签对象。没有返回null 
  18.  *  
  19.  *  以下三个方法的共同特点:由服务器调用,在调用doTag之前就调用完了。 
  20.  *  void setJspBody(JspFragment jspBody):由服务器调用。传入标签的内容。 
  21.  *  void setJspContext(JspContext pc):由服务器调用。传入当前页面的pageContext对象 
  22.  *  void setParent(JspTag parert):由服务器调用。传入你的父类,没父类的传入null; 
  23.  * 
  24.  */  
  25. public class JERSimpleTag extends SimpleTagSupport{  
  26.   
  27.     /** 
  28.      * doTag()方法容器会自动调用 
  29.      *  当jsp文件解析遇见自定义标签后,找到对应的类,会自动调用doTage方法 
  30.      *  在执行doTage方法之前,jsp引擎先调用了getPageContext方法,所以在该对象中可以直接使用getJSPContext()方法 
  31.      *  
  32.      */  
  33.     @Override  
  34.     public void doTag() throws JspException, IOException {  
  35.         //获取当前时间  
  36.         Date dt=new Date();  
  37.         //获取pageContext对象  
  38.         //在执行doTage方法之前,jsp引擎先调用了getPageContext方法,所以在该对象中可以直接使用getJSPContext()方法  
  39.         PageContext pagecontext=(PageContext)getJspContext();  
  40.         //获取输出流对象  
  41.         JspWriter out = pagecontext.getOut();  
  42.         //向页面输出  
  43.         out.write(dt.toLocaleString());  
  44.     }  
  45. }  


后缀为tld文件的定义关联方法为:

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE taglib  
  3.   PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"  
  4.   "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">  
  5. <taglib>  
  6.   <!-- tlid的版本号 -->  
  7.   <tlib-version>1.0</tlib-version>  
  8.   <!-- jsp的版本号  -->  
  9.   <jsp-version>1.2</jsp-version>  
  10.   <!-- 推荐名称 -->  
  11.   <short-name>mygettime</short-name>  
  12.   <!-- 定义uri 页面引用唯一标示 -->  
  13.   <uri>com.gdy.gettime</uri>  
  14.   
  15.   <tag>  
  16.     <!-- 页面上自定义标签的名字 -->  
  17.     <name>showTime</name>  
  18.     <!-- 对应到后台的那个class -->  
  19.     <tag-class>com.gdy.jjsp.JERSimpleTag</tag-class>  
  20.     <!-- 主体内容 (即页面自己定义的标签之间的内容)  
  21.          注意:body-content:的取值内容  
  22.                 JSP:不要考虑。(给传统标签处理类用的)  
  23.                 empty:传统和简单标签都能用的。开始标签和结束标签没有主体内容时用。  
  24.                 scriptless:给简单标签用的。开始标签和结束标签有主体内容时用。但是内容不能有<%  
  25.                 tagdependent:给简单标签用的。告诉标签处理类,主体内容是普通的文本   
  26.     -->  
  27.     <body-content>empty</body-content>  
  28.     <!--  定义标签属性  
  29.             <attribute>  
  30.                 <name>var</name>  
  31.                 <required>false</required>  
  32.                 <rtexprvalue>false</rtexprvalue>  
  33.             </attribute>  
  34.       -->  
  35.   </tag>  
  36.  </taglib>  


页面jsp引入代码为:

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <!-- 引入自定义标签类   -->  
  2. <%@ taglib uri="com.gdy.gettime" prefix="my" %>  
jsp页面全部代码为:

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
  2. <!-- uri为在fn.tld文件中定义的uri prefix可以自己命名,重新命名函数名 -->  
  3. <%@ taglib uri="com.gdy.function" prefix="fun" %>  
  4. <!-- 引入sun公司提供的自定义类  -->  
  5. <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="gdy" %>  
  6. <!-- 引入自定义标签类   -->  
  7. <%@ taglib uri="com.gdy.gettime" prefix="my" %>  
  8. <%  
  9. String path = request.getContextPath();  
  10. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
  11. %>  
  12.   
  13. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  14. <html>  
  15.   <head>  
  16.     <base href="<%=basePath%>">  
  17.       
  18.     <title>EL表达式</title>   
  19.     <meta http-equiv="pragma" content="no-cache">  
  20.     <meta http-equiv="cache-control" content="no-cache">  
  21.     <meta http-equiv="expires" content="0">      
  22.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
  23.     <meta http-equiv="description" content="This is my page">  
  24.   </head>  
  25.     
  26.   <body>  
  27.     <h3>EL表达式自定义函数${fun:upper("abcD") }</h3></br>  
  28.     <h3>${gdy:toUpperCase("aaaaa") }</h3><br/>  
  29.     <hr>  
  30.     <h3>El表达式之自定义标签</h3>  
  31.     <!-- 使用自定义标签显示当前时间 -->  
  32.         自定义标签:|<my:showTime />  
  33.   </body>  
  34. </html>  

注意:tld文件的路径和自定义方法的tld文件路径存放规则一样。

自定义标签执行原理

SimpleTag接口中的方法:

void doTag():由服务器调用。在JSP中遇到标签时调用。

JspTaggetParent():由程序员调用。获取该标签的父标签对象。没有返回null


以下三个方法的共同特点:由服务器调用,在调用doTag之前就调完了。

voidsetJspBody(JspFragment jspBody):由服务器调用。传入标签的内容。

voidsetJspContext(JspContext pc):由服务器调用。传入当前页面的pageContext对象

voidsetParent(JspTag parent):由服务器调用。传入你的爹。没爹传入null


自定义标签的详细功能(基本功)

1.控制页面中某部分内容不显示 

2.控制结束标签后的JSP内容不执行 

3.控制主体内容重复执行:带属性的标签开发

4.获取标签主体内容,改变后再输出


示例1:控制页面中某部分内容不显示

类的后台代码为:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. package com.gdy.jjsp;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import javax.servlet.jsp.JspException;  
  6. import javax.servlet.jsp.tagext.SimpleTagSupport;  
  7.   
  8. /** 
  9.  * 自定义类,演示隐藏内容 
  10.  * @author Administrator 
  11.  * 
  12.  */  
  13. public class JERSimpleTag02 extends SimpleTagSupport {  
  14.      @Override  
  15.     public void doTag() throws JspException, IOException {  
  16.   
  17.     }  
  18. }  
tld文件绑定方法为:

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <tag>  
  2.     <name>Hide</name>  
  3.     <tag-class>com.gdy.jjsp.JERSimpleTag02</tag-class>  
  4.     <!-- 注意,这里值为tagdependent 也就是说这个标签有开始标签和结束标签。但内容只能是普通文本  -->  
  5.     <body-content>tagdependent</body-content>  
  6. </tag>  

jsp页面引用和调用方法为:

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <%@ taglib uri="com.gdy.gettime" prefix="my" %>  
[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <body>  
  2.   <h3>演示ER表达式 自定义标签隐藏内容</h3>  
  3.     哈哈,隐藏内容在这<my:Hide>你看不到我</my:Hide>  
  4. </body>  
页面显示效果为:



示例2:控制结束标签后的JSP内容不执行
java类代码为:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. package com.gdy.jjsp;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import javax.servlet.jsp.JspException;  
  6. import javax.servlet.jsp.SkipPageException;  
  7. import javax.servlet.jsp.tagext.JspFragment;  
  8. import javax.servlet.jsp.tagext.SimpleTagSupport;  
  9.   
  10. /** 
  11.  * 控制结束标签后的内容不显示 
  12.  * @author Administrator 
  13.  * 
  14.  */  
  15. public class JERSimpleTag03 extends SimpleTagSupport {  
  16.   
  17.     @Override   
  18.     public void doTag() throws JspException, IOException {  
  19.         //拿到标签中的主题内容  
  20.         JspFragment body = getJspBody();  
  21. //      //第一种方法  
  22. //      //拿到pageContext对象  
  23. //      PageContext page=(PageContext)body.getJspContext();  
  24. //      //拿到输出流对象  
  25. //      JspWriter out=page.getOut();  
  26. //      //输出主体内容  
  27. //      body.invoke(out);  
  28.           
  29.         //第二张方法  
  30.         body.invoke(null);  
  31.         //跑出自定义异常  
  32.         throw new SkipPageException();  
  33.     }  
  34. }  

pld文件关联代码为:

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <tag>  
  2. <name>HideEnd</name>  
  3. <tag-class>com.gdy.jjsp.JERSimpleTag03</tag-class>  
  4. <!-- 注意,这里值为tagdependent 也就是说这个标签有开始标签和结束标签。但内容只能是普通文本  -->  
  5. <body-content>tagdependent</body-content>  
  6. lt;/tag>  
jsp页面相关代码为:

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <%@ taglib uri="com.gdy.gettime" prefix="my" %>  
[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <body>  
  2.   <h3>演示ER表达式 自定义标签隐藏内容</h3>  
  3.     哈哈,隐藏内容在这<my:Hide>你看不到我</my:Hide>  
  4.   <hr>  
  5.   <h4>控制结束标签后的JSP内容不执行</h4>  
  6.     结束标签后的内容不执行<my:HideEnd>【标签里面内容】</my:HideEnd>【标签后面内容】  
  7. </body>  
显示结果为:


页面查看源码为:



可以看到在</my:HideEnd>标签后面的内容都没有输出。


示例3 控制主题的部分内容重复执行

java类代码为:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. package com.gdy.jjsp;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import javax.servlet.jsp.JspException;  
  6. import javax.servlet.jsp.tagext.SimpleTagSupport;  
  7.   
  8. public class JERSimpleTag04 extends SimpleTagSupport {  
  9.   
  10.     //定义属性,方便自动接收页面传递过来的值  
  11.     private int num;  
  12.   
  13.     //必须提供set方法,这样系统才能自动接收值  
  14.     public void setNum(int num) {  
  15.         this.num = num;  
  16.     }  
  17.   
  18.     @Override  
  19.     public void doTag() throws JspException, IOException {  
  20.         for(int i=0;i<this.num;i++){  
  21.             getJspBody().invoke(null);  
  22.         }  
  23.     }  
  24. }  

tld文件配置信息为:

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <!-- 定义个自定义标签,循环输出标签里面的内容 -->  
  2. <tag>  
  3.     <name>HideCopy</name>  
  4.     <tag-class>com.gdy.jjsp.JERSimpleTag04</tag-class>  
  5.     <!-- 注意,这里值为scriptless 也就是说这个标签有开始标签和结束标签。主题内容不仅仅是简单的文本了  -->  
  6.     <body-content>scriptless</body-content>  
  7.     <!-- 定义属性,方便指定循环几次 -->  
  8.     <attribute>  
  9.         <!-- 属性名称, 必须和类定义的属性名称一样。注意类定义的属性必须是私有的,并提供set方法 -->  
  10.         <name>num</name>  
  11.         <!-- 属性值是否必须填写  -->  
  12.         <required>true</required>  
  13.         <!-- 表示属性的值是否支持EL表达式 -->  
  14.         <rtexprvalue>true</rtexprvalue>  
  15.     </attribute>  
  16. </tag>  
jsp页面调用代码为:

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <hr>  
  2. <h4>控制标签的主体内容重复执行</h4>  
  3. <my:HideCopy num="${'8'}" >我要循环---------</br></my:HideCopy>  
  4.   
  5. <hr>  

显示结果为:



示例4:获取主体内容,改变后输出

java处理类代码为:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. package com.gdy.jjsp;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.StringWriter;  
  5.   
  6. import javax.security.auth.message.callback.PrivateKeyCallback.Request;  
  7. import javax.servlet.jsp.JspContext;  
  8. import javax.servlet.jsp.JspException;  
  9. import javax.servlet.jsp.tagext.JspFragment;  
  10. import javax.servlet.jsp.tagext.SimpleTagSupport;  
  11.   
  12. /* 
  13.  * 演示控制标签的主体内容改变后输出 
  14.  */  
  15. public class JERSimpleTag05 extends SimpleTagSupport {  
  16.   
  17.     @Override  
  18.     public void doTag() throws JspException, IOException {  
  19.         //获取主体内容  
  20.         JspFragment body = getJspBody();  
  21.         //我们先把数据写入到一个缓冲流中,然后从缓冲流中取出数据进行修改,修改的数据再写入缓冲流中  
  22.         //创建一个字符串输出缓冲流,可以从中获取数据  
  23.         StringWriter sw=new StringWriter();  
  24.         //将数据写入缓冲流中  
  25.         body.invoke(sw);  
  26.         //从缓冲流中拿到数据  
  27.         String str=sw.toString();  
  28.         //改变数据  
  29.         str=str.toUpperCase()+"我已经改变";  
  30.         //获取输出流对象输出到页面  
  31.         getJspContext().getOut().write(str);  
  32.           
  33.       
  34.     }  
  35. }  

tld文件绑定内容为:

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <!-- 定义个自定义标签,修改主体内容 -->  
  2. <tag>  
  3.     <name>HideTH</name>  
  4.     <tag-class>com.gdy.jjsp.JERSimpleTag05</tag-class>  
  5.     <!-- 注意,这里值为scriptless 也就是说这个标签有开始标签和结束标签。主题内容不仅仅是简单的文本了  -->  
  6.     <body-content>tagdependent</body-content>  
  7. </tag>  

jsp页面代码为:

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <%@ taglib uri="com.gdy.gettime" prefix="my" %>  
[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <h4>获取标签的主体内容,改变后再输出</h4>  
  2.     获取标签的主体内容改变后再输出:<my:HideTH>我是主体内容aaabbbccc</my:HideTH>  
web显示结果为:


示例5:模拟实现if else功能标签

jsp页面代码为:

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <%@ taglib uri="com.gdy.gettime" prefix="my" %>  
[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <body>  
  2.  <h5>控制标签的主体内容是否输出(if else 语句功能)</h5>  
  3.  <my:choose>  
  4.         <my:when test="${5>3}">真的</my:when>  
  5.         <my:otherwise>假的</my:otherwise>  
  6.  </my:choose>  
  7.  <br />  
  8.     <my:choose>  
  9.         <my:when test="${5<3}">真的</my:when>  
  10.         <my:otherwise>假的</my:otherwise>  
  11.  </my:choose>  
  12.   
  13. </body>  

tld关联代码为:

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE taglib  
  3.   PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"  
  4.   "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">  
  5. <taglib>  
  6.   <!-- tlid的版本号 -->  
  7.   <tlib-version>1.0</tlib-version>  
  8.   <!-- jsp的版本号  -->  
  9.   <jsp-version>1.2</jsp-version>  
  10.   <!-- 推荐名称 -->  
  11.   <short-name>mygettime</short-name>  
  12.   <!-- 定义uri 页面引用唯一标示 -->  
  13.   <uri>com.gdy.gettime</uri>  
  14.     
  15.     <!-- 定义3-1个自定义标签,实现if else功能 -->  
  16.   <tag>  
  17.     <name>choose</name>  
  18.     <tag-class>com.gdy.jjsp.JERChoose</tag-class>  
  19.     <body-content>scriptless</body-content>  
  20.   </tag>  
  21.     
  22.      <!-- 定义3-2个自定义标签,实现if else功能 -->  
  23.   <tag>  
  24.     <name>when</name>  
  25.     <tag-class>com.gdy.jjsp.JERWhen</tag-class>  
  26.     <body-content>scriptless</body-content>  
  27.     <attribute>  
  28.         <name>test</name>  
  29.         <required>true</required>  
  30.         <rtexprvalue>true</rtexprvalue>  
  31.     </attribute>  
  32.   </tag>  
  33.     
  34.        <!-- 定义3-3个自定义标签,实现if else功能 -->  
  35.   <tag>  
  36.     <name>otherwise</name>  
  37.     <tag-class>com.gdy.jjsp.JEROtherwise</tag-class>  
  38.     <body-content>scriptless</body-content>  
  39.   </tag>  
  40.     
  41.  </taglib>  
com.gdy.jjsp.JERChoose内代码为:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. package com.gdy.jjsp;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import javax.servlet.jsp.JspException;  
  6. import javax.servlet.jsp.tagext.SimpleTagSupport;  
  7.   
  8. /** 
  9.  * 模拟执行if else功能 
  10.  * @author Administrator 
  11.  * 
  12.  */  
  13. public class JERChoose  extends SimpleTagSupport{  
  14.       
  15.     private boolean flag=true;//通过该变量控制是否执行else部分  
  16.       
  17.     public boolean isFlag() {  
  18.         return flag;  
  19.     }  
  20.   
  21.     public void setFlag(boolean flag) {  
  22.         this.flag = flag;  
  23.     }  
  24.   
  25.     @Override  
  26.     public void doTag() throws JspException, IOException {  
  27.         getJspBody().invoke(null);  
  28.     }  
  29. }  
com.gdy.jjsp.JERWhen类代码为:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. package com.gdy.jjsp;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import javax.servlet.jsp.JspException;  
  6. import javax.servlet.jsp.tagext.SimpleTagSupport;  
  7.   
  8. public class JERWhen extends SimpleTagSupport{  
  9.       
  10.     private boolean test;  
  11.       
  12.     public void setTest(boolean test){  
  13.         this.test=test;  
  14.     }  
  15.       
  16.     @Override  
  17.     public void doTag() throws JspException, IOException {  
  18.         if(test){  
  19.             //条件为真:执行主体内容 ,修改父标签中的变量的值  
  20.             getJspBody().invoke(null);  
  21.             //获取父标签  
  22.             JERChoose choose=(JERChoose)getParent();  
  23.             //修改父标签中的值  
  24.             choose.setFlag(false);  
  25.         }  
  26.           
  27.     }  
  28.   
  29. }  
com.gdy.jjsp.JEROtherwise类代码为:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. package com.gdy.jjsp;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import javax.servlet.jsp.JspException;  
  6. import javax.servlet.jsp.tagext.SimpleTagSupport;  
  7.   
  8. public class JEROtherwise extends SimpleTagSupport {  
  9.   
  10.     @Override  
  11.     public void doTag() throws JspException, IOException {  
  12.         //获取父标签  
  13.         JERChoose choose=(JERChoose)getParent();  
  14.         if(choose.isFlag()){  
  15.             getJspBody().invoke(null);  
  16.         }  
  17.     }  
  18. }  

页面显示结果为:



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值