EL、JSTL

Wesley13
• 阅读 501

一、EL、JSTL

  首先我们要明白为什么要使用EL(Expression Language 表达式语言)、JSTL(JSP Standard Tag Library JSP标准标签库),jsp页面完全可以用java代码取代他们,也就是说本来是可以没有这两种技术的,但是我们实际开发中,有一个原则:页面中不应该出现java代码。因为满篇的<% %>和java代码,会使页面极度混乱,到后期根本无法维护。所以这时EL和JSTL就出现了,使用各种标签方式,可以让页面不出现一行<% %>。JSTL是sun公司定义的标准,它不依赖于任何一种框架,所以我们应该重点掌握。

  1、下面举一些简单的例子说明如何使用EL:

  假设在服务器端,设置了request.setAttribute("hello", "Hello World !") ;

  在jsp页面可以有两种方式显示hello中的内容:

  (jsp脚本方式:)<%=request.getAttribute("hello") %>    -->打印结果:Hello World !

  (EL表达式,使用方法,$和{ }:)${hello}    -->打印结果:Hello World !

  大括号里面的hello 就是scope中的变量,也就是在服务器端setAttribute中的hello 变量。这样我们就把<%%>去掉了,而且代码也简化了很多。

  在EL表达式中也有内置对象(也叫隐含对象,隐式对象都是一个意思),和jsp的内置对象基本上对应着,包括:pageScope,requestScope,sessionScope,applicationScope。

  那么既然有这么多个对象,上面那个例子中,EL表达式它怎么去找那个hello呢? 它会按范围从小到大的顺序依次查找hello这个变量,上个例子中,我们把hello放在了request中,那么她首先看pageScope中有这个hello吗,发现没有,那么继续requestScope,找到了,然后就显示其内容。

  这时默认的查找方法,我们还可以明确的告诉它从那个scope中去找,这样可以提高性能,因为明确了嘛,不用一个个挨着去找了,上面的例子我们可以改为:${ requestScope.hello }  

  注意的一点:EL和jsp脚本的不同,假设在服务器端并没有设置hello这个变量,那么jsp脚本就会显示null,而是用EL则什么都不显示。

  再举一个取对象的例子:

  假设定义了一个User类,里面包含了:userName, userAge, group 属性,还有相应的getter ,setter 方法。

  还定义了一个Group类,里面包含了:groupName 属性,还有相应的getter, setter 方法。

  在服务器端,有如下的代码:

  Group group = new Group() ;

  group.setGroupName("培训机构") ;

  User user = new User() ;

  user.setUserName("张三") ;

  user.setUserAge(20) ;

  user.setGroup(group) ;

  request.setAttribute("userObject", user) ;

  那么现在要在jsp页面中显示:

  姓名:${userObject.userName}

年龄:${userObject.userAge}

所属组:${userObject.group.groupName}

  这样就可以用“.”(存取器)导航把相应的信息显示出来了。内部实现的机制依旧是利用反射机制,所以“.”后面的名字要和getter方法上的名字一致。

  再举一个例子用于显示Map和数组:

  在服务器端,有如下代码

  Map map = new HashMap() ;

  map.put("key1", "value1") ;

  map.put("key2", "value2") ;

  String[] strArry = new String[]{"abc", "def", "ghi"}

  request.setAttribute("mapvalues", map) ;

  request.setAttribute("strarry", strArry) ;

  在jsp中显示:

  mapvalue.key1: ${ mapvalues.key1 }    -->value1

  mapvalue.key2: ${ mapvalues.key2 }    -->value2

  strArry的第二个元素:${ strarry[1]}    --> def 

  对于对象数组,以及List的显示,也是类似的,如下语法:

  ${ userArray[1].userName }、 ${ userList[2].userName }

  对于运算符的支持,如:${ 1+ 2 } --> 打印3 

  对函数的支持,如:${ empty value1} -->用于判断value1的值是否为空,为空这打印true , 不存在value1 也为true 

  2、JSTL(只总结核心标签C:)

  *<c:out >:  用于输出,本身EL表达式就可以完成输出,为什么还要用这个呢,这里面有一个default参数,就是当为空时,可以默认输出default里面的内容,这个EL表达式是不能做到的。 例如:<c:out value="${ abc }" default="不存在abc变量" /> -->如果在服务器端没有setAttribute abc 的值,那么此时就会输出:不存在abc变量 这样的结果。 另外一种写法:<c:out value="${abc}" >不存在abc变量

  如果value中的值不是EL表达式,则直接打印出其中的字符串。

    还可以设置out的escapeXml属性:分为true和false,true是默认属性,即把内容原样输出;false是转意输出,比如输出的如果是html代码,则可以按html效果输出。

  *<c:if>: 用于条件判断,例如 :<c:if test="${ empty value1 }" var="v">value1为空  此句代码的含义是:如果value1为空的话,则打印出 -->value1为空 并把判断结果放在v变量中。 

  *<c:choose>,<c:when>,<c:otherwise>: 用于条件分支选择,例如:

    <c:choose>

        <c:when test="${ empty value1 }">

          value1为空!

        

        <c:otherwise>

          value1不为空!

        

        

  可以有多个<c:when>,<c:when>必须在<c:otherwise>的前面

  *<c:forEach>: 用于循环打印输出,例如:

    

      

        

        

        

      

      <c:choose>

        <c:when test="${ empty userlist}">

          

            

          

        

        <c:otherwise>

          <c:forEach items="userlist" var="user">

            

              

              

              

            

          

        

      

    

姓名 年龄 所属组
没有符合条件的数据!
${ user.userName} ${ user.userAge} ${ user.group.groupName}

  现在有另外一个需求,要求偶数行的背景设置为红色,则可以这样写代码:

    

      

        

        

        

      

      <c:choose>

        <c:when test="${ empty userlist}">

          

            

          

        

        <c:otherwise>

          <c:forEach items="userlist" var="user" varStatus="vs">

            <c:choose>

              <c:when test="${ vs %2 == 0 }">

                

              

              <c:otherwise>

                

              

            

              

              

              

            

          

        

      

    

姓名 年龄 所属组
没有符合条件的数据!
${ user.userName} ${ user.userAge} ${ user.group.groupName}

    也可以在标签中加入begin, end, step 参数,代表从第几个开始输出,每次输出的步长为多少,如<c:forEach items="userlist" var="user" begin="2" end="8" step="2">。

    还可以用forEach:标签循环取得Map中的值。例如:

    <c:forEach items="mapvalue" var="v">

      ${ v.key } = ${ v.value }

    

    这样就循环输出Map的内容了。

  *<c:forTokens>: 用于按特定的字符分隔的输出。例如:

    假设在服务器端有这样的代码:request.setAttribute("strTokens", "1, 2, 3, 4, 5") ;

    <c:forTokens items="strTokens" delims="," var="v" >

      ${ v }

    

  *<c:url>: 用于生成一个url 地址。例如:

    <c:url value="http://localhost/sysmgr/add_user.jsp" var="v">

      <c:param name="userName" value="Jack" />

      <c:param name=“userAge" value=30 />

    

     增加用户

*<c:set>:用于设置一个变量的值,或者变量属性。

补充:<c:forEach>标签用法

<c:foreach>的varStatus属性暂存项的相关状态属性,可由EL表达式引用。继续上例所述。

${vs.index} 此项的索引,从0开始
${ vs .count} 此项的计数序号,从1开始
${ vs .first} 此项是否是第一项,布尔值
${ vs .last} 此项是否是最后一项,布尔值
${ vs .begin} 此次迭代的起始索引,对应<c:foreach>中begin属性值
${ vs .end} 此次迭代的终止索引,对应<c:foreach>中end属性值
${ vs .step} 此次迭代的跳跃步伐,对应<c:foreach>中step属性值

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
JSP页面用EL表达式 输出date格式
JSP页面用EL表达式输出date格式 1、头上引入标签<%@tagliburi"http://java.sun.com/jsp/jstl/core"prefix"c"%<%@taglibprefix"fmt"uri"http://java.sun.com/jsp/jstl/fmt"%2、使用:
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
2年前
JSP页面、EL表达式
JSP页面:jsp是一种动态页面,html页面和jsp页面最大的区别是:html是一种静态页面,在html中只能定义css、js等,在jsp中除了可以定义css、js之外还可以定义java代码,还可以在jsp中使用el表达式和jstl标签,但是java代码必须使用<%java代码%第一
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
2年前
EL表达式和标准标签库
EL表达式(expressionlanguage):!!!!自定义标签!!!!语法${expression}jsp中page指令有一个属性叫isELIgnored<%@pageisELIgnored"true"%表示是否禁用EL语言,TRUE表示禁止.FALSE表示不禁止.JSP2.0中默认的启用EL语言.2)\
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
2个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这