• EL表达式


    EL表达式学习

      1.什么是EL表达式

        全称:Expression Language.一种写法非常简洁的表达式。语法简单易懂,便于使用。表达式语言的灵感来自于ECMAScript和XPath表达式语言。

      2.EL表达式的作用

        作用:让jsp书写起来更加的方便。简化在jsp中获取作用域或者请求数据的写法。也会搭配Jstl来进行使用。

      3.使用EL表达式

        语法结构:${expression}:提供 . 和 [] 两种运算符来存取数据。

      使用:  

          a)使用EL表达式获取请求数据

    •         获取用户请求数据(请求实体)

                ${param.键名}获取请求实体中一个键一个值的数据

                ${paramValues.键名}获取请求实体中同键不同值的数据,返回的是String数组,可以使用角标直接获取 例如:爱好

    •          获取请求头数据

                ${header}返回所欲的请求数据,键值对形式

                ${header['键名']}返回指定的键的请求头数据

                ${headerValues[‘键名’]}

    •         获取cookie数据

                ${cookie}获取所有cookie对象 键值对

                ${cookie.Cookie对象的键名} 获取了指定cookie数据的cookie对象

                ${cookie.Cookie对象的键名.name}获取存储了指定cookie数据的cookie对象的存储的键

                ${cookie.Cookie对象的域名.value}获取存储了指定cookie数据的cookie对象存储的值

           

          b)使用EL表达式获取作用域数据

            作用域对象:pageContext request session application

            获取作用域数据:我们使用setAttribute方法存储的数据

            获取:

                     普通字符串数据  ${键名}

                对象数据 ${键名.属性名}

                集合数据

                    list集合 ${键名[角标]}

                    Map集合 ${map集合作用域键名。map集合存储的数据的键名}

              作用域查找顺序: 如果找到了则不再查找,如果找不到,则继续查找下一个作用域,如果四个作用域中都没有则什么都不显示。

                      pageContext---->request---->session--->application

              指定作用域取数据:

                      ${pageScope.键名} 指明获取pagecontext作用域中的数据

                      ${requestScope.键名}指明获取request作用域中的数据

                      ${sessionScope.键名}指明获取session作用域中的数据

                      ${applicationScope.键名}指明获取application作用域中的数据

                                                                          ${cookie.user.username}

          c)使用EL表达式运算

            算术运算:+ - * / 在EL表达式中可以直接进行算术运算

            关系运算: && ||  !

                  ${逻辑表达式}

                  注意:没有单&单|

            比较运算:== !=   >, >=, <,<=

                         ${比较表达式}

            三目运算符:

                  ${条件?值:值}

          d)EL表达式空值判断empty

                  ${empty 键名}

                  作用:

                      判断该键是否存储有效数据。

    <%@ page language="java" import="java.util.*,wq.pojo.*" pageEncoding="UTF-8"%>
    <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"  %>
    <!-- 将流转数据显示到浏览器中,使用传统的方式 -->
    <%=request.getAttribute("str")%><br>
    <%=((User)request.getAttribute("user")).getFav()%><br>
    <%=((ArrayList)request.getAttribute("list")).get(2)%><br>
    <%=((User)((ArrayList)request.getAttribute("list")).get(3)).getFav()%><br>
    <%=((HashMap)request.getAttribute("hs")).get("b1")%><br>
    <%=((User)((HashMap)request.getAttribute("hs")).get("c1")).getFav()%>
    <hr>
    ${str}<br>
    ${user.fav}<br>
    ${list[2]}<br>
    ${list[3].fav}<br>
    ${hs.b1}<br>
    ${hs.u.fav}<br>
    <hr>
    <h3>获取请求实体数据(请求实体)</h3>
    <%=request.getParameter("uname")%>---${param.uname}<br>
    <%=request.getParameterValues("fav")[1]%>--${paramValues.fav[1]}<br>
    <%=request.getHeader("User-Agent")%>---${header["User-Agent"]}--${headerValues["Accept-Language"][0]}<br>
    <h3>获取cookie数据</h3>
    ${cookie}<br>
    ${cookie.name}<br>
    ${cookie.JSESSINI.name}--${cookie.JSESSIONID.value}
    <h3>EL获取作用域数据时作用域的查找顺序</h3>
    <%
        pageContext.setAttribute("hello", "hello pageContext");
        request.setAttribute("hello","hello rquest");
        session.setAttribute("hello", "hello session");
        application.setAttribute("hello", "hello application");
    %>
      ${requestScope.hello}--${a}
      <h3>EL表达式的逻辑运算</h3>
      
      <%
         request.setAttribute("a", "2");            
           
      %>
              ${1+2}---${2*3}--${a+3}---${1+"5"}
              ${2>3&&4<5}---&{2>3||4<5}--${!(2>3)}
              ${2==2}---${3>2}<br>
             ${2>3?"":""}
          <h3>EL表达式的empty</h3>    
     
     <%
             request.setAttribute("str", "");
             User u=new User();
             request.setAttribute("name", u);
             ArrayList la=new ArrayList();
             request.setAttribute("la", la);
     %>
      ${empty str}<br>
      ${u}<br>
      ${la}<br>
      
    View Code

     JSTL标签库   

    1.什么是jstl标签库

    • jstl是apache对EL表达式的扩展(也就是jstl依赖EL),JSTL是标签语言!JSTL标签使用以来非常方便,它与jsp动作标签一样,只不过他不是jsp内置标签,需要我们自己导包,以及指定标签而已。
    • 如果你使用MyEclipse开发javaWeb,那么在把项目发布到tomcat时,你会发现,myeclipse会在lib目录下存放jstl的jar包!如果你没有使用myeclipse开发那么需要自己来导入这个jstl的jar包:jstl-1.2.jar

    2.JSTL标签库的作用

    • 用来提升在jsp页面的逻辑代码的编码效率,使用标签来代替逻辑代码的直接书写,高效,美观,整洁,易读。

    3.使用JSTL标签库

    a)内容:

    • i.核心标签库(学习)(学习)
    • ii.格式化标签库
    • iii.函数标签库
    • iv.XML标签库
    • v.SQL标签库

    b)使用:

    i.导包

    ii.使用taglib标签引入资源

    iii.核心标签库。

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

    内容:

       out标签:<c:out value="${表达式}"  default="默认值" ></c:out>

    作用:结合EL表达式将数据响应给浏览器。如果EL表达式没有取到数据则可以使用default属性声明默认值。

       set标签:  <c:set value="数据" var="键名" scope="作用域名"></c:set>

    作用:将数据存储到指定的作用域中,默认值pageContext作用域

      remove标签:<c:remove var="要删除数据的键名" scope="作用域名"/>

    作用:删除作用域中的数据,默认是删除四个作用域中符合要求的数据。

              但是可以通过scope属性指明要删除的作用域数据

    注意:

      使用pageContext.removeAttribute("键名"); 此方法将四个作用域中符合的数据都会删除

           使用pageContext.removeAttribute(String name,int scope); 

                     要删除的作用域中的数据scope的值为1.pageContext,2.request,3.session,4.application

           使用request.removeAttribute("键名"); 删除当前作用域中符合要求的数据

           使用session.removeAttribute("键名"); 删除当前作用域中符合要求的数据

          使用application.removeAttribute("键名");删除当前作用域中符合要求的数据

    逻辑标签:

                      单分支判断标签:<c:If test="${表达式}">数据</c:if>

                    作用:可以根据el表达式进行一定程度的单分支逻辑判断。

                 注意:

                           test属性中书写的是EL表达式,或者说是EL表达式。

                            该标签只能进行EL表达式相关的逻辑判断,不能进行EL表达式不能获取的数据的逻辑处理。

     多分支判断标签:

                      <c:hoose>

                                 <c:when test="${表达式}"><c:when>

                                 <c:when  test=" ${表达式}"><c:when>

                                  ..

                                <c:otherwise></c:otherwise>

                   注意:

                              符合条件后执行一个分支,其他分支不会执行。

    循环标签:

                   <c:foreach>

                        循环体

                  </c:foreach>

      属性:

                     begin:声明循环的开始位置

                     end:声明循环的结束位置

                     step:声明循环的步长

                    varStatus:声明变量记录循环状态,例如变量:i

                               注意:记录的数据存储到作用域中可以直接使用EL表达式进行获取

                              实例:${i.index} 获取当次循环的下标

                                         ${i.count} 获取当次循环的次数

                                         ${i.first} 判断是否第一次循环

                                         ${i.last}判断是否是最后一次循环

            items:声明要遍历的数据,可以是集合和数组等

                                     注意:要使用EL表达式来获取

                                    var:声明变量记录每次遍历的结果。可以做循环体中使用EL表达式获取遍历出来的数据。

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%
        request.setAttribute("str", "jstl");
    %>
    <%request.setAttribute("str1","jstl学习");%>
    -----------${str1}
    --------------<c:out value="${str2}" default="404"></c:out>
    <hr>
    <!-- set标签学习 -->
    <% 
       request.setAttribute("s1", "set标签学习");
    %>
    <c:set value="set标签学习2" var="s2" scope="request"></c:set>
    <c:set value="hello pageContext" var="hello" scope="page"></c:set>
    <c:set value="hello request" var="hello" scope="request"></c:set>
    <c:set value="hello session" var="hello" scope="session"></c:set>
    <c:set value="hello application" var="hello" scope="application"></c:set>
    ${s1}---${requestScope.s2}---${pageScope.hello}
    <br> ${hello}
    
    <hr>
    <!-- remove标签学习 -->
    <%-- <c:out value="${hello}"></c:out> --%>
    <%
        pageContext.removeAttribute("hello");
        request.removeAttribute("hello");
    %>
    ${pageScope.hello}
    ${hello}
    
    <hr>
    <!-- 单分支判断标签 -->
    <c:set var="a" value="12"></c:set>
    <% 
        int a=Integer.parseInt((String)pageContext.getAttribute("a"));
        if(a>8){
    %>
        <b>今天天气真好,适合学习1</b>
    <% 
        }
     %>
    
    <c:if test="${a>8}">
        <b>今天天气真好,适合学习2</b>
    </c:if>
    <hr>
    <!-- 多分枝逻辑判断 -->
    <c:set var="scope" value="100"></c:set>
    <c:choose>
        <c:when test="${scope>=90}">
            <i>苹果</i>
        </c:when>
        <c:when test="${scope>=70&&score<80}">
           <i>苹果</i>
        </c:when>
        <c:when test="${scope>=80&&scope<70}"></c:when>
        <c:otherwise>
          <i>男女混合双打</i>
        </c:otherwise>
    </c:choose>
    <br>
    <hr>
    <!-- 循环标签 -->
    <c:forEach begin="0" end="5" step="1" varStatus="i">
            <c:if test="${i.count==3}">
                 <u>我是第三次循环</u>
            </c:if>
            111111-${i.index}--${i.count}---${i.first}---${i.last}<br>
    </c:forEach>
    <!-- 循环标签遍历集合 -->
    <%
        //创建测试数据list
         ArrayList<String> list=new ArrayList<String>();
        list.add("苹果");
        list.add("榴莲");
        list.add("荔枝");
        request.setAttribute("list", list);
    
    %>
    <c:forEach items="${list}" var="s" varStatus="i">
        ${s}--${i.index}---${i.count}<br>
    </c:forEach>
    
    <!-- 遍历map集合 -->
    <%
        //声明map集合测试数据
        HashMap<String,String> hs=new HashMap<String,String>();
        hs.put("s1", "唱歌");
        hs.put("s2", "跳舞");
        hs.put("s3", "敲代码");
        //将数据存储到作用域中
        request.setAttribute("hs", hs);
    %>    
        <c:forEach items="${hs}" var="s">
        ${s.key}---${s.value}<br>
        </c:forEach>
    View Code

             

  • 相关阅读:
    windows基线检测脚本编写指南-powershell版
    2020蓝帽杯CTF Web 题
    2020天翼杯CTF Web 题
    Firefox 密码脱取
    利用iptables做端口转发
    Flask 快速学习笔记
    JSP无%%号命令执行一句话
    linux 后渗透凭据收集
    Fastjson漏洞利用
    Gogs远程命令执行利用
  • 原文地址:https://www.cnblogs.com/wq-9/p/10744295.html
Copyright © 2020-2023  润新知