zoukankan      html  css  js  c++  java
  • EL表达式和标准标签库

    EL表达式(expression language): !!!!自定义标签!!!!
    语法 ${expression}

    jsp中page指令有一个属性叫isELIgnored
    <%@ page isELIgnored="true"%> 表示是否禁用EL语言,TRUE表示禁止.FALSE表示不禁止.JSP2.0中默认的启用EL语言.

    2)[]与.运算符
    EL 提供.和[]两种运算符来存取数据。
    当要存取的属性名称中包含一些特殊字符,如.或?等并非字母或数字的符号,就一定要使用[]。
    表达式中含有特殊字符
    错误: ${sessionScope.test-name} vs 正确: ${sessionScope["test-name"]}
    如果要动态取值时,就可以用[]来做,而.无法做到动态取值。例如:
    ${sessionScope.user[data]}中 data 是一个变量

    点运算符(.)和"[ ]"都是表示获取变量的值.区别是[ ]可以显示非词类的变量
    在EL表达式中[]也可以用来表示数组或者集合中的索引值

    3)EL变量
    EL存取变量数据的方法很简单,例如:${username}。它的意思是取出某一范围中名称为username的变量。
    当前面不指定哪个作用域下面的值的时候, 会默认按照下面的顺序去找, 如果都找不到, 就回传null
    pageScope --> requestScope --> sessionScope --> applicationScope
    pageScope表示页面范围的变量.requestScope表示请求对象的变量. sessionScope表示会话范围内的变量.applicationScope表示应用范围的变量.

    它们基本上就和JSP的pageContext、request、session和application一样;
    在EL中,这四个隐含对象只能用来取得范围属性值,即getAttribute(String name),却不能取得其他相关信息。
    例如:我们要取得session中储存一个属性username的值:
    常规写法 <%=session.getAttribute("username")%>取得username的值,
    EL则使用下列方法
    ${sessionScope.username}或${sessionScope["username"]}

    1--EL表达式用${}表示,可用在所有的HTML和JSP标签中,作用是代替JSP页面中复杂的JAVA代码.

    2--EL表达式可操作常量 变量 和隐式对象.
    最常用的 隐式对象有${param}和${paramValues}. 是与输入有关的
    ${param}表示返回请求参数中单个字符串的值.
    ${paramValues}表示返回请求参数的一组值/所有请求参数作为String类型的数组的Map类
    例如我们要取得用户的请求参数时,可以利用下列方法:
    request.getParameter(String name)
    request.getParameterValues(String name)
    在EL中则可以使用param和paramValues两者来取得数据。
    ${param.name}
    ${paramValues.name}

    EL自动类型转换
    String num = request.getParameter("num");
    int a = 20;
    int b = Integer.parseInt(num != null ? num : "0");
    out.print(a + b);

    ${param.num + a}

    Scope和param都是EL表达式中的隐式对象

    1)cookie
    将名称存储请求附带的cookies的Map类,JSTL并没有提供设定cookie的动作,
    获取cookie:
    ${cookie.username.name}
    ${cookie.username.value}
    2)header和headerValues
    header 储存用户浏览器和服务端用来沟通的数据
    例:要取得用户浏览器的版本,可以使用${header["User-Agent"]}。
    另外在鲜少机会下,有可能同一标头名称拥有不同的值,此时必须改为使用headerValues 来取得
    这些值。
    3)initParam按名称存储web应用程序上下文初始化参数的Map类
    initParam取得设定web站点的环境参数(Context)
    例:一般的方法
    <%String userid = application.getInitParameter("userid"); %>
    可以使用 ${initParam.userid}来取得名称为userid
    4)pageContext取得其他有关用户要求或页面的详细信息。${pageContext. }
    5)EL运算符
    算术运算符: + - * /或者div %或者mod
    关系运算符: ==或者eq !=或者ne <或者lt >或者gt <=或者le >=或者ge
    逻辑运算符: &&或者and ||或者or !或者not
    验证运算符: empty(empty 对于 null和"" 的判断都是返回true)
    EL语言可显示 逻辑表达式如${true and false}结果是false
    关系表达式如${5>6} 结果是false
    算术表达式如 ${5+5} 结果是10
    ${empty param.name}、${A?B:C}、${A*(B+C)}

    -----------JSTL(JSP Standard Tag Library)标准标签库--------------
    JSTL组成:
    JSTL –Core 核心标签库。 - 这是本部分的重点
    JSTL – I18N - 国际化标签库。Internationalization- I18N
    JSTL – SQL – 数据库操作标签(有悖于MVC设计模式不用不讲)。
    JSTL - Functions – 函数库。
    JSTL - XML ,对XML的操作(同SQL标签)。在jstl-1.2.jar包的META-INF目录中,
    保存着各种tld文件的版本。请查看。

    使用JSTL核心标签:
    如果你的Web项目是基于JavaEE2.5或以上的。可以在你项目的任意页面上
    通过<%@ taglib 指令使用JSTL的核心标签库。
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
    uri是引用标签库的资源定位符,并不代表一个实际的地址。
    Prefix是自定义的前缀。
    如果你的项目是JavaEE2.5以下的项目,必须在在你项目中的lib目录下,
    存在以下两个jar文件为:
    Jstl.jar、standard.jar

    具体使用:
    JSTL-Core一共包含以下几个子标签:
    <c:out> ${name}输出标签
    <c:set> pageContext.setAttirbute(key,value,scope);声明标签
    <c:remove>删除某个范畴内的数据
    <c:if> 判断c:else,c:elsif
    <c:choose><c:when><c:otherwise> 判断分枝c:if,c:else if c:
    <c:forEach> 遍历
    <c:forTokens> 分隔


    <c:import> 导入其他资源,相当于动态包含共享同一个request
    <c:url> - 重写url 取href属性
    <c:redirect> 重定向 response.sendRedirect(‘’..) 不符合mvc模式,从前台跳转


    下面对具体的操作进行解释与演示:
    <c:out>
    <c:out value=…/>用于在页面上输出结果。
    <c:out value=“${requestScope.name}”/> -将request中的name值输出
    <c:out value=“${param.username}”/> - 用于将参数输出到页面上。
    <c:out value=“${name}” default=“hello”/>从page到application开始查找,如果没有找到,就显示默认值hello.
    另一种设置默认值的方式:只有当要求的信息为null或不存在时才会输出默认值。

    <c:out value="${name }" default="hello everybody" /><br>
    <c:out value= "${name}">Default-value-默认值。 </c:out> <br>
    

      

    excapeXml属性(控制转义字符):默认为true,需要转义设置为false;
    用于将html等标签转换成&lt;等转换元素,看例子.

    <%  
         String name="<font color='red'>Red</font>";  
          pageContext.setAttribute("name",name);  
      %>  
     <c:out value="${name}" escapeXml="flase"></c:out> <br>
    <!-- 因为浏览器会解析html数据。不对xml或html进行转换,直接输出,这样就会在页面上看到红色的Red字符,  -->
    

      

    <c:set>
    作用:为String类型的命名变量设置值。
    <c:set var=“变量名” value=“变量的值” scope=“page|request|session|application”/>--scope:将一个值存到scope中(默认是page)

    <c:set var=“name” value=“${param.name}”/>
    直接从参数中取出数据给name赋值。
    两种方式都行:<c:set var="t" value="山东淄博" />
    <c:set var="t1">安徽黄山</c:set>

     <%  
       pageContext.setAttribute("name", "jack_P");  
       request.setAttribute("name", "jack_R");  
       request.setAttribute("name2", "<font color='red'>你好,中国</font>");  
     %>  
       ${name2 }  :从小范围到大开始查找,不写out标签也可以打印出来<br/>  <!-- name2 -->
     <c:out value="${name2 }" escapeXml="flase"></c:out>  
       <hr/>  
       
      <!-- 指定范围以后,需要从指定范围去取,不然会自动从小到大开始查找 -->  
     <c:set var="a" value="jack中国2" scope="request" ></c:set>  
     ${requestScope.a } <br/>  
    

      

    如果变量为JavaBean,则为这个JavaBean的属性设置值。
    <c:set target=“JavaBean的变量名” property=“设置的属性” value=“值”/>
    target 对应javaBean的name值(target要使用EL表达式的形式)
    property 对应定义的类里面的属性.示例

    <jsp:useBean id="person" class="testweb2.Person"></jsp:useBean>
     <c:set target="${pageScope.person}" property="name" value="Jack"/>
     <c:set target="${pageScope.person}" property="age" value="99"/> 
       ${person}<br> 
    

      

    如果变量为Map,则给Map中的key设置值。
    <c:set target=“代表Map的变量” property=“key” value=“value”/>,示例.

     <jsp:useBean id="map" class="java.util.HashMap" scope="request"></jsp:useBean>
      <c:set target="${requestScope.map}" property="name" value="Jack"/>
      <c:out value="${requestScope.map.name}"/>  <br> 
    

      

    提一下:remove----只能用于页面内的变量移除
    移除某个变量
    var: 指定需要remove的那个变量名(不能使用EL表达式)
    scope: 多个scope中的变量名有重复的时候, 可以通过这个属性来确定移除的是哪个, 如果不指定, 则全部remove掉

      <!-- 移除属性 c:remove  默认是从pageScope中移除--> 
      <c:set var="b" value="jack11111" scope="request" />
       ${requestScope.b } 
       
             <c:remove var="b" scope="request"/>  
             ${requestScope.b }  
    

      

    catch
    相当于try...catch...可以在这个标签中放其他标签,只有一个属性var

    流程控制标签

    <c:if>
    <c:if />用于实现Java语言中的if语句。它的语法如下:
    <c:if test=“逻辑表达式”var=“代表逻辑表达式值的命名变量” scope=范围/>
    例字:
    <c:if test=“${name!=‘Jack’}”>
    当name的值不为Jack时输出此行信息
    </c:if>
    上面的判断等价于下面的代码片段:
    if(pageContext.getAttribute(“name”)!=null && !..equals(“Jack”)){
    out.println(“…..”);
    }

     <c:set var="age" value="20"></c:set>  
             <c:if test="${age>25 }" var="aa">  
                <h2>比25大咯!!</h2>  
             </c:if>  
             <c:if test="${!aa }">  
                <h3>比25小咯!!</h3>  
             </c:if> 
    

      

     <c:set var="a" value="jack" scope="request" ></c:set>   
     <c:if test="${a =='jack'}">
           当a的值为Jack时输出此行信息
    </c:if> 
    

      

    choose,when,otherwise 例子
    这几个标签共同使用可以实现Java中的if…else语句的功能
    使用c:when必须遵循以下语法规则:
    <c:when/>和<c:otherwise/>不能单独使用,它必须位于<c:choose内。
    <c:otherwise/>必须位于c:when之后。

    <!-- 可以setname 一下 -->
      <c:choose>
      <c:when test="${empty param.name}">
      用户没有输入name参数
      </c:when>
      <c:when test="${param.name=='Admin'}">
      ${param.name}是管理员
      </c:when>
      <c:otherwise>
      用户是:${param.name}
      </c:otherwise>
      </c:choose>   
    

      

    <c:set var="age" value="-18"></c:set>  
    <c:choose>  
        <c:when test="${age>20 }">  
            大于20!!  
        </c:when>  
        <c:when test="${age>10 }">  
            大于10!!  
        </c:when>  
        <c:when test="${age<10 }&&${age>0 }">  
            小于于10!!  
        </c:when>  
        <c:otherwise>   
            这就是属于其他的了 。。。  
        </c:otherwise>  
    </c:choose>    
    

      

    -- -- -- - -- - -- -- - - --

    <c:ForEach>迭代标签
    语法:<c:forEach var=“name迭代变量” items=“${集合名称}” varStatus=“迭代下标变量” begin=“int开始索引“
    end=”int结束索引” step=“int(步长)属性” >
    //循环体
    </c:forEach>

    说明:1)items:是集合,用EL表达式;
    2)var:变量名,存放items
    3)varStatus: 显示循环状态的变量
    ①index:从0开始;
    ②count:元素位置,从1开始;
    ③first:如果是第一个元素则显示true;
    ④last:如果是最后一个元素则显示true;
    4)begin:循环的初始值(整型);
    5)end: 循环结束 ;
    6)step:步长,循环间隔的数值;
    例子

         <!--  c:forEach  增强for循环 -->  
             <!-- 普通版本 -->  
        <c:forEach begin="0" end="10" var="x" step="2">  
                ${x }  
              </c:forEach>  
               <hr/>  
            <%  
             String[] a={"小王","晓明   ","小杨","新哥"};  
             request.setAttribute("a", a);  
              %>  
              <c:forEach items="${requestScope.a }" var="i">  
                ${i }  <!-- 一定要注意取值的范围 -->  
              </c:forEach> 
    

      

     <!-- 演示list用jstl -->  
     <%  
    List<String> list= new ArrayList<String>();  
    list.add("123a");  
    list.add("123d");  
    list.add("123b");  
    list.add("123c");  
    list.add("123e");  
    list.add("大新哥");  
    session.setAttribute("list", list);//后面用el表达式取得是参数  
     %>  
     <c:forEach items="${sessionScope.list }" var="li">  
        ${li } 
     </c:forEach>  
    

      

     <!-- 采用map的方式演示jstl -->  
     <%  
    //演示map采用el表达式  
    Map<String,Object> map1=new HashMap<String,Object>();//存储以hash值存储  
    map1.put("aa", 123);  
    map1.put("cc", 567);  
    map1.put("bb", 345);  
    map1.put("dd", 789);  
    application.setAttribute("map2", map1);  
     %>  
     <c:forEach items="${ applicationScope.map2}" var="mm" varStatus="idx">  
       ${idx.index } ${idx.count }  ${mm.key }  ${mm.value }<br/>  
     </c:forEach>  
    

      

    - - --- --- --- --- --- ----- --- --- --
    forTokens(回忆一下字符串的split()方法)
    输出的结果中同样也有index, count, first, last这四个属性
    这个标签的使用相当于java.util.StringTokenizer类。
    例子

    <!-- 分割字符串,相当于split() -->  
     <c:forTokens items="aa,bb,cc,dd,ee,ff" delims="," var="x">  
      ${x }  <br>
     </c:forTokens>  
    
    
    <hr/>   
     
     <c:forTokens items="a:b:c:d" delims=":" var="token">
     <c:out value="${token }"/>
     </c:forTokens> 
    

      

    2, 格式化标签:

    SP页面用EL表达式 输出date格式 

    1、头上引入标签

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

     
    2、<fmt:formatDate value="${project.creatDate }" pattern="yyyy-MM-dd"/>
     
    具体配置:
     
    <fmt:formatDate value="${isoDate}" type="both"/>
    2004-5-31 23:59:59
    
    <fmt:formatDate value="${date}" type="date"/>
    2004-4-1
    
    <fmt:formatDate value="${isoDate}" type="time"/>
    23:59:59
    
    <fmt:formatDate value="${isoDate}" type="date" dateStyle="default"/>
    2004-5-31
    
    <fmt:formatDate value="${isoDate}" type="date" dateStyle="short"/>
    04-5-31
    
    <fmt:formatDate value="${isoDate}" type="date" dateStyle="medium"/>
    2004-5-31
    
    <fmt:formatDate value="${isoDate}" type="date" dateStyle="long"/>
    2004年5月31日
    
    <fmt:formatDate value="${isoDate}" type="date" dateStyle="full"/>
    2004年5月31日 星期一
    
    <fmt:formatDate value="${isoDate}" type="time" timeStyle="default"/>
    23:59:59
    
    <fmt:formatDate value="${isoDate}" type="time" timeStyle="short"/>
    下午11:59
    
    <fmt:formatDate value="${isoDate}" type="time" timeStyle="medium"/>
    23:59:59
    
    <fmt:formatDate value="${isoDate}" type="time" timeStyle="long"/>
    下午11时59分59秒
    
    <fmt:formatDate value="${isoDate}" type="time" timeStyle="full"/>
    下午11时59分59秒 CDT
    
    <fmt:formatDate value="${date}" type="both" pattern="EEEE, MMMM d, yyyy HH:mm:ss Z"/>
    星期四, 四月 1, 2004 13:30:00 -0600
    
    <fmt:formatDate value="${isoDate}" type="both" pattern="d MMM yy, h:m:s a zzzz/>
    31 五月 04, 11:59:59 下午 中央夏令时
    
    格式模式:
      d   月中的某一天。一位数的日期没有前导零。    
      dd   月中的某一天。一位数的日期有一个前导零。    
      ddd   周中某天的缩写名称,在   AbbreviatedDayNames   中定义。    
      dddd   周中某天的完整名称,在   DayNames   中定义。    
      M   月份数字。一位数的月份没有前导零。    
      MM   月份数字。一位数的月份有一个前导零。    
      MMM   月份的缩写名称,在   AbbreviatedMonthNames   中定义。    
      MMMM   月份的完整名称,在   MonthNames   中定义。    
      y   不包含纪元的年份。如果不包含纪元的年份小于   10,则显示不具有前导零的年份。    
      yy   不包含纪元的年份。如果不包含纪元的年份小于   10,则显示具有前导零的年份。    
      yyyy   包括纪元的四位数的年份。    
      gg   时期或纪元。如果要设置格式的日期不具有关联的时期或纪元字符串,则忽略该模式。    
      h   12   小时制的小时。一位数的小时数没有前导零。    
      hh   12   小时制的小时。一位数的小时数有前导零。    
      H   24   小时制的小时。一位数的小时数没有前导零。    
      HH   24   小时制的小时。一位数的小时数有前导零。    
      m   分钟。一位数的分钟数没有前导零。    
      mm   分钟。一位数的分钟数有一个前导零。    
      s   秒。一位数的秒数没有前导零。    
      ss   秒。一位数的秒数有一个前导零。
    
    <fmt:formatDate value="${xx}" pattern="dd/MM/yyyy HH:mm aa"/>和
    
    <fmt:formatDate value="${xx}" pattern="dd/MM/yyyy hh:mm aa"/>  
    对于0点显示的结果不一样
    h:小时,从1到12,分上下午 范围:01:00 AM~12:59AMH:小时,
    从0到23                 
    范围:00:00 AM~23:59AM

    2) 格式化数字<fmt:formatNumber
    value="${n}" pattern="###,###.##" />
    3, sql标签
    4, xml标签
    5, jstl函数

  • 相关阅读:
    想起来好久没更新博客了
    操作系统文件管理
    PreparedStatement是如何大幅度提高性能的
    Java中快速排序的实现
    详解HashMap的内部工作原理
    关于Java集合的总结
    浅谈JVM内存区域划分
    解决java压缩图片透明背景变黑色的问题
    Vmware15.5中centos7minimal版 窗口字体太小
    字符长度还是字节长度
  • 原文地址:https://www.cnblogs.com/ziyanxiaozhu/p/8564827.html
Copyright © 2011-2022 走看看