zoukankan      html  css  js  c++  java
  • 浅谈EL与JSTL

      讲道理,自己在博大精深的Java世界里还只是一个很小很小的菜鸟。处于成长与学习之中,但学习一个漫长的过程。尤其对于那些知识点我觉得总结是尤为重要的。反正在我看来这段时间里虽然过了很多知识但却是一脸懵逼,心中 很少有那种系统的知识体系架构。归咎于还是因为自己的对知识的理解领悟总结少了。因此今天开始我希望自己能养成一个时刻总结的好习惯。无论是站在前辈们的总结的基础上还是有自己的新的领悟,我都想写下来。望能勉励自己继续前进。

      关于EL与JSTL有过了解,但没认真去想过,也没怎么用过,今天又算是过了一遍,重新认识一下。首先先来谈一下概念吧,EL(Expression Language)是一种表达式语言,主要用于查找作用域中的数据,然后对它们执行一些简单的操作,用于对jsp标签的属性赋值。它不是编程语言。JSTL( JSP Standard Tag Library)是JSP标准 标签库,由apache实现,因为在jsp中出现大量Java代码不利于维护,sun公司就制定了一个类似于html标签一下的jsp标签技术,也有开始于结束标记。我们可以引用标签来调用标签库中的Java代码片段来实现一下操作。使用jsp标准标签库有利于程序的可读性,提高了代码的复用性与编程效率。其目的就是为了jsp中不出现Java代码片段。这两者关系,JSTL通常会结合EL一起使用。也有理解为EL是JSTL的一部分。EL也可以单独使用。

      EL表达式的基本格式由$与{}组成,例如:${user.name}  即其意思就是查询得到user对象中的name属性的值。

    如果仅使用EL表达式的话则不需要导包,但需要在作用域中去取值。该作用域可以是 其范围由小到大依次是 page(页面上下文对象) request(一次请求对象) session(会话期间对象) application(程序应用对象) 。访问规则: 当容器解析到当前EL表达式时,会依次从pageScope,requestScope,sessionScope以及applicationScope当中取值,查找绑定名为user的对象,调用其getName方法。el表达式如果获取到null值,会 自动把null值转换为空字符串输出。

    当没有指定作用域,则默认取值依次从小到大来取

    例1:User user=new User();  user.setName("zs"); request.setAttribute("user",user)   - -->获取request绑定的name值 ${user.name}等价于User u=(User)request.getAttribute("user");String name=u.name;  例2:还可以以${user["name"]}来表达;

    可以进行一些简单的运算

    1 算数运行 + - * / % 注:+只能做算数运算,不能做求和运算
    算术运算:${1+"1" } 其结果为2  它会自动将“1”转化为数字进行运算
    2 关系运算 == >= <= !=
    关系运算:${5=="5"}其结果为true
    3 逻辑运算 & | ! && ||

    逻辑运算:${a>b&&4<5}其结果为false
    4 (empty)空运算:判断某个集合、字符串、对象是否为空。
    以下四种情况结果为true:空字符串,空的集合,值为null,找不到对应的值

    <%
    List list=new ArrayList();
    list.add(1);
    request.setAttribute("list", list);
    request.setAttribute("a", "");
    request.setAttribute("b", null);
    %>
    ${empty list }  其结果为false
    ${empty a } 其结果为 true
    ${empty b } 其结果为 true
    ${empty user}其结果为false

    JSTL:(JSP Standard Tag Library) JSP标准标签库
    JSTL的由来:
    JSP标签是Sun公司定义的一套标准,由Apache组织基于这套标准开发的一套标签
    库后又转给Sun公司,被称为JSTL,成为了JavaEE5.0的核心

    如何使用jstl ?

    第一步:引入jstl.jar以及 standard.jar两个架包注:在javaEE5.0以上的版本不需要引入这两个架包,因为在javaEE5.0以上的版本已经包含了这两个架包。
    将jstl.jar和standard.jar两个包考到现有工程  WebRoot / WEB-INF / lib 目录下
      
    第二步: 使用taglib指令导入要使用的JSP标签 <%@taglib uri="" prefix="" %>

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

    uri:JSP标签的命名空间
    prefix:命名空间的前缀(简称)

    第三步: 使用常见的标签

    1 if标签
    < c:if test= "" var = "" scope= "" >
    标签体的内容
    </c:if >

    注: test中传入的只能是boolean值,如果值为false则不执行标签体,为true
    则执行标签体。
    var :代表当前test表达式的结果。
    scope:指test表达式执行的结果绑定范围

    2 choose标签

    <c : choose >
    <c:when test =""></c : when>
    ...
    <c : otherwise></c : otherwise>
    </c : choose >

    注:when可以出现一次以上,当test属性为true时,会执行标签体的内容
    otherwise只能出现0或1次。


    3 foreach标签
    <c:foreach items="" var="" varStatus="s">

    </c:foreach>

    items属性:指定要遍历的集合,—般使用EL表达式来赋值

    var属性:指定一个绑定名称,容器每次从集合中取一个对象,
    然后绑定到pageContext对象上,作用域只能是在当前页面。

    varStatus :指定一个绑定名称。绑定值是一个由容器创建的对象
    ,该对象封装了当前迭代的状态 。对于迭代状态 有默认的两个方法:
    getIndex: 下标从0开始 ,返回当前正则被迭代对象的下标值
    getCount: 下标从1开始,统计个数。


    如何定义自定义标签?

    1 新建一个java类,把需要引入的java代码搬家 ,同时该类需要继承
    SimpleTagSupport(简单标签技术支持类)

    2 重写doTag方法。

    3 新建一个XX.tld的文件,注意该文件需要放置在web-inf文件夹下。

    文件里面的结构可以参照 standard.jar包中的c.tld文件格式。

    <body-content>JSP</body-content>
    只有复杂标签技术才有,支持在标签体中可以出现java代码片段。

    <body-content>empty</body-content>
    简单标签技术,不支持标签体出现任何内容。

    <body-content>scriptless</body-content>
    标签中可以出现内容,但是内容不允许是java代码。
    <say:print><% %></say:print>错误

  • 相关阅读:
    cloudemanager安装时出现8475 MainThread agent ERROR Heartbeating to 192.168.30.1:7182 failed问题解决方法(图文详解)
    cloudemanager安装时出现ProtocolError: <ProtocolError for 127.0.0.1/RPC2: 401 Unauthorized>问题解决方法(图文详解)
    青年的第一要务是自立
    [转]Sql Server 主从数据库配置
    [转]SQL Server表分区
    [转]WCF体系结构-一张图就是好
    Bootstrap
    [转]在WIN7下安装运行mongodb
    [转]使用Node.js完成的第一个项目的实践总结
    [转]win系统下nodejs安装及环境配置
  • 原文地址:https://www.cnblogs.com/bad-guy/p/6551471.html
Copyright © 2011-2022 走看看