2022/3/20 Java开发之Java web编程 第八章 使用EL和JSTL简化JSP

目录

一、EL表达式

        1、概念

        2、作用

        3、语法

        4、注意

        5、使用

6、隐式对象

7、c:set、c:out和c:remove

1.

2.

3.

二、JSTL

        1、概念

        2、作用

        3、使用步骤

        4、常用的JSTL标签

       (1)if:相当于java代码的if语句

        (2)choose:相当于java代码的switch语句

        (3)foreach:相当于java代码的for语句

        5、练习

三丶本章总结


一、EL表达式


        1、概念

                Expression Language 表达式语言

        2、作用


                替换和简化jsp页面中java代码的编写

        3、语法


                ${表达式}

        4、注意


                jsp默认支持el表达式的。如果要忽略el表达式
                设置jsp中page指令中:isELIgnored="true",忽略当前jsp页面中所有的el表达式
                \${表达式}:忽略当前这个el表达式

        5、使用

        (1)运算

                运算符:

  • 算数运算符:+ - * /(div) %(mod)
  • 比较运算符:> < >= <= == !=
  • 逻辑运算符:&&(and) ||(or) !(not)
  • 空运算符: empty
    • 功能:用于判断字符串、集合、数组对象是否为null或者长度是否为0
    • ${empty list}:判断字符串、集合、数组对象是否为null或者长度为0
    • ${not empty str}:表示判断字符串、集合、数组对象是否不为null 并且 长度>0

        (2)获取值

  • el表达式只能从域对象中获取值
  • 语法:
    • ${域名称.键名}:从指定域中获取指定键的值

      • 域名称:

          1. pageScope		--> pageContext
          2. requestScope 	--> request
          3. sessionScope 	--> session
          4. applicationScope --> application(ServletContext)
        
      • 举例:在request域中存储了name=张三

      • 获取:${requestScope.name}

    • ${键名}:表示依次从最小的域中查找是否有该键对应的值,直到找到为止。

        (3)获取对象、List集合、Map集合的值

  • 对象${域名称.键名.属性名}

    • 本质上会去调用对象的getter方法
  • List集合${域名称.键名[索引]}

  • Map集合

    • ${域名称.键名.key名称}
    • ${域名称.键名["key名称"]}

6、隐式对象

  • el表达式中有11个隐式对象
  • pageContext
    • 获取jsp其他八个内置对象
      • ${pageContext.request.contextPath}动态获取虚拟目录

7、c:set、c:out和c:remove

1.<c:set>


<c:set>标签用于设置变量值和对象属性。它会计算表达式的值,然后使用计算结果来设置 JavaBean 对象或 java.util.Map 对象的值。

属性

  • value:要存储的值
  • var:存储信息的变量
  • target:要修改的属性所属的对象
  • property:要修改的属性
  • scope:var属性的作用域

2.<c:out>

<c:out>标签用来显示一个表达式的结果,与<%= %>作用相似,它们的区别就是<c:out>标签可以直接通过"."操作符来访问属性。

举例来说,如果想要访问customer.address.street,只需要这样写:<c:out value=“customer.address.street”>。

<c:out>标签会自动忽略XML标记字符,所以它们不会被当做标签来处理。

属性

  • value:要输出的内容
  • default:输出的默认值
  • escapeXml:是否忽略XML特殊字符(默认值为true表示会自动进行转义处理,手动设置为false后可以显示标签)

3.<c:remove>

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

<c:remove var="<string>" scope="String">
  • var:待移除的变量名称
  • scope: 待移除变量所在的作用域(默认为page)

二、JSTL

        1、概念

  •                 JavaServer Pages Tag Library JSP标准标签库
  • 是由Apache组织提供的开源的免费的jsp标签 <标签>

        2、作用

  •                 用于简化和替换jsp页面上的java代码

        3、使用步骤

  • 导入jstl相关jar包
  • 引入标签库:taglib指令: <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  • 使用标签

        4、常用的JSTL标签

  •        (1)if:相当于java代码的if语句

  •     属性:
  • test必须属性,接受boolean表达式
    • 如果表达式为true,则显示if标签体内容,如果为false,则不显示标签体内容
    • 一般情况下,test属性值会结合el表达式一起使用
  • 注意:
    • c:if标签没有else情况,想要else情况,则可以在定义一个c:if标签
  •         (2)choose:相当于java代码的switch语句

  • 使用choose标签声明 相当于switch声明
  • 使用when标签做判断 相当于case
  • 使用otherwise标签做其他情况的声明 相当于default
  •         (3)foreach:相当于java代码的for语句

  • 语法
    <c:forEach items="collationName" var="varName"
        varStatus="varStatusName" begin="beginIndex" end="endIndex"
        step="step">
        主体内容
    </c:forEach>
  • items属性指被迭代的集合对象,可以通过EL表达式获取。
  • var属性是对当前成员的引用,即如果当前循环到第一个成员,var就引用第一个成员, 如果当前循环到第二个成员,var就引用第二个成员,以此类推。
  • varStatus属性用于存放var属性引用的成员的相关信息,如索引等。
  • begin属性表示开始位置,默认为0,该属性可以省略。
  • end属性表示结束位置,该属性可以省略。
  • step表示循环的步长,默认为1,该属性可以省略。

        5、练习

  • 需求:在request域中有一个存有User对象的List集合。需要使用jstl+el将list集合数据展示到jsp页面的表格table中
  • 代码如下:
  • <%@ page import="java.util.List" %>
    <%@ page import="java.util.ArrayList" %>
    <%@ page import="com.allen.domain.User" %>
    <%@ page import="java.util.Date" %>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <html>
    <head>
        <title>test</title>
    </head>
    <body>
    
    <%
        List list = new ArrayList();
        list.add(new User("张三",23,new Date()));
        list.add(new User("李四",24,new Date()));
        list.add(new User("王五",25,new Date()));
    
        request.setAttribute("list",list);
    
    %>
    <table border="1" width="500" align="center">
        <tr>
            <th>编号</th>
            <th>姓名</th>
            <th>年龄</th>
            <th>生日</th>
        </tr>
        <%--数据行--%>
        <c:forEach items="${list}" var="user" varStatus="s">
            <c:if test="${s.count%2 == 0}">
                <tr bgcolor="green">
                    <td>${s.count}</td>
                    <td>${user.name}</td>
                    <td>${user.age}</td>
                    <td>${user.birStr}</td>
                </tr>
            </c:if>
            <c:if test="${s.count%2 != 0}">
                <tr bgcolor="red">
                    <td>${s.count}</td>
                    <td>${user.name}</td>
                    <td>${user.age}</td>
                    <td>${user.birStr}</td>
                </tr>
            </c:if>
    
        </c:forEach>
    
    </table>
    
    </body>
    </html>
    
  • package Servlet;
    import entity.Dog;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    
    @WebServlet("/TextServlet")     //用注解给这个文件取个路径
    public class TextServlet extends HttpServlet {
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            req.setAttribute("a",10);
            req.getSession().setAttribute("b",20);
            Dog d1=new Dog("小白",2,"白色");
            Dog d2=new Dog("小黑",3,"黑色");
            List<Dog>list=new ArrayList<>();
            list.add(d1);
            list.add(d2);
            req.getSession().setAttribute("list",list);
            req.getSession().setAttribute("Flag",1);
            req.getSession().setAttribute("html","<a>点我啊</a>");
            req.getRequestDispatcher("index.jsp").forward(req,resp);
        }
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doPost(req,resp);
        }
    }
  • <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
      <head>
        <title>$Title$</title>
      </head>
      <body>
      <%--用于从作用域中取值--%>
      <%--page<requset<session<application--%>
      <%--可以不用写作用域,它会从小到大去寻找--%>
      ${requestScope.a}
      ${sessionScope.b}
      <table border="2">
      <c:forEach var="ob" items="${list}">
        <tr>
          <td>${ob.name}</td>
          <td>${ob.age}</td>
          <td>${ob.color}</td>
        </tr>
      </c:forEach>
      </table>
      <c:if test="${Flag>0}">
       <h1>欢迎你,啊啊啊!</h1>
      </c:if>
      <c:if test="${Flag<=0}">
        <h1>请登录!</h1>
      </c:if>
    <%--  var:键  value:值  scope:作用域--%>
      <c:set var="cd" value="123" scope="session">
      </c:set>
      <c:out value="${html}" escapeXml="true"></c:out>
      <c:out value="${html}" escapeXml="false"></c:out>
      <c:out value="${cd}"></c:out>
      </body>
    </html>
    

三丶本章总结

  1. EL表达式的语法有$和{}两个要数,两者缺一不可。
  2. EL表达式提供了pageScope丶requestScope丶sessionScope丶applicationScope丶param丶paramValues丶pageContext丶cookie丶initParam等隐式对象。
  3. EL表达式具有类型无关性,可以使用点操作符或[]操作符取得某个属性的值。
  4. JSTL核心标签库中常用的标签有如下三类。
    1. 通用标签:<c:set>丶<c:out>丶<c:remove>。
    2. 条件标签:<c:if>丶<c:choose>丶<c:when>丶<c:otherwise>。
    3. 迭代标签:<c:forEach>。
  5. EL表达式与JSTL标签结合使用,可以在很大程度上减少在JSP中嵌入的Java代码,有利于程序的维护和扩展。

 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Abcdzzr

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值