• EL表达式和JSTL标签库


    2023.10.25

    EL表达式是什么?

            EL表达式,Expression Language(表达式语言),可以代替JSP中的java代码,让JSP文件中的程序看起来更加整洁,美观。 由于JSP中夹杂着各种java代码,例如<% java代码 %>、<%=%>等,导致JSP文件很混乱,不好维护,所以才有了EL表达式。EL表达式可以算是JSP语法的一部分,EL表达式归属于JSP。

            ps:EL表达式一般操作的都是域对象中的数据,操作不了局部变量。

            EL表达式优先从小范围中读取数据:pageContext < request < session < application

    EL表达式的使用

    EL表达式的作用:

            从某个作用域中取数据,然后将其转换成字符串,然后将其输出到浏览器。

    1、从某个域中取数据。

    • pageContext

    • request

    • session

    • application

    2、将取出的数据转成字符串。

    • 如果是一个java对象,也会自动调用java对象的toString方法将其转换成字符串。

    3、将字符串输出到浏览器。

    • 和这个一样:<%= %>,将其输出到浏览器。

    EL表达式的基本语法格式:

    ${表达式}

     EL表达式的使用案例:

    1. <%
    2. // 创建User对象
    3. User user = new User();
    4. user.setUsername("jackson");
    5. user.setPassword("1234");
    6. user.setAge(50);
    7. // 将User对象存储到某个域当中。一定要存,因为EL表达式只能从某个范围中取数据。
    8. // 数据是必须存储到四大范围之一的。
    9. request.setAttribute("userObj", user);
    10. %>

    使用EL表达式取出User对象:

    1. ${userObj}
    2. //等同于java代码:<%=request.getAttribute("userObj")%>

     ps:面试题: ${userObj} 和 ${"userObj"}的区别是什么?

            ${userObj}表示从某个域中取出数据,并且被取的这个数据的name是"userObj",之前一定有这样的代码: 域.setAttribute("userObj", 对象);
            ${"userObj"} 表示直接将"userObj"当做普通字符串输出到浏览器。不会从某个域中取数据了。

    如何输出对象的属性值?

    ${userObj.username} 使用这个语法的前提是:User对象有getUsername()方法。
    ${userObj.password} 使用这个语法的前提是:User对象有getPassword()方法。
    ${userObj.age} 使用这个语法的前提是:User对象有getAge()方法。
    ${userObj.email} 使用这个语法的前提是:User对象有getEmail()方法。
    EL表达式中的 . 这个语法,实际上调用了底层的getXxx()方法。
    注意:如果没有对应的get方法,则出现异常。报500错误。

    EL表达式对null进行了预处理。如果是null,则向浏览器输出一个空字符串。

    EL表达式中有四个隐含的隐式的范围:

    • pageScope 对应的是 pageContext范围。

    • requestScope 对应的是 request范围。

    • sessionScope 对应的是 session范围。

    • applicationScope 对应的是 application范围。

    怎么从Map集合中取数据:

            ${map.key}

    怎么从数组和List集合中取数据:

    • ${数组[0]}

    • ${数组[1]}

    • ${list[0]}

    忽略EL表达式的指令:

    1. <%@page contentType="text/html;charset=UTF-8" isELIgnored="true" %>
    2. isELIgnored="true" 表示忽略EL表达式
    3. isELIgnored="false" 表示不忽略EL表达式。(这是默认值)
    4. isELIgnored="true" 这个是全局的控制。
    5. 可以使用反斜杠进行局部控制:\${username} 这样也可以忽略EL表达式。

    通过EL表达式获取应用的根:

    • ${pageContext.request.contextPath}

    ps:EL表达式没有内置request对象,所以不能直接用request获取应用的根,需要先用内置对象pageContext先获取request。

    JSTL标签库

    什么是JSTL标签库?

            Java Standard Tag Lib(Java标准的标签库)。通常结合EL表达式一起使用。目的是让JSP中的java代码消失。

    使用JSTL标签库的步骤:

    1. 引入JSTL标签库对应的jar包。  在WEB-INF下新建lib目录,然后将jar包拷贝到lib当中。ps:这里解释一下为什么有的jar包放在lib下(如mysql的驱动jar包和JSTL标签库jar包),有的jar包是在idea的设置中部署(如servlet-api.jar、jsp-api.jar):直接在idea中部署的jar包,是Tomcat服务器本身就有的jar包,这里部署只是为了和idea关联起来。 而放在lib下的jar包,是第三方的jar包,Tomcat服务器没有自带的。 
    2. 在JSP中引入要使用标签库。(使用taglib指令引入标签库。)
    3. 在需要使用标签的位置使用即可。表面使用的是标签,底层实际上还是java程序。

    JSTL标签的原理:

    1. <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    2. 以上uri后面的路径实际上指向了一个xxx.tld文件。
    3. tld文件实际上是一个xml配置文件。
    4. 在tld文件中描述了“标签”和“java类”之间的关系。
    5. 以上核心标签库对应的tld文件是:c.tld文件。它在哪里。
    6. 在jakarta.servlet.jsp.jstl-2.0.0.jar里面META-INF目录下,有一个c.tld文件。

    使用JSTL标签库的案例 :

    1. <%@ page import="jsp.Student" %>
    2. <%@ page import="java.util.List" %>
    3. <%@ page import="java.util.ArrayList" %>
    4. <%@ page import="java.util.List" %>
    5. <%@ page contentType="text/html; charset=UTF-8" %>
    6. <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    7. <%
    8. // 创建List集合
    9. List stuList = new ArrayList<>();
    10. // 创建Student对象
    11. Student s1 = new Student("3", "艾弗森");
    12. Student s2 = new Student("24", "科比");
    13. Student s3 = new Student("23", "乔丹");
    14. // 添加到List集合中
    15. stuList.add(s1);
    16. stuList.add(s2);
    17. stuList.add(s3);
    18. // 将list集合存储到request域当中
    19. request.setAttribute("stuList", stuList);
    20. %>
    21. //需求:将List集合中的元素遍历。输出学生信息到浏览器
    22. //使用java代码实现
    23. <%
    24. // 从域中获取List集合
    25. List stus = (List)request.getAttribute("stuList");
    26. // 编写for循环遍历list集合
    27. for(Student stu : stus){
    28. %>
    29. id:<%=stu.getId()%>,name:<%=stu.getName()%>
    30. <%
    31. }
    32. %>

    33. //使用jstl标签库实现
    34. //使用core标签库中forEach标签。对List集合进行遍历
    35. //EL表达式只能从域中取数据。
    36. //var后面的名字是随意的。var属性代表的是集合中的每一个元素。
    37. "${stuList}" var="s">
    38. id:${s.id},name:${s.name}

    上述案例分别演示了使用和不使用jstl标签库来对集合中的元素进行遍历,访问服务器结果如下:

  • 相关阅读:
    联想曝新型UEFI漏洞,影响70款数百万台笔记本电脑
    DSPE-PEG-PDP,DSPE-PEG-OPSS,磷脂PEG衍生物试剂供应
    学习笔记-java代码审计-文件操作
    hyperscan技术
    FineReport数据图表制作-标签控件
    PD1.4转HDMI2.0转接线拆解。
    MFC中嵌入显示opencv窗口
    设计模式(八)组合
    Python语言及其应用
    24.讲二叉树基础(下):有了如此高效的散列表,为什么还需要二叉树
  • 原文地址:https://blog.csdn.net/m0_61028090/article/details/134037410