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

 

         

posted @ 2019-04-21 11:24  wq9  阅读(3023)  评论(0编辑  收藏  举报