zoukankan      html  css  js  c++  java
  • EL

      什么是EL

    JSP2.0要把html和css分离、要把html和javascript分离、要把Java代码块替换成标签。标签的好处是非Java人员都可以使用。

    JSP2.0 – 纯标签页面,即:不包含<% … %>、<%! … %>,以及<%= … %>

    EL(Expression Language)是一门表达式语言,它对应<%=…%>。我们知道在JSP中,表达式会被输出,所以EL表达式也会被输出。

    EL表达式的格式:${…},例如:${1+2}。

    在使用EL表达式时,要求page指令的isELIgnored属性为false。这样JSP在编译成.java时,才不会忽略EL表达式。

    如果你希望某个EL表达式被JSP编译器忽略,那么可以在EL表达式之前添加“”,例如:${1+2}。

    EL运算符

    (数学和逻辑|&!)

        .运算符:调用.之前的getter方法.只要有get方法,  . 就能调

       []运算符:.能做的,它都能做;  .不能做的,它也能做.                

        empty运算符:判断一个对象是否是null或者"",如果是,返回true;

    如果对象是一个集合,即使对象本身不是null,没有元素也返回true.

     1  <body>
     2 
     3     <%  pageContext.setAttribute("p", null);   %>
     4 
     5     <!-- empty判断是否为空,为空打印true -->
     6 
     7     ${empty p }<br/>
     8 
     9     <%
    10 
    11     List list = new ArrayList();
    12 
    13     list.add("p");
    14 
    15     pageContext.setAttribute("list", list);
    16 
    17      %>
    18 
    19     ${empty list }<hr/>   
    20 
    21     ${empty cart }<br/>
    22 
    23      <!-- empty进行 3元运算 -->
    24 
    25     ${1!=1?"等于":"不等于" }<br/>
    26 
    27     ${empty list?"您没有购买任何商品":"您买了以下商品" }<br/>
    28 
    29     <%
    30 
    31     session.setAttribute("user", new Person("向阳"));
    32 
    33      %>
    34 
    35      ${empty user?"您没有登录":"欢迎访问" }
    36 
    37     <%
    38 
    39     pageContext.setAttribute("gender", "0");
    40 
    41      %>
    42 
    43     <input type="radio" name="gender" value="1" ${gender=='1'?'checked="checked"':''}/>44 
    45     <input type="radio" name="gender" value="1" ${gender=='0'?'checked="checked"':''}/>46 
    47     </body>

    运算符

    说明

    范例

    结果

    +

    ${17+5}

    22

    -

    ${17-5}

    12

    *

    ${17*5}

    85

    /或div

    ${17/5}或${17 div 5}

    3

    %或mod

    取余

    ${17%5}或${17 mod 5}

    2

    ==或eq

    等于

    ${5==5}或${5 eq 5}

    true

    !=或ne

    不等于

    ${5!=5}或${5 ne 5}

    false

    <或lt

    小于

    ${3<5}或${3 lt 5}

    true

    >或gt

    大于

    ${3>5}或${3 gt 5}

    false

    <=或le

    小于等于

    ${3<=5}或${3 le 5}

    true

    >=或ge

    大于等于

    ${3>=5}或${3 ge 5}

    false

    &&或and

    并且

    ${true&&false}或${true and false}

    false

    !或not

    ${!true}或${not true}

    false

    ||或or

    或者

    ${true||false}或${true or false}

    true

    empty

    是否为空

    ${empty “”},可以判断字符串、数据、集合的长度是否为0,为0返回true。empty还可以与not或!一起使用。${not empty “”}

    true

    EL操作操作对象的方式

    l  操作List和数组:${list[0]}、${arr[0]};

    l  操作bean的属性:${person.name}、${person[‘name’]},对应person.getName()方法;

    l  操作Map的值:${map.key}、${map[‘key’]},对应map.get(key)。

            List:按照索引取

            Map:按照key取绑定的对象。

      <!-- 获取Map中的数据 -->
    
        <%
    
        Map<String,Person> map = new HashMap<String,Person>();
    
        map.put("p1", new Person("刘艳伟"));
    
        map.put("p2", new Person("宋旭东"));
    
        map.put("p3", new Person("李梅"));
    
        pageContext.setAttribute("mm", map);
    
        %>
    
        <!-- 获取map中的数据,先获取键,再name -->
    
        ${mm.p3.name }<hr/>


    注意: *在使用EL获取参数时,如果参数不存在,返回的是空字符串,而不是null。这一点                     与使用request.getParameter()方法是不同的。

          * *${EL表达式}, ${pp.address.city} == ${pp['address']["city"]} 当参数名中间有-号非法字符时,应用[]来取,否则应为有-而报错

    EL隐藏对象

        请不要与JSP内置对象混淆,一个是表示对象本身,其余表示的都是Map

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

            EL内置对象名称                         表示的类型                                           

            pageContext                                                          javax.servlet.jsp.PageContext       

            pageScope                                                             java.util.Map                    

            requestScope                                                        java.util.Map                     

            sessionScope                                                        java.util.Map                     

            applicationScope                                                   java.util.Map                     

            param                                                                     java.util.Map              

            paramValues                                                java.util.Map              

            header                                                                     java.util.Map              

            headerValues                                                       java.util.Map               

            cookie                                         java.util.Map      

           initParam                                     java.util.Map                       

    1        参数隐藏对象

    这些隐藏对象都是Map类型!

    l  param:param是Map<String,String>类型!param对象可以用来获取参数,与request.getParameter()方法相同。

                           

    注意,在使用EL获取参数时,如果参数不存在,返回的是空字符串,而不是null。这一点与使用request.getParameter()方法是不同的。

     

    l  paramValues:paramValues是Map<String, String[]>类型,当一个参数名,对应多个参数值时可以使用它。

     

    l  header:header是Map<String,String>类型,用来获取请求头。

     

    l  headerValues:headerValues是Map<String,String[]>类型。当一个请求头名称,对应多个值时,使用该对象,这里就不在赘述。

    l  initParam:initParam是Map<String,String>类型。它对应web.xml文件中的<context-param>参数。

     

    l  cookie:cookie是Map<String,Cookie>类型,其中key是Cookie的名字,而值是Cookie对象本身。

     

    2        域隐藏对象

    使用EL表达式最为常用的就是获取域对象中保存的数据。例如:${pageScope.xxx},表示获取在pageContext保存的数据。当然${pageScope[‘xxx’]}是相同的!

    l  pageScope:pageScope是Map<String,Object>类型,${pageScope.xxx}的功能相等与pageContext.getAttribute(“xxx”)。两者的区别在于,前者在数据不存在时返回空字符串,而后者返回null。

    l  requestScope:requestScope是Map<String, Object>类型,装载了request对象中的所有数据;

    l  sessionScope:sessionScope是Map<String, Object>类型,装载了session对象中的所有数据;

    l  applicationScope:applicationScope是Map<String, Object>类型,装载了application对象中的所有数据;

    当EL中给出的不是隐藏对象时,表示在四个域中查找数据。例如:${a},表示

    l  在${pageScope.a}中查找,如果找到就返回;

    l  在${requestScope}中查找,如果找到就返回;

    l  在${sessionScope}中查找,如果找到就返回;

    l  在${applicationScope}中查找,如果找到就返回,找不到就返回空字符串。

    3 页面上下文隐藏对象

    l  pageContext:pageContext是PageContext类型!可以使用pageContext对象调用getXXX()方法,例如pageContext.getRequest,可以${pageContext.request}。

    Expression

    说明

    ${pageContext.request.queryString}

    pageContext.getRequest().getQueryString();

    ${pageContext.request.requestURL}

    pageContext.getRequest().getRequestURL();

    ${pageContext.request.contextPath}

    pageContext.getRequest().getContextPath();

    ${pageContext.request.method}

    pageContext.getRequest().getMethod();

    ${pageContext.request.protocol}

    pageContext.getRequest().getProtocol();

    ${pageContext.request.remoteUser}

    pageContext.getRequest().getRemoteUser();

    ${pageContext.request.remoteAddr}

    pageContext.getRequest().getRemoteAddr();

    ${pageContext.session.new}

    pageContext.getSession().isNew();

    ${pageContext.session.id}

    pageContext.getSession().getId();

    ${pageContext.servletContext.serverInfo}

    pageContext.getServletContext().getServerInfo();

    JSTL(core和fn)

    JSTL概述

    1 什么是JSTL

    JSTL是apache对EL表达式的扩展(也就是说JSTL依赖EL),JSTL是标签语言!

    既然是第三方的东西,那么就需要导包。但是如果你使用的是MyEclipse,那么MyEclipse会帮你导包的。

    2 JSTL标签库结构

    3 导入标签库

    导入标签库需要使用taglib指令!

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

    JSTL核心库

    1 out和set(重点)

     out

    <c:out value=”aaa”/>

    输出aaa字符串常量

    <c:out value=”${aaa}”/>

    与${aaa}相同

    <c:out value=”${aaa}” default=”xxx”/>

    当${aaa}不存在时,输出xxx字符串

    <%

    request.setAttribute("a","<script>alert('hello');</script>");

    %>

    <c:out value="${a }"   default="xxx" escapeXml="false" />

    当escapeXml为false,不会转换“<”、“>”。这可能会受到JavaScript攻击。

    set:set标签的var、value、scope是一组,而target、property、value是一组。

    <c:set var=”a” value=”hello”/>

    在pageContext中添加name为a,value为hello的数据。

    <c:set var=”a” value=”hello” scope=”session”/>

    在session中添加name为a,value为hello的数据。

    <jsp:useBean   id="user" class="cn.itcast.domain.User"/>

    <c:set target="${user   }" property="username" value="qdmmy6"/>

    <c:set target="${user   }" property="password" value="123456"/>

    <c:out value="${user }"   />

    给user的username属性赋值qdmmy6,给user的password属性赋值123456。

    2 remov

           <%

                  pageContext.setAttribute("a",   "pageContext");

                  request.setAttribute("a",   "session");

                  session.setAttribute("a",   "session");

                  application.setAttribute("a",   "application");

           %>

           <c:remove   var="a"/>

           <c:out   value="${a }" default="none"/>

    删除所有域中name为a的数据!

    <c:remove var="a" scope=”page”/>

    删除pageContext中name为a的数据!

    3 url

      url标签会在需要URL重写时添加sessionId。

    <c:url value="/"/>

    输出上下文路径:/day08_01/

    <c:url value="/"   var="a" scope="request"/>

    把本该输出的结果赋给变量a。范围为request

    4 if和choose(重点)

      if标签的test属性必须是一个boolean类型的值,如果test的值为true,那么执行if标签的内容,否则不执行。

    <c:set var="a"   value="hello"/>

    <c:if test="${not empty a }">

        <c:out value="${a }"/>

    </c:if>

    choose标签对应Java中的if/else if/else结构

    when标签的test为true时,会执行这个when的内容。

    当所有when标签的test都为false时,才会执行otherwise标签的内容

    <c:set var="score"   value="${param.score }"/>

    <c:choose>

        <c:when test="${score > 100   || score < 0}">错误的分数:${score }</c:when>

        <c:when test="${score >= 90   }">A级</c:when>

        <c:when test="${score >= 80   }">B级</c:when>

        <c:when test="${score >= 70   }">C级</c:when>

        <c:when test="${score >= 60   }">D级</c:when>

        <c:otherwise>E级</c:otherwise>

    </c:choose>

    5 forEach(重点)

      forEach当前就是循环标签了,下面例子中设置域变量i,初始值为1,结束值为100。即i的值从1遍历到100,包含100。

    <c:set var="sum" value="0" />
    <c:forEach var="i" begin="1" end="10">
        <c:set var="sum" value="${sum + i}" />
    </c:forEach>
    
    <c:out value="sum = ${sum }"/>
    <c:set var="sum" value="0" />
    <c:forEach var="i" begin="1" end="10" step ="2">
        <c:set var="sum" value="${sum + i}" />
    </c:forEach>
    <c:out value="sum = ${sum }"/>

          还可以使用forEach来遍历数据或集合,遍历数组:

    <%

    String[] names =   {"zhangSan", "liSi", "wangWu", "zhaoLiu"};

    pageContext.setAttribute("ns", names);

    %>

    <c:forEach var="item" items="${ns } ">

        <c:out value="name: ${item }"/><br/>

    </c:forEach>

    遍历List

    <%

        List<String> names = new   ArrayList<String>();

        names.add("zhangSan");

        names.add("liSi");

        names.add("wangWu");

        names.add("zhaoLiu");

        pageContext.setAttribute("ns", names);

    %>

    <c:forEach var="item"   items="${ns }">

        <c:out value="name: ${item }"/><br/>

    </c:forEach>

    遍历Map

    <%

        Map<String,String> stu = new   LinkedHashMap<String,String>();

        stu.put("number", "N_1001");

        stu.put("name", "zhangSan");

        stu.put("age", "23");

        stu.put("sex", "male");

        pageContext.setAttribute("stu", stu);

    %>

    <c:forEach var="item " items="${stu }">

        <c:out value="${item.key }: ${item.value } "/><br/>

    </c:forEach>

    forEach标签还有一个属性:varStatus,这个属性用来指定接收“循环状态”的变量名,例如:<forEach varStatus=”vs” …/>,这时就可以使用vs这个变量来获取循环的状态了。

    l  count:int类型,当前以遍历元素的个数;

    l  index:int类型,当前元素的下标;

    l  first:boolean类型,是否为第一个元素;

    l  last:boolean类型,是否为最后一个元素;

    l  current:Object类型,表示当前项目。

    <c:forEach var="item"   items="${ns }" varStatus="vs"> <!-- varStatus 把循环状态赋给vs -->

        <c:if test="${vs.first }">第一行:</c:if>  <!--如果是第一行,那么${vs.first}为true --> 

        <c:if test="${vs.last }">最后一行:</c:if> 

        <c:out value="${vs.count }: "/>  <!-- 返回行数,从1开始-->

        <c:out value="[${vs.index } ]: "/>    <!-- 返回行数,从0开始-->

        <c:out value="name: ${vs.current } "/><br/>  <!--当前项,与${item}相同 -->

    </c:forEach>

  • 相关阅读:
    1253:抓住那头牛
    1251:仙岛求药
    1330:【例8.3】最少步数
    1329:【例8.2】细胞
    1216:红与黑
    1217:棋盘问题
    回溯法与深度优先搜索的关系
    自然数的拆分
    100——第35例
    100——第34例
  • 原文地址:https://www.cnblogs.com/lulu638/p/4257552.html
Copyright © 2011-2022 走看看