zoukankan      html  css  js  c++  java
  • JSP/Servlet开发——第八章 JSTL和EL

    1、 EL表达式:

    ●需要EL表达式的原因:

      ◆在JSP中使用Java脚本的局限:

        1)、在JSP页面中嵌入大量的Java代码;

        2)、访问结构比较复杂的数据时代码烦琐,且经常需要强制类型转换;

          eg:<%

                   Employee employee = (Employee) request.getAttribute("employee");

                   Computer comp = employee.getComputer();

                   String manufacturer = comp.getManufacturer();

            %>

           3)、EL表达式使JSP的开发变得更加简单;

                eg:${requestScope.employee.computer.manufacturer}

    EL表达式:EL表达式的全称是 Expression Language , 它是一种借鉴了 JavaScript 和 XPath 的表达式语言,EL表达式定义了一系列的隐含对象和操作符,使开发人员能够很方便地访问页面的上下文,以及不用域内的对象,而无须在 JSP 页面嵌入Java 代码,从而使开发人员即使不熟悉 Java 也能轻松地编写JSP程序;

    EL表达式的功能:替代JSP页面中数据访问时的复杂编码;

    EL表达式的特点和使用范围:

      ◆EL表达式提供了在 Java 代码之外, 访问和处理应用程序数据的功能, 通常用于在某个作用域(page、request、session、application 等) 内取得属性值,或者做简单的运算和判断。

      ◆EL 表达式有以下特点:

            自动转换类型转换,在使用 EL 得到某个数据时可以自动转换类型,对于类型的限制比较宽松;

        ★使用筒单,与 JSP 页面中嵌入的 Java 代码相比,EL表达式使用起来非常简单;

          eg:每个雇员都拥有一台计算机,如果想得到计算机的生产厂商信息,只需要把该雇员对象放在某个作用域(此处以 request 为例 ) 中,然后在 JSP 页面中调用 ${requestScope.employee.computer.manufacturer}即可;

    EL 表达式的语法:

      ${ EL expression }

         ◆EL表达式的两个要素:$和{ },两者缺一不可;

        ▲通过变量名取值

        ▲获取对象的属性值

        ▲获取集合元素

        ▲执行表达式

        ★1)、点操作符:EL 表达式通常由两部分组成:对象和属性。就像在Java代码中一样,在 EL 表达式中也可以点操作符“.” 来访问对象的某个属性。

            eg:通过${ employee.computer }可以访问 employee 对象computer属性,而通过引${ employee.computer.manufacturer}则可以访问某个雇员所使用的计算机的产厂商;

             2)、[ ]操作符:与点操作符类似,“[ ]”操作符也可以访问对象的某个属性,${ employee[“computer”] }可以访问雇员的计算机属性。但是,除此之外,“[ ]”操作符还提供了更加强大的功能:

            ▲当属性名中包含了特殊字符如 “.”或 '一’ 等的情况下,就不能使用点操作符来访问,这时只能使用 ”[ ]" 操作符;

            ▲访问数组,如果有一个对象名为 array 的数组,那么可以根据索引值来访问其中的元素,如:${array[0]}、${array[1]}等;

            ▲“[ ]”操作符中可以使用变量实现动态访问,如 ${employee[propertyNamel],propertyName是另一个变量,改变其值可以动态访问employee的不同属性;

                  eg1:<body>

                    <%

                              // 在Servlet或JSP中保存数据

                      Map names = new HashMap();

                      names.put("one", "LiYang");

                      names.put("two", "WangHua");

                      request.setAttribute("names", names);

                    %>

                      // 在JSP中访问数据

                      姓名:${ names.one }<br/>

                      姓名:${ names["two"] }<br/>

                       </body>

                      分析:在eg1的代码中,使用了 Map 存储姓名的集合,在 JSP 页面中则分别调用了 EL 表达式的两运算符进行姓名的输出显示:

                       输出结果:

                              

                    eg2:<body>

                      <%

                        // 在Servlet或JSP中保存数据

                        List names = new ArrayList();

                        names.add(0, "LiYang");

                        names.add(1,"WangHua");

                        request.setAttribute("names",names);

                      %>

                        // 在JSP中访问数据

                        姓名:${ names[0] }<br/>

                        姓名:${ names[1] }<br/>

                          </body>

                          分析:在eg2的代码中,使用了List存储姓名的集合,在 JSP 页面中则使用[ ]指定元素下标:输出结果如下:

                                      

    ●${变量名}

      eg:   // 在Servlet或JSP中保存数据

          request.setAttribute("username", "LiYang");

          // 在JSP中访问数据

          姓名: ${username}         ${requestScope.username}

          分析:按照page → request → session → application的作用域顺序依次查找,找到即返回,最终找不到返回null;

             ▲指定作用域:

    属性范围

    EL中的名称

    page

    pageScope,例如${pageScope.username}表示在page作用域查找变量username,找不到返回null

    request

    requestScope

    session

    sessionScope

    application

    applicationScope

    ●关系操作符:

      关系操作符

    说明

    示例

    结果

    ==(或eq)

    等于

    ${23==5}${23 eq 5}

    ${"a" =="a"}${"a" eq "a"}

    false

    true

    !=(或ne)

    不等于

    ${23!=5}或${23 ne 5}  

    true

    <(或lt)

    小于

    ${23<5}或${23 lt 5}    

    false

    >(或gt)

    大于

    ${23>5}或${23 gt 5}  

    true

    <=(或le)

    小于等于

    ${23<=5}或${23 le 5}

    false

    >=(或ge)

    大于等于

    ${23>=5}或${23 ge 5}     

    ture

    ●逻辑操作符:

    逻辑操作符

    说明

    示例

    结果

    &&(或and)

    逻辑与 

    如果AtrueBfalse,则${ A && B } (或${ A and B } )

    false

    ||(或or)

    逻辑或

    如果A为true,B为false,则${ A || B} (或 ${ A or B } )

    true

    ! (或not)

    逻辑非

    如果A为true,则${ ! A } ( 或${ not A } )

    false

    Empty操作符:Empty操作符是一个前缀操作符,用于检测一个变量值是否为 null或者为empty ( 如长度为 0的字符串变量或集合变量)。例如,变量 a 不存在,则${ empty a }返回的结果为true,${ not empty a }或${ ! empty a }返回的结果为false;

    2、 EL表达式隐式对象:

    JSP提供了 page、request、session、application. pageContext 等若干隐式对象。这些隐式对象无需声明,就可以很方便地在 JSP 页面中使用。相应地,在 EL 表达式语言中也提供了一系列可以直接使用的隐式对象。EL 隐式对象按照使用途径的不同分为作用域访问对象、参数访问对象和JSP隐式对象;

    如下图:

         

    ●作用域访问对象:开发 Java Web 应用时,可以把变量存放在不同作用域中以满足不同范围的访问需求,作用域共有四个选项:page、request、session、application。在 EL 表达式中,为了访问这四个作用域内的变量和属性;

    对象名称

    说  明

    pageScope

    与page作用域相关联的Map对象

    requestScope

    与request作用域相关联的Map对象

    sessionScope

    与session作用域相关联的Map对象

    applicationScope

    与application作用域相关联的Map对象

      当使用 EL 表达式访问某个变量时,应该指定查找的范围,如 ${requestScope.employee}即在请求作用域范围内查找 employee 变量,如果不指定查找范围,即${ employee},则会按照 page - request- session - application 的顺序依次查找 employee 变量;

    ●参数访问对象:参数访问对象是与页面输入参数有关的隐式对象,通过它们可以得到用户的请求参数;

      对象名称

    说  明

    param

    按照请求参数名称返回单一值的Map对象

    paramValues

    按照请求参数名称返回String数组的Map对象

       两者之间的不同之处在于,param 对象用于得到请求中单一名称的参数,而paramValues对象用于得到请求中的多个值。

        例如:在用户注册时 通常只填写一个名为 userName 的参数,那么就可以用${param:username}来访问此参数,等同于调用 request.getParameter (“usernames”);而在用户注册时,也可以选择多个业余爱好 (habits) ,这样通过${paramValues:habits}可以得到用户所有选择的值等同于调用request.getParameterValues ( “habits”);

    JSP 隐式对象:为了能够方便地访问 JSP 隐式对象,EL表达式语言引入了pageContext;它是 JSP和EL的一个公共对象,通过 pageContext 可以访问其他八个 JSP 内置对象,这也是EL表达式语言把它作为内置对象的一个主要原因;

    对象名称

    说  明

    pageContext

    提供对页面信息和JSP内置对象的访问

    3、JSTL标签:

    ●EL表达式封装了数据访问的功能,而JSTL标签库则封装了逻辑控制、循环控制以及数据格式化等功能,二者结合使用才能完整实现动态页面的开发需求;

    JSTL 的全称是 Java Server Page Standard Tag Library , 即 JSP 标准标签库。它包含了在开发JSP页面时经常用到的一组标准标签,这些标签提供了一种不用嵌入Java 代码就可以开发复杂的JSP页面的途径。JSTL 标签库包含了多种标签,如通用标签、条件判断标签和迭代标签等。

    优点:提供一组标准标签、可用于编写各种动态功能;

     ●使用JSTL的步骤:

       1)在工程中引用 JSTL 的两个jar文件和标签库描述符文件 (扩展名为 .tld)。

          ◆正如使用JDBC连接数据库那样,使用 JSTL定义的标签库也必须在工程中导入两个jar文件,jstl.jar和standard.jar,除此以外,标签库描述符文件也是必需的,这些资源都能在网上下载得到。

          ◆在 MyEclipse 中已经集成了 JSTL,因此这一过程可以由工具代为实现,方法如下:首先执行 'File' — 'New' — 'Web Project' 命令, 弹出 'New Web Project'窗口,在该窗口中的’J2EE Specification Level' 选项组中选中 ’J8va EE 5.0" 或 “ Java EE 6.0' 单选按钮,MyEclipse会自动在项目中添加 JSTL 所需的jar文件和标签库描述符文件。而如果选择更低的版本,则需要勾选“Add JSTL Libraries to WEB-INF/lib folder?“复选框;如图所示,然后单击 ’Finish' 按钮;

                                  

         2)、在需要使用 JSTL 的 JSP 页面中使用 taglib 指令导入标签库描述符文件,例如,要使用JSTL核心标签库,需要在 JSP 页面的上方增加如下的 taglib 指令:

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

                 taglib 指令通过 uri 属性引用某个标签库的配置文件, JSP 页面中通过 prefix 属性指定的前缀即可访问该标签库中的某个标签功能,语法:<c:标签名>

         3)、使用JSTL标签;

    JSTL 核心标签库:顾名思义,核心标签库在 JSTL 中占有十分重要的地位。JSTL 核心标签库按照功能的不同又为通用标签库、条件标签库、迭代标签库等;

               

    通用标签库:通用标签库用于在 JSP 页面内设置、显示和删除变量,它包含三个标签:<c:set>、<c:out>、<c : remove>;

      ▲<c:set>标签:<c:set>标签用于设置作用域变量的值或者作用域变量的属性值,其语法格式分为如下两种

        (1) 将 value 值存储到范围为 scope 的变量 variable 中:

                 <c:set  var="variable"  value="value"  scope="scope" />

              ★var:属性的值是设置的变量名

              ★value:属性的值是赋予变量的值

              ★scope属性对应的是变量的作用域,可选值有 page、request、 session和application

            eg:在请求范围内将变量 currentlndex 的值设置为 8,用<c:set>标签可以写为:

              <c:set va=“currentlndex“value=”8“ scope="request">

          (2) 将value值设置到对象的属性中:

          <c:set  target="target"  property="property"  value="value" />
            
    target属性是操作的 JavaBean 对象 可以使用 EL 表达式来表示;

            ★property属性:对应 JavaBean 对象的属性名

            ★value 属性是赋予 Java8ean 对象属性的值;

          eg:  // 在Servlet或JSP中设置JavaBean

              User  user = new  User();

              request.setAttribute("user",  user);

              // 在JSP中修改JavaBean的属性值

              <c:set target="${user}" property="name" value="defaultName" />

       ▲<c:out>标签:<c:out>标签用于将计算的表达式结果输出显示,类似于 JSP 中的<%=%>,但是功能更加强大,代码也更加简洁,方便页面维护。

        ◆其语法格式分为指定默认值和不指定默认值两种形式:

          1)、不指定默认值:

              语法:<c:out  value="value" />

                 value 属性指需要输出的正则表达式的运算结果,可以通过EL表达式来获;

          2)、指定默认值:

              语法:<c:out  value="value"  default="default" />

                  ★default 属性是 value属性的值为空时输出的默认值。

                  ★<c:out>标签还有一个escapeXml属性:表示是否转换特殊字符,用于指定在使用<c:out>标签输出诸如<、>或 ` 或 “ 或 & 之类在HTML和XML文件中具有特殊意义的字符时是否应该进行转义escapeXml属性设置为 true , 则会自动进行转义处理,这也是默认值;    

                          eg:out:计算表达式并将结果输出显示,转义特殊字符

                                      <p>${ "<a href='http://www.baidu.com'>百度</a>" }</p>

                <p>

                <c:out  escapeXml="false" value="<a href='http://www.baidu.com'>百度</a>" />

                </p>

                <p><c:out  value="<a href='http://www.baidu.com'>百度</a>" /></p>

              运行结果:

                    

                分析:从运行效果可以看出,将<c:out>标签的 escapeXml 属性设置为 'false“ 与直接使用 EL 表达式效果相同;

        <c : remove>标签:<c : remove>分用于移除指定作用域内的指定变量;

                语法:<c:remove  var="variable"  scope="scope" />

                        var 属性是指待移除的变量的名称;

                ★scope属性是指移除的变量所在的范围,可选项有 page、request、session、application,如果没有指定,则默认为 page;

            eg:在下面示例中,首先使用<c:set>标签在 page 范围内设置一个变量的值,通过<c:out>标签把该量显示在页面上,然后用<c : remove>标签在page 范围内删除该变量,并使用<c:out>标签检查该量是否已经删除;

                 

                            运行结果:

                                     

            

    ◆条件标签库:JSTL 的条件标签包括<c : if> 、<c : choose>、<c:when>和<c : otherwise>标签;

        ▲<c : if>标签:用于实现 Java 语言中 if 语句的功能;

             语法:

                <c:if   test="codition"   var="variable"  scope="scope" >

                     主体内容

          </c:if>

          ★test 属性是判断条件, 当 condition (可以用EL表达式表示) 的结果为 true 时,会执行主内容,如果为 false 则不会执行;

          ★var 属性定义变最,该变量存放判断的结果,该属性可以省略

          ★scope 属性是指 var 定义变量的存储范围,可选值有 page、request、session 和application,该属性可以省略;

              eg:使用if标签判断是否登录:

                  

        ▲<c : choose>标签:<c : choose>、<c:when>和<c : otherwise>一起实现互斥条件的执行、类似于 Java 语言的if-else if-else语句。

             语法:<c:choose var=“vaeName” scope=“scope”>

                             <c:when test="condition1">

                                     内容1

                            </c:when>

                             <c:when test="condition2">

                                   内容2

                            </c:when>

                                  ……

                             <c:otherwise>

                                   内容n

                             </c:otherwise>

            </c:choose >

              ★<c : choose>是作为 <c:when>和<c : otherwise>的父标签使用的,除了空白字符外,<c : choose>的标签体只能包含这两个标签;

              ★<c:when>标签必须有一个直接的父标签<c : choose>而且必须在同一个父标签下<c : otherwise>标签之前出现,在同一个父标签<c : choose>中,可以有多个<c:when>标签;

              ★<c : otherwise>标签必须有一个直接的父标签<c : choose>, 而且必须是<c : choose>标签最后一个嵌套的标签;

              ★在运行时,判断<c:when>标签的测试条件是否为 true , 第一个测试条件为 true 的<c:when>标签体被 JSP 容器执行。如果没有满足条件的<c:when>标签 , 那么<c : otherwise>的标体将被执行;

     

    迭代标签库:<c:forEach>标签有两种语法格式:一种用于遍历集合对象的成员,另一种用于使语句循环执行指定的次数;

         遍历集合对象的成员:

          语法: <c:forEach   items="collection"   var="varName"   begin="start"  end="end"  step="stepSize"  varStatus="status"  >

                           …循环体代码…

              </c:forEach>

                  ★var属性是对当前成员的引用, 即如果当前循环到第一个成员,var 就引用第一个成员,如果当前循环到第二个成员,它就引用第二个成员. 以此类推;

                  ★ items:指被迭代的集合对象;

                  ★varStatus 属性用于存放 var 引用的成员的相关信息,如索引等;

                  ★begin 属性示开始位置, 默认为 0, 该属性可以省略;

                  ★end 属性表示结束位置,该属性可以省略;

                  ★step 表示循环的步长,默认为 1,该属性可以省略;

      ▲指定语句执行次数:

          语法:<c:forEach var="varName"  varStatus=" varStatusName" begin=" beginIndex"  end="endIndex"  step="step" >

                         …循环体代码…

            </c:forEach>

                            var 属性是对当前成员的引用;

                ★varStatus 属性用于存放 var 引用的成员的相关信息,如索引等;

                ★begin属性表示开始位置, 默认为 0, 该属性可以省略;

                ★end 属性表示结束位置,该属性可以省略;

                ★step属性表示循环的步长, 默认为 1, 该属性可以省略格式;

      ■格式2 与格式 1 的区别是:格式 2 不是对一个集合对象遍历, 而是根据指定的 begin 属性、 end属性以及 step 属性执行主体内容固定的次数;

    4、JSTL遍历集合:

    数组或集合

    访问方式

     int[] ages = { 1, 2, 3, 4, 5 }; 

    // 普通数组,JSTL直接使用JSP赋值表达式来取

    遍历数组

    <c:forEach var="age" items="<%= ages %>">

      <c:out value="${age}" />

    </c:forEach>

    List<String> names = new LinkedList<String>(); // List

        names.add("Biao");

        names.add("");

        names.add("");

        request.setAttribute("names", names); // 添加到request

    遍历List:

    <c:forEach var="name" items="<%= names %>">

        <c:out value="${name}" />

    </c:forEach>

     

    遍历List:

    <c:forEach var="name" items="${names}">

        <c:out value="${name}" />

    </c:forEach>

    List<User> users = new ArrayList<User>(); // JavaBeanList

        users.add(new User("黄彪""xxxxxx"));

        users.add(new User("昊天""xxxxxx"));

        users.add(new User("姐姐""yyyyyy"));

        users.add(new User("丫头""zzzzzz"));

        session.setAttribute("users", users); // 添加到session

    遍历UserBeanList:

    <c:forEach var="user" items="${users}">

      <c:out value="${user.username}"/>

      <c:out value="${user.password}"/>

    </c:forEach>

    Set<String> set = new TreeSet<String>(); // Set

        set.add("One");

        set.add("One");

        set.add("Two");

        set.add("Three");

        set.add("Set");

    遍历Set:

    <c:forEach var="entry" items="<%= set %>">

        <c:out value="${entry}" />

    </c:forEach>

     

    Map<String, String> map = new HashMap<String, String>(); // Map

        map.put("1""黄彪");

        map.put("2""丫头");

        map.put("3""哥哥");

        map.put("4""笨蛋");

    遍历Map:

    //注意:遍历map时候var="entry"只能这么写

    <c:forEach var="entry" items="<%= map %>">

      key<c:out value="${entry.key}"/>

      value<c:out value="${entry.value}"/>

    </c:forEach>

    5、总结:

          

     

     

  • 相关阅读:
    Windows向虚拟机Linux传输文件方法
    Postgresql ERROR: permission denied for relation app_info
    Spring Boot: Cannot determine embedded database driver class for database type NONE
    零宽度正预测先行断言是什么呢,看msdn上的官方解释定义
    php 的curl 模拟登陆
    使用ProxychainsMac下安装及配置
    利用onekeyup即可实现验证码的点击刷新功能
    程序中使用gc_enable() 和 gc_disable()开启和关闭
    通过ReflectionMethod,我们可以得到Person类的某个方法的信息
    order by id asc得出的排序是什么原理
  • 原文地址:https://www.cnblogs.com/HQING/p/9617840.html
Copyright © 2011-2022 走看看