el&jstl

EL和JSTL

  1. 掌握el表达式获取值
  2. 了解el表达式运算
  3. 了解el表达式内置对象
  4. 会用jstl常用的标签

一.el表达式

产生背景

  • 从JSP2.0开始,就不推荐使用java脚本,而是使用el表达式或者动态标签代替 java脚本; 页面标签;

概念和原理

  • 概念:Expression Language :jsp内置的一种表达式语言;
  • 原理:el表达式的出现目的是替换jsp中的java的脚本中的<%=%>
  • 并且内部进行了null值判断,如果为null则不会输出 ,不为null输出对应数据

写法规范

  • ${表达式语言}
<%--<%= request.getAttribute("uname")%>--%>
<!-- 等价于<%=  %>输出内容 会自动获取域中数据 并进行null值判断 -->
        ${uanme}

使用场景

  • 获取域对象中的值(*)
  • 执行运算符号
  • 调用java中方法(了解)
  • EL表达式内置常用对象(重要)

从作用域访问对象

从page,request,session,application域对象中取值

实现步骤
<%-- jsp的使用 --%>
<%-- 从域中取值 --%>
<%
    /*分别为不同域设置相应key 不同值的数据*/
    pageContext.setAttribute("key","pageValue");
    request.setAttribute("key","requestValue");
    session.setAttribute("key","sessionValue");
    application.setAttribute("key","applicationValue");
%>
<%-- 1.指定取值的域  从中取值 --%>
当前页面:${pageScope.key}<br>
当前请求:${requestScope.key}<br>
当前会话:${sessionScope.key}<br>
当前应用:${applicationScope.key}<br>

<%-- 2.自动查找域中的值 从作用域小的向上查找--%>
<%-- 自动查找会由下向上查找第一个指定的key并返回 如果使用自动查找 建议多个域中不要存储相同的key--%>
自动查找:${key}

获取数据中的值

获取数组,list,map,对象的值

<body>
<%-- jsp的使用 --%>
<%-- 从域中取值(数组 list集合  map集合)并打印获取 --%>
<%
    //分别创建数组 list集合 map集合 对象 存储至域中
    String [] arr={"张三","李四","王五"};
    ArrayList<String> arrayList=new ArrayList<>();
    Collections.addAll(arrayList,"二狗子","猪蹄子");
    HashMap<String,String> hashMap=new HashMap<>();
    hashMap.put("username","zhangsan");
    hashMap.put("password","123456");

    Student student=new Student("lisi","abcddef");
    //存到域中
    pageContext.setAttribute("arr",arr);
    pageContext.setAttribute("arrayList",arrayList);
    pageContext.setAttribute("hashMap",hashMap);
    pageContext.setAttribute("student",student);
%>
获取数组数据
<%-- 可以直接通过  域key值[索引]  的形式获取数组中对应的数据 --%>
${arr[0]}
${arr[1]}
${arr[2]}
<hr>
获取list集合数据
<%-- 可以直接通过  域key值[索引]  的形式获取数组中对应的数据 --%>
${arrayList[0]}
${arrayList[1]}
<%-- 也可以通过对应对象的方法进行操作(会进行类型转换) --%>
${arrayList.get(0)}
${arrayList.get(1)}
<hr>
获取map集合数据
<%-- 可以直接通过 域key值.map的key 形式获取对应的value--%>
${hashMap.username}
${hashMap.password}
<%-- 也可以通过对应对象的方法进行操作(会进行类型转换) --%>
${hashMap.get("username")}
${hashMap.get("password")}

<hr>
获取对象中的属性值
<%-- 可以直接通过 域key值.属性 形式获取对应的value --%>
${student.username}
${student.password}
<%-- 也可以通过对应对象的方法进行操作(会进行类型转换) --%>
${student.getUsername()}

<%-- 注意 在获取自定义对象属性时 如果使用.属性的形式进行获取 那么必须书写公开的的get方法 --%>
</body>

运算

基础运算加减乘除取模
关系运算== eq
> gt
< lt
>= ge
<= le
!= ne
逻辑运算&& 与
||或
! 非
empty运算符判断对象是否存在,或者集合的长度是否为0
<body>
<%
    pageContext.setAttribute("n1", 20);
    pageContext.setAttribute("n2", 10);
%>
${n1+n2}
${n1 == n2}
${n1 eq n2}
${n1 ne n2}
${empty a}//判断域对象中是否有a
</body>

内置对象

对象含义
pageScope
requestScope
sessionScope
applicationScope
代表当前页面
代表一次请求
代表一次会话 session
代表application
param返回客户端请求参数字符串值,相当于request.getParameter()
paramValues返回客户端请求参数字符串值,相当于request.getParameters()
pageContext可以获取其他八个内置对象
headerValues代表请求头
cookie代表客户端发送请求中的所有cookie
<h3>获取请求参数</h3>
<%= request.getParameter("username") %>

<h3>EL的方式</h3>
${ param.username }
${ paramValues.username[0] }


<h3>获取到请求头的信息</h3>
<%= request.getHeader("user-agent") %>

<h3>EL的方式</h3>
${ header["user-agent"] }


二.jstl标签库

概念

  • 概念
    • JavaServerPages Standard Tag Library,JSP标签标签库,是Apache提供的标签库,需要导入jar包,JSTL依赖EL表达式,获取值是由EL表达式来获取的,使用标签库提供的标签完成对应的功能

使用场景

<%-- 书写存储对象的集合 并存储至域中在jsp页面打印 --%>
<%
    ArrayList<Student> list = new ArrayList<>();
    list.add(new Student("zhangsan", "123456"));
    list.add(new Student("wangwu", "456788"));
    list.add(new Student("lisi", "987654"));
    pageContext.setAttribute("list",list);
    pageContext.setAttribute("s",new Student("lisi", "987654"));
%>
<%-- jsp el表达式只是替代获取与输出脚本 不能进行额外的操作 所以在获取集合时 只能依次取出 --%>
<table border="1">
    <thead><tr><td>序号</td><td>账号</td><td>密码</td></tr></thead>
    <tbody>
    <tr><td>1</td><td>${list[0].username}</td><td>${list[0].password}</td></tr>
    <tr><td>2</td><td>${list[1].username}</td><td>${list[1].password}</td></tr>
    <tr><td>3</td><td>${list[2].username}</td><td>${list[2].password}</td></tr>
    <tr><td>4</td><td>${list[3].username}</td><td>${list[3].password}</td></tr>
    </tbody>
</table>
<%-- 但是一般数据由后台(servlet)从数据库中取出 不一定有多少条 虽然越界不会显示数据 --%>
<%-- 但是html对应的还是会显示 这个时候就需要使用jstl帮我们进行一些特殊的书写 --%>
  • 向域对象存取值
  • 判断域对象中的值
  • 循环域对象中的值

使用步骤

1.导入jar包
  • jstl1.jar
  • stand.jar
2.在jsp中使用JSTL标签库
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
使用标签
<%-- jstl功能--%>
<%-- 1.对域对象进行赋值--%>
<%-- (1)c:set var声明变量(存储在域中的key)  value值(存储在域中的值)  scope选择域(存储在那个域中)--%>
<c:set var="aaa" value="bbb"  scope="session"/>
${aaa}
<%-- (2)c:set target对象名(要修改属性的对象) property要修改的属性  value要修改的值  --%>
<c:set target="${s}"  property="username"  value="sssss"/>
${s}

<%-- 2.将指定数据输出 并进行设置 --%>
<%-- value输出的数据  default当数据为null时替代输出的数据 默认为""空字符串  escapeXml是否转义 --%>
<c:out value="${null}" default="默认值" escapeXml="false"/>

<%-- 3.移除域中指定数据 --%>
<%-- var移除的key  scope移除数据的作用域 如果没有会自动查找 --%>
<c:remove var="s" scope="page"/>
<c:out value="${s}" default="没有数据" escapeXml="false"/>
if标签
  • 对语句进行判断,只有if,没有else

    • test:判断的条件 代替之前的()
    • var:把判断的条件的结果(true或者false)保存到var中
    • scope:作用域(将var值存放的作用域)
  • 案例

    <%-- 对域中数据进行判断操作  --%>
    <%-- 根据结果对页面内容进行书写 --%>
    <%-- c:if 根据test返回的结果执行对应代码块  将结果保存到var定义的变量并存储到scope设置的作用域中 --%>
    <c:if test="${s.username eq 'lisi'}" var="jg" scope="page">
        你叫李四
    </c:if>
    <c:if test="${s.username ne 'lisi'}">
        你不叫李四
    </c:if>
    
choose标签
  • 用来进行判断,但是重合的标签

  • 格式

    <c:choose>
    <c:when></c:when>
    <c:otherwise></c:otherwise>
    </choose>
    
  • 案例

    <%-- 当判断的条件存在多个并可能取反的时候 需要使用c:choose标签 --%>
    <%-- 可以看做 if esle if  else --%>
    <c:choose>
        <c:when test="${s.username eq 'zhangsan'}">你是张三</c:when>
        <c:when test="${s.username eq 'lisi'}">你是李四</c:when>
        <c:otherwise>我不认识你</c:otherwise>
    </c:choose>
    
foreach标签
  • 用来迭代数据

  • 属性

    • var:声明变量
  • begin:从那开始

    • end:结束
  • step:步长

    • varStatus:变量的状态
      current 当前这次迭代的(集合中的)项
      index 当前这次迭代从 0 开始的迭代索引
      count 当前这次迭代从 1 开始的迭代计数
      first 用来表明当前这轮迭代是否为第一次迭代的标志
      last 用来表明当前这轮迭代是否为最后一次迭代的标志
      begin begin 属性值
      end end 属性值
      step step 属性值
    • items:需要遍历的集合
  • 案例

    <%-- 当需要对域中存储的集合数据进行操作时 需要根据数据的实际数量进行页面的书写 --%>
    <%-- 这个时候就需要使用c:foreach标签 --%>
    <%-- 1.普通的循环操作 将内容重复指定次数输出 --%>
    <%-- var声明保存数据的变量(初始化语句)  begin初始化变量的初始值  end结束值  step步长(迭代语句)     --%>
    <%-- varStatus保存当前变量数据的信息对象 通过设置的对象名.属性名获取对应的信息 --%>
    <c:forEach var="i" begin="0" end="10" step="2" varStatus="status">
        ${i} /${status.end}   <br>
    </c:forEach>
    
    <%-- 2.遍历域中集合数据 --%>
    <%-- 只需要var 以及items  也可以携带 varstatus --%>
    <%-- var 每次取出的数据遍历   items域中存储的遍历的集合  --%>
    <c:forEach var="student"  items="${list}" varStatus="status">
    		${student}<br>
    </c:forEach>
    
    <%-- 通常使用表格以及c:foreach进行数据的展示 --%>
    <table border="1">
        <thead>
        <tr>
            <td>序号</td>
            <td>账号</td>
            <td>密码</td>
        </tr>
        </thead>
        <tbody>
        <c:forEach var="student" items="${list}" varStatus="status">
            <c:if test="${status.count%2==0}">
                 <tr style="background-color: red"><td>${status.count}</td><td>${student.username}</td><td>${student.password}</td></tr>
            </c:if>
            <c:if test="${status.count%2!=0}">
                  <tr style="background-color: green"><td>${status.count}</td><td>${student.username}</td><td>${student.password}</td></tr>
            </c:if>
        </c:forEach>
        </tbody>
    </table>
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值