EL和JSTL表达式

  1. EL表达式的概述:

        在JSP开发中,为了获取Servlet域对象中存储的数据,经常需要书写很多Java代码,这样的做法 会使JSP页面混乱,难以维护,为此,在JSP2.0规范中提供了EL表达式。EL是Expression Language
    

    的缩写,它是一种简单的数据访问语言。本节将针对EL表达式进行详细的讲解。

        EL(Expression Language) 目的: 为了使JSP写起来更加简单。表达式语言的灵感来自于ECMAScript
                 由于EL可以简化JSP页面的书写,因此,在JSP的学习中,掌握EL是相当重要的。要使用EL表达式,
            首先要学习它的语法。EL表达式的语法非常简单,都是以"${" 符号开始, 以"}" 符号结束的,具体格        式如下:
    
        ${表达式}
    

EL的使用:内置对象
分类 内置对象 描述

    作用域           pageScope         page作用域
                     requestScope      request作用域
                     sessionScope      session作用域
                     applicationScope  application作用域

    请求参数         param             获得一个参数
                     paramValues       获得一组参数

    请求头           header            获得一个请求头
                     headerValues      获得一组请求头

    JSP上下文对象    pageContext

    全局初始化参数   initParam

    cookie           cookie
<%@page import="com.ElDemo.User"%>
<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>

<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
        <%
        //获得字符串
        String str="华信智原" ;
            pageContext.setAttribute("str", str);//将str存入到作用域中  下面就可以取到

        %>
        ${str }<br><%--不在域中  无法获得指定对象 --%>
        ${pageScope.str }<br><%--page的作用域 --%>
        <hr>
        <%
        //获得数组
            String[] arr={"A","B","C"};
            pageContext.setAttribute("arr", arr);//没有指定Scope的值  则默认作用域是在page范围
        %>
        ${arr }<br>
        ${arr[0] }<br>

        <hr>

        <%
        //获得集合(list)中的数据
        //创建模拟数据
        List<String> list=new ArrayList<String>();
        list.add("A");
        list.add("B");
        list.add("C");
        pageContext.setAttribute("list", list);
        %>

        ${list }<br>
        ${list[2] }<br>

        <hr>
        <%
        //获得Map<String,JavaBean>的数据
        Map<String, User> map2=new HashMap<String,User>();
         map2.put("u1",new User("u001","jack",18));
         map2.put("u2",new User("u002","rose",21));
         map2.put("3",new User("u003","tom",25));
         pageContext.setAttribute("map2",map2);
        %>
        map2:${map2 }<br>
        map2.u2:${map2.u2 }<br>
        u2.username:${map2.u2.username }<br>
        map2[3].username:${map2['3'].username }<br>//通过字符串'3'获得数据


</body>
</html>

实现结果:
华信智原
华信智原

[Ljava.lang.String;@137d2b6
A

[A, B, C]
C

map2:{3=com.ElDemo.User@bcbc15, u2=com.ElDemo.User@e027e7, u1=com.ElDemo.User@5bc2a1}
map2.u2:com.ElDemo.User@e027e7

u2.username:u002
map2[3].username:u003
//通过字符串’3’获得数据

——————————————————————————

JSTL表达式:
什么是JSTL

    JSTL(JavaServer Pages Standard Tag Library,JSP标准标签库)是一个不断完善的开放源代码的JSP标签库,

是由apache的jakarta小组来维护的。JSTL只能运行在支持JSP1.2和Servlet2.3规范的容器上,如tomcat 4.x。在

JSP 2.0中也是作为标准支持的。

    JSTL 1.0 发布于 2002 年 6 月,由四个定制标记库(core、format、xml 和 sql)和一对通用标记库验证器

(ScriptFreeTLV 和 PermittedTaglibsTLV)组成。core 标记库提供了定制操作,通过限制了作用域的变量管理

 数据,以及执行页面内容的迭代和条件操作。它还提供了用来生成和操作 URL 的标记。顾名思义,format 标记库

 定义了用来格式化数据(尤其是数字和日期)的操作。它还支持使用本地化资源束进行 JSP 页面的国际化。xml 库

 包含一些标记,这些标记用来操作通过 XML 表示的数据,而 sql 库定义了用来查询关系数据库的操作。

    如果要使用JSTL,则必须将jstl.jar和 standard.jar文件放到classpath中,如果你还需要使用XML processing

及Database access (SQL)标签,还要将相关JAR文件放到classpath中,这些JAR文件全部存在于下载回来的zip文件中。


     从JSP1.1 规范开始,JSP就支持使用自定义标签,使用自定义标签大大降低了JSP页面的复杂度,同时增强了代码的

重用性。为此,许多Web应用厂商都定制了自身应用的标签库,然而同一功能的标签由不同的Web应用厂商指定可能是不同的,

这就导致市面上出现了很多功能相同的标签,令网页制作者无从选择,为了解决这个问题,Sun公司制定了一套标准标签库

(JavaServer Pages Standard Tag Library),简称JSTL。

     JSTL 虽然被称为标准标签库,而实际上这个标签库是由5个不同功能的标签共同组成的。在JSTL1.1规范中,为这5个

标签库分别指定了不同的URL以及建议使用的前缀,如表1-7所示。

               表1-1   JSTL 包含的标签库

    标签库                 标签库的URL                 前缀

    Core        http://java.sun.com/jsp/jstl/core       c

    I18N        http://java.sun.com/jsp/jstl/fmt        fmt 

    SQL         http://java.sun.com/jsp/jstl/sql        sql

    XML         http://java.sun.com/jsp/jstl/xml         x

    Functions   http://java.sun.com/jsp/jstl/functions   fn

Core标签库: if标签

    在程序开发中,经常需要使用if语句进行条件判断,如果要在JSP页面中进行条件判断,就需要使用Core标签库提供的

<c:if> 标签,该标签专门用于完成JSP页面中的条件判断,它有两种语法格式 具体如下:

    语法1: 没有标签体的情况,将结果存放到指定的作用域(不常用)

    <c:if test="testCondition" var="result" [scope="{page|request|session|application}"]>

    语法2: 有标签体的情况,在标签体中指定要输出的内容

    <c:if test="textCondition">
          body content
    </c:if>     

    在上述语法格式中,可以看到<c:if> 标签有三个属性,接下来将针对这三个属性进行讲解,具体如下:

    ● test 属性用于设置逻辑表达式;

    ● var 属性用于指定逻辑表达式中变量的名字;

    ● scope 属性用于指定var变量的作用范围,默认值为page。如果属性test的计算结果为true,

      那么标签体将被执行,否则标签体不会执行。

    通过前面的讲解,我们对<c:if> 标签有了一个简单的认识,接下来通过一个具体的案例来演示如何在JSP页面中使用

<c:if>标签。

    在WebContent 目录下创建一个名为c_if.jsp的文件, 代码如文件1-15所示。

             文件1-2   c_if.jsp

    <%@ page language="java" contentType="text/html;charset=utf-8" pageEncoding="utf-8" 
        import="java.util.*"%>
    <%@ taglib uri="http://java.sum.com/jsp/jstl/core" prefix="c"%>
    <html>
    <head>
    </head>
    <body>
        <c:set value="1" var="visitCount" property="visitCount" />
        <c:if test="${visitCount==1}">
           This is you first visit. Welcome to the site!
        </c:if>
    </body>
    </html>     

     启动Tomcat服务器,在浏览器地址栏中输入地址"http://localhost:8080/chapter07/c_if.jsp"访问c_if.jsp页面,

此时,浏览器窗口中显示的结果 如下所示。

    This is you first visit. Welcome to the site!

Core标签库:forEach标签

   在JSP页面中,经常需要对集合对象进行循环迭代操作,为此,Core标签库提供了一个<c:forEach>标签,该标签专

门用于迭代集合对象中的元素,如Set、List、Map、数组等,并且能重复执行标签体中的内容,它有两种语法格式,具

体格式如下:

   语法1: 迭代包含多个对象的集合

   <c:forEach [var="varName"] items="collection" [varStatus="varStatusName"]
     [begin="begin"] [end="end"] [step="step"]>
      body content
   </c:forEach>      

    语法2: 迭代指定范围内的集合

    <c:forEach [var="varName"] [varStatus="varStatusName"] [begin="begin"] 
    [end="end"] [step="step"]>
        body content
   </c:forEach> 

    在上述语法格式中,可以看到<c:forEach> 标签有多个属性。接下来针对这些属性进行讲解,具体如下:

    ● var属性 用于指将当前迭代到的元素保存到page域中的名称;
    ● items 属性用于指定将要迭代的集合对象;
    ● varStatus用于指定当前迭代状态信息的对象保存到page域中的名称;
    ● begin 属性用于指定从集合中第几个元素开始 进行迭代,begin的索引值从0开始,如果没有指定items属性,
      就从begin指定的值开始迭代,直到迭代结束为止;
    ● step 属性用于指定迭代的步长,即迭代因子的增量。

    <c:forEach> 标签在程序开发中经常会被用到,因此熟练掌握<c:forEach> 标签是很有必要的,接下来,通过

几个具体的案例来学习<c:forEach>标签的使用。

    分别使用<c:forEach>标签迭代数组和Map集合,首先需要在数组和Map集合中添加几个元素,然后将数组赋值给

<c:forEach>标签的items属性,而Map集合对象同样赋值给<c:forEach>标签的items属性,之后使用getKey()和getValue()

方法就可以获取到Map集合中的键和值,如文件1-3 所示

         文件 1-3 c_foreach1.jsp

    <%@ page language="java" contentType="text/html;charset=utf-8" pageEncoding="utf-8" 
        import="java.util.*"%>
    <%@ taglib uri="http://java.sum.com/jsp/jstl/core" prefix="c"%>
    <html>
    <head>
    </head>
    <body>
        <%
           String[] fruits={"apple","orange","grape","banana"};
        %>
        String 数组中的元素:
        <br/>
        <c:forEach var="name" items="<%=fruits%>">
            ${name} <br/>
        </c:forEach>

        <%
           Map userMap=new HashMap();
           userMap.put("Tom","123");
           userMap.put("Make","123");
           userMap.put("Lina","123");
        %>
        <hr />
        HashMap集合中的元素:
        <br/>
        <c:forEach var="entry" items="<%=userMap%>">
             ${entry.key}&nbsp;${entry.value}<br/>
        </c:forEach>
    </body>
    </html>         

    启动Tomcat服务器,在浏览器在地址栏中输入地址"http://localhost:8080/chapter07/c_foreach1.jsp"

访问c_foreach1.jsp页面,此时, 浏览器窗口中的显示结果如下所示

    String 数组中的元素:
    apple   
    orangle
    grape
    banana      
    ____________________________________
    HashMap集合中的元素:
    Tom 123
    Lina 123
    Make 123

如上可以看出,在String数组中存入的元素apple、orange、grape和 banana全部被打印出来了,因此可以说明使用

<c:forEach>标签可以迭代数组中的元素。Map集合中存入的用户名和密码全部被打印出来了。*在使用<c:forEach>标签时,
只需要将userMap集合对象复制给items属性,之后通过entry变量就可以获取到集合中的键和值。*

    <c:forEach> 标签的begin、end和 step属性分别用于指定循环的起始索引、结束索引和步长。使用这些属性可以

迭代集合对象中某一范围内的元素。
<%@page import="java.util.*"%>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

     <%
            List list=new ArrayList();
            list.add("tom");
            list.add("make");
            list.add("Lina");
     %>

     <table border="1">
        <tr>
            <td>序号</td>
            <td>索引</td>
            <td>是否是第一个元素</td>
            <td>是否是最后一个元素</td>
            <td>元素的值</td>
        </tr>
        <%--varStatus用于指定当前迭代状态信息的对象保存到page域中的名称; --%>
        <c:forEach var="name" items="<%=list %>" varStatus="status">
        <tr>
            <td>${status.count }</td>
            <td>${status.index }</td>
            <td>${status.first }</td>
            <td>${status.last }</td>
            <td>${name }</td>
        </tr>

     </c:forEach>

     </table>   
</body>
</html>

代码实现
这里写图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值