EL表达式和JSTL标签库

本文详细介绍了EL表达式的基本概念、在JSP中的使用,包括数据输出、搜索顺序、操作运算、隐含对象、JSTL标签库中的核心标签如的用法,以及如何在实际开发中操作Bean的属性和集合。
摘要由CSDN通过智能技术生成

1.EL表达式

a)什么是EL表达式,作用?

全称:Expression language,是表达式语言

作用:代替jsp页面中的表达式脚本在jsp页面进行数据的输出。

<body>
    <%
        request.setAttribute("key","111");
    %>

    表达式脚本输出值:<%=request.getAttribute("key")%><br>
    EL表达式输出值:${key}
</body>

EL表达式的格式是:${表达式}

EL表达式在输出null值的时候为空串;jsp表达式在输出null值的时候,输出的是null字符串。

b)EL表达式搜索域数据的顺序

EL表达式主要是在jsp页面输出数据。

主要是输出域对象数据

当四个域有相同key的数据的时候,按四个域大小顺序从小到大搜索输出

<body>
    <%
//      pageContext.setAttribute("key","PageContext");
      request.setAttribute("key","request");
      session.setAttribute("key","session");
      application.setAttribute("key","application");
    %>
    ${key}
</body>

c)EL表达式输出Bean的普通属性、数组属性、List集合属性,map属性

<body>
    <%
      Person person = new Person();
      person.setName("lili");
      person.setPhone(new String[]{"1231","12323"});

      ArrayList<String> strings = new ArrayList<>();
      strings.add("北京");
      strings.add("上海");
      strings.add("天津");
      person.setCities(strings);

      HashMap<String, Object> stringObjectHashMap = new HashMap<>();
      stringObjectHashMap.put("key1","value1");
      stringObjectHashMap.put("key2","value2");

      person.setMap(stringObjectHashMap);

      pageContext.setAttribute("p",person);
    %>

    输出Person:${p};<br>
    输出Person的name属性:${p.name};<br>
    输出Person的Phone数组个别属性值:${p.phone[0]};<br>
    输出Person的cities集合中的元素值:${p.cities};<br>
    输出Person的cities集合中的个别元素值:${p.cities[0]};<br>
    输出Person的Map集合:${p.map};<br>
    输出Person的Map集合的value值:${p.map.values()};<br>

</body>

 d)EL表达式——运算

1)关系运算

    ${1 == 2} 或 ${12 eq 12}<br>
    ${12 != 1} 或 ${12 ne 12}<br>
    ${12 < 12} 或 ${12 lt 12}<br>
    ${12 > 12} 或 ${12 gt 12}<br>
    ${12 <= 12} 或 ${12 le 12}<br>
    ${12 >= 12} 或 ${12 ge 12}<br>

2)逻辑运算

    ${12 == 12 && 12< 12} or ${12 == 12 and 12<12} <br>
    ${12 == 12 || 12<12}  or ${12 == 12 or 12<12} <br>
    ${!true} or ${not true}<br>

3)算数运算

    ${12 + 12}<br>
    ${12 - 12}<br>
    ${12 * 12}<br>
    ${12 / 12} or ${12 div 12}
    ${18 % 12} or ${18 mod 12}<br>

4)empty运算

empty运算可以判断一个数据是否为空,如果为空,则输出true,不空输出false。

以下几种情况为空:

  1. 值为null值时为空
  2. 值为空串时为空
  3. 值是object类型数组,长度为0时为空
  4. list集合,元素个数为空
  5. map集合,元素个数为0
    ${empty emptyNull}<br>
    ${empty emptyStr}<br>
    ${empty emptyArr}<br>
    ${empty emptyList}<br>
    ${empty emptyMap}<br>

5)三元运算

    ${1==2?"yes":"no"}

6) .点运算和[]中括号运算

        .点运算,可以输出Bean对象中某个属性的值。

        []中括号运算,可以输出有序集合中某个元素的值,且可以输出map集合中key里含有特殊字符的key的值。

<body>
    <%
        HashMap<String, String> map = new HashMap<>();
        map.put("a","aValue");
        map.put("a.a.a","aaaValue");
        map.put("b+b+b","bbbValue");
        map.put("c-c-c","cccValue");
        request.setAttribute("map",map);
    %>

    ${map.a}<br>
    ${map["a.a.a"]}<br>
    ${map["b+b+b"]}<br>
    ${map["c-c-c"]}<br>
</body>

e)EL表达式的11个隐含对象

变量类型作用
pageContextPageContextImpl可以获取jsp中的九大内置对象
pageScopeMap<String,Object>

可以获取pageContext域中的数据

requestScopeMap<String,Object>可以获取Request域中的数据
sessionScopeMap<String,Object>可以获取Session域中的数据
applicationScopeMap<String,Object>可以获取ServletContext域中的数据
paramMap<String,String>可以获取请求参数的值
paramValuesMap<String,String[]>可以获取请求参数的值,获取多个值的时候使用
headerMap<String,String>可以获取请求头的信息
headerValuesMap<String,String[]>可以获取请求头的信息,获取多个值的时候使用
cookieMap<String,Cookie>可以获取当前请求的Cookie信息
initParamMap<String,String>可以获取在web.xml中配置的<context.param>上下文参数

i.EL获取四个特定域中的属性

<body>
    <%
        pageContext.setAttribute("key","pageContext1");
        request.setAttribute("key","request");
        session.setAttribute("key","session");
        application.setAttribute("key","application");
    %>

    ${pageScope.key}<br>
    ${requestScope.key}<br>
    ${sessionScope.key}<br>
    ${applicationScope.key}<br>
</body>

ii.pageContext对象的使用

  1. 协议
  2. 服务器ip
  3. 服务器端口
  4. 获取工程路径
  5. 获取请求方法
  6. 获取用户ip
  7. 获取会话的id编号
    <%--
        request.getScheme()获取请求的协议
        request.getServerName() 获取请求的服务器ip或域名
        request.getServerPort() 获取请求服务器端口号
        request.getContextPath() 获取请求服务器的工程路径
        request.getMethod() 获取请求的方式
        request.getRemoteHost() 获取客户端ip
        session.getId() 获取会话的唯一标识
    --%>
    <%=request.getScheme()%>
    <%=request.getServerName()%>
    <%=request.getServerPort()%>
    <%=request.getContextPath()%>
    <%=request.getMethod()%>
    <%=request.getRemoteHost()%>
    <%=session.getId()%>
    <br>
    协议: ${pageContext.request.scheme}<br>
    服务器ip:${pageContext.request.serverName}<br>
    服务器端口: ${pageContext.request.serverPort}<br>
    获取工程路径: ${pageContext.request.contextPath}<br>
    获取请求方法:${pageContext.request.method}<br>
    获取用户ip:${pageContext.request.remoteHost}<br>
    获取会话的id编号:${pageContext.session.id}<br>

iii.EL表达式其他隐含对象的使用

<body>
    <%--
        ?username=lili&password=111&hobby=p&hobby=h
    --%>
    输出请求参数的值:${param.hobby}<br>
    输出请求参数的值(有多个值):${paramValues.hobby[1]}<br>
    <hr>
    输出请求头信息:${header}<br>
    <hr>
    输出请求头【User-Agent】信息:${header['User-Agent']}<br>
    <hr>
    输出请求头【User-Agent】信息(有多个值):${headerValues['User-Agent'][0]}<br>
    <hr>
    输出cookie对象:${cookie.JSESSIONID}<br>
    输出cookie名称:${cookie.JSESSIONID.name}<br>
    输出cookie值:${cookie.JSESSIONID.value}<br>
    <hr>
    <%--
        <context-param>
            <param-name>yuyu</param-name>
            <param-value>1213</param-value>
        </context-param>       
    --%>
    获取web.xml文件中的&lt;context-param&gt;:${initParam}
</body>

2. JSTL标签库

        EL表达式主要是替代jsp中的表达式脚本,标签库则是替代代码脚本

        JSTL有五个不同功能的标签库组成:

功能范围URI(taglib指令导入使用)前缀
核心标签库<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>c
格式化<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>fmt
函数<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>fn
数据库(不使用)<%@taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>sql
XML(不使用)<%@taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>x

 f)JSTL标签库的使用步骤

  1. 先导入jstl标签库的jar包
  2. 使用taglib指令导入标签库

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

e) core核心库使用

i.<c:set />

<body>
    存数据前:${requestScope.abc}<br>
    <c:set scope="request" var="abc" value="abcValue"/>
    存数据后:${requestScope.abc}<br>
</body>

        作用:set标签可以在域中存数据,即域对象.setAttribute(key,value);

        scope属性设置保存到哪个域:page表示pageContext域(默认),request表示Request域,session表示Session域,application表示ServletContext域

        var属性表示key设置键,value表示value设置值

ii.<c:if />

        if标签做if判断,test属性表示判断的条件(使用EL表达式):

    <c:if test="${12 == 12}">
        <h1>
            12 == 12
        </h1>
    </c:if>

iii.<c:choose><c:when><c:otherwise>标签

        作用:多路判断,跟switch...case...default非常接近

        choose标签开始选择,when标签表示一种判断情况,test属性写入判断(EL表达式),otherwise标签为剩下情况。

        <c:choose><c:when><c:otherwise>使用时需注意:

        1.标签里不能使用html注释,要使用jsp注释

        2.when标签的父标签一定要是父标签

    <c:choose>
        <c:when test="${requestScope.height > 190}">
            <h1>非常高</h1>
        </c:when>
        <c:when test="${requestScope.height > 180}">
            <h1>很高</h1>
        </c:when>
        <c:when test="${requestScope.height>170}">
            <h1>还可以</h1>
        </c:when>
        <c:otherwise>
            <c:choose>
                <c:when test="${requestScope.height>160}">
                    <h2>大于160</h2>
                </c:when>
                <c:when test="${requestScope.height>150}">
                    <h2>大于150</h2>
                </c:when>
                <c:otherwise>
                    <h2>小于150</h2>
                </c:otherwise>
            </c:choose>
        </c:otherwise>
    </c:choose>

iv.<c:forEach/>

作用:遍历输出使用

        1.遍历1到10输出,begin属性设置开始索引,end属性设置结束索引,var表示循环的变量(也是当前正在遍历的数据)

    <table>
        <c:forEach begin="1" end="10" var="i">
            <tr>
                <td>第${i}行</td>
            </tr>
        </c:forEach>
    </table>

        2.遍历Object数组,items属性表示遍历的数据源,var属性表示当前遍历到的数据,即

for(Object var:items)

    <c:forEach items="${requestScope.arr}" var="item">
        ${item}<br>
    </c:forEach>

        3.遍历map集合

    <c:forEach items="${requestScope.map}" var="entry">
        <h1>${entry.key} = ${entry.value} </h1>
    </c:forEach>

        4.遍历List集合,LIst中存放Student类

    <table>
        <tr>
            <th>编号</th>
            <th>姓名</th>
            <th>密码</th>
        </tr>
        <c:forEach items="${requestScope.stus}" var="stu">
            <tr>
                <td>${stu.id}</td>
                <td>${stu.username}</td>
                <td>${stu.password}</td>
            </tr>
        </c:forEach>
    </table>

        5.属性组合使用

        <c:forEach begin="0" end="2" step="2" varStatus="status" items="${requestScope.stus}" var="stu">
            <tr>
                <td>${stu.id}</td>
                <td>${stu.username}</td>
                <td>${stu.password}</td>
            </tr>
        </c:forEach>

        varStatus标签:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值