El表达式和JSTL

一、El

1.1 El语法

${表达式}

特点:

  • (1)EL可以与JavaScript语句结合使用。
  • (2)EL可以自动进行类型转换。如果想通过EL获取两个字符串数值(如number1和number2)的和,可以直接通过"+"符号进行连接(如$ {number1+number2})。
  • (3)EL不仅可以访问一般变量,还可以访问JavaBean中的属性、嵌套属性和集合对象。
  • (4)在EL中,可以执行算术运算、逻辑运算、关系运算和条件运算等。
  • (5)在EL中,可以获取pageContext对象,进而获取其他内置对象。
  • (6)在使用EL进行除法运算时,如果除数为0,则返回表示无穷大的Infinity,而不返回错误。
  • (7)在EL中,可以访问JSP的作用域(request、 session、 application 以及page)。

演示

新建一个类,请求转发获取域对象,来使用El表达式

java 复制代码
@WebServlet("/RequestServlet04")
public class El extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setAttribute("username","zhansan");
        req.setAttribute("password",123456);
        RequestDispatcher requestDispatcher = req.getRequestDispatcher("Demo4.jsp");
        requestDispatcher.forward(req,resp);
    }

    @Override
    protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPut(req, resp);
    }
}

请求转发的页面

html 复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    用户名:<%= request.getAttribute("username")%> <br>
    密码:<%= request.getAttribute("password")%> <br>
    使用El: <br>
    用户名:${username} <br>
    密码:${password} <br>
</body>
</html>

运行结果;

EL明显简化了JSP页面的书写,使程序简洁易维护。另外,当域对象里面的值不存在时,使用EL获取域对象里面的值时返回空字符串;而使用Java方式获取时,如果返回值是null,会报空指针异常,所以在实际开发中推荐使用EL的方式获取域对象中存储的数据。

1.2 EL运算符

|---------|---------------------------|
| 优先级 | 运算符 |
| 1 | [ ] . |
| 2 | ( ) |
| 3 | -(unary) not ! empty |
| 4 | * / div % mod |
| 5 | + -(binary) |
| 6 | < > <= >= lt gt le ge |
| 7 | == != eq ne |
| 8 | && and |
| 9 | || or |
| 10 | ?: |

注意:在应用EL取值时,没有数组的下标越界,没有空指针异常,没有字符串的拼接。

二、El隐式对象

EL提供了11个隐式对象,pageContext可以获取其他10个隐式对象。

  • pageScope、requestScope、sessionScope、applicationScope用于获取指定域的隐式对象
  • param和paramValues用于获取请求参数的隐式对象,
  • header和headerValues用于获取HTTP请求消息头的隐式对象;
  • cookie用于获取Cookie信息的隐式对象;
  • initParam用于获取Web应用初始化信息的隐式对象。

2.1 pageContest对象的使用

html 复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
请求URI为: ${pageContext.request.requestURI} <br>
Content-Type响应头为: ${pageContext.response.contentType} <br>
服务信息为: ${pageContext.servletContext.serverInfo} <br>
Servlet注册名为: ${pageContext.servletConfig.servletName} <br>
</body>
</html>

2.2 4个不同范围的域对象

pageScope、requestScope、 sessionScope和applicationScope4个隐式对象都可以通过setAttribute()方法存储属性,通过getAttribute()方法获取属性。如果存在相同的在name属性,那么会在page、request、session、application这4个作用域内按顺序依次查找对应的属性。

html 复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<% pageContext.setAttribute("username", "zhansan");%>
<% request.setAttribute("bookName", "Mysql");%>
<% session.setAttribute("username", "lisi");%>
<%application.setAttribute("bookName", "Mybatis");%>
${pageScope.username};
${requestScope.bookName};
${sessionScope.username};
${applicationScope.bookname};//这里是小写,上面大写
</body>
</html>

当没有对应的值时后,显示为空。

2.3 获取请求参数param和paramValues两个对象

param对象用于获取请求参数的某个值,它是Map类型,与request.getParameter()方法相同,在使用EL获取参数时,如果参数不存在,返回的是空字符串,而不是null。

如果一个请求参数有多个值,可以使用paramValues对象获取请求参数的所有值,该对象返回请求参数所有值组成的数组,如果要获取某个请求参数的第一个值,可以使用下标。

html 复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/El/param.jsp">
    num1:<input type="text" name="num1"> <br>
    num2:<input type="text" name="num"> <br>
    num3:<input type="text" name="num"> <br>
    <input type="submit" value="提交"> <br>
    <input type="submit" value="重置">
    <hr>
    num1:${param.num1} <br>
    num2:${paramValues.num[0]} <br>
    num3:${paramValues.num[1]} <br>
</form>
</body>
</html>

2.4 cookie对象

该对象是一个集合了所有Cookie信息的Map集合,Map集合中元素的键为各个Cookie的名称,值则为对应的Cookie对象。

html 复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
cookie对象信息:${cookie.userName} <br>
cookie对象的名称和值:${cookie.userName.name} = ${cookie.userName}
<%response.addCookie(new Cookie("userName","zhangsan"));%>
</body>
</html>

第一次访问:需要先让cookie对象存放才能被获取

第二次访问:(刷新后)

2.5 initParam对象

在web.xml中添加

XML 复制代码
    <context-param>
        <param-name>author</param-name>
        <param-value>曹雪芹</param-value>
    </context-param>

jsp页面El获取

XML 复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
Author的值:${initParam.author}
</body>
</html>

运行结果

三、JSTL

标准标签库(JavaServer Pages Standard Tag Library),简称JSTL。

核心标签库:<%@ taglib prefix="c" url="http://java.sun.com/jsp/jstl/core" %>。主要用于完成JSP页面的常用功能,包括JSTL的表达式标签、URL标签、流程控制标签。例如,用于输出文本内容的<c:out>标签、用于条件判断的<c:if>标签、用于迭代循环的<c:forEach>标签等。

格式标签库:<%@ taglib prefix "fmt" url="http://java.sun.com/jsp/jstl/fmt"%>。实现Web应用程序的国际化标签和格式化标签。

SQL标签库:<%@ taglib prefix="sql" url="http://java.sun.com/jsp/jstl/sql" %>。用于访问数据库和操作数据库的标签。

XML标签库:<%@ taglib prefx="xml" url="http://java.sun.com/jsp/jstl/xml" %>,包含对XML文档中的数据进行操作的标签。

函数标签库:<%@ taglib prefix= "fn" url="http://java.sun.com/jsp/jstl/functions"%>,包含了JSP网页制作者经常要用到的字符串操作。

下载jakarta-taglibs-standard-1.1.2.zip之后将其lib目录下的两个jar包导入对应的目录。

注意:taglib指令的uri属性用于指定引入标签库描述符文件的URI,prefix属性用于指定引入标签库描述符文件的前缀,在JSP文件中使用这个标签库中的某个标签时,都需要使用这个前缀。

案例演示:

XML 复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<html>
<head>
    <title>Title</title>
</head>
<body>
    <c:out value="Hello World!"></c:out>
</body>
</html>

四、JSTL中的Core标签库

4.1 <c:out> :向页面输出一段文本信息

两种格式:

有标签体

<c:out value="value" [escapeXml="{true|false}"]>

defaultValue </c:out>

无标签体

<c:out value="value" [default="defaultValue"] [escapeXml="{true|false}"]/>

  • (1)value属性用于指定输出的文本内容。
  • (2)default属性用于指定当value属性为null时所输出的默认值,该属性是可选的(中括号中的属性都是可选的)。
  • (3)escapeXml属性用于指定是否将>、<、&、'、" 等特殊字符进行HTML编码转换后再进行输出,默认值为true。

需要注意的是,只有当value属性值为null时,<c:out>标签才会输出默认值,如果没有指定默认值,则默认输出空字符串。

XML 复制代码
<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--第1个out标签 --%>
userName属性的值为:
<c:out value="${param.username}" default="unknown"/> <br/>
<%--第2个out标签 --%>
userName属性的值为:
<c:out value="${param.username}">
    unknown
</c:out>
</body>
</html>
XML 复制代码
<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head></head>
<body>
<%--escapeXml="true"--%>
<c:out value="${param.username }" escapeXml="false">
    <meta http-equiv="refresh"
          content="0;url=https://www.baidu.com/" />
</c:out>
</body>
</html>

当escapeXml="false"设置为false时,url中不会被转义,而是直接跳转到对应的链接,当把其设置为true时候,就能显示对应的界面。

4.2 <c:remove>:

<c:remove var="name" [scope="范围"]/>

var:用于指定要移除的变量名。

scope:用于指定变量的有效范围,可选值有page、request、session和application,默认值为page。如果在该标签中没有指定变量的有效范围,那么将分别在page、request、 session 和application的范围内查找要移除的变量并移除。例如,在一个页面中,存在不同范围的两个同名变量,当不指定范围时移除该变量,这两个范围内的变量都将被移除。因此,在移除变量时,最好指定变量的有效范围。

4.3 流程控制标签

①<c:if>标签,有三个属性
  • test属性用于设置逻辑表达式。
  • var属性用于指定逻辑表达式中变量的名字。
  • scope属性用于指定var变量的作用范围,默认值为page
java 复制代码
<%@ page language="java" contentType="text/html; charset=utf-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
    <title>欢迎页面</title>
</head>
<body>
<c:if test="${empty sessionScope.visitCount}">
    <c:set var="visitCount" value="1" scope="session"/>
    欢迎你!
</c:if>
<c:if test="${sessionScope.visitCount == 1}">
    <c:set var="visitCount" value="${visitCount + 1}" scope="session"/>
    欢迎你!这是你的第${visitCount}次访问。
</c:if>
<c:if test="${sessionScope.visitCount > 1}">
    这是你的第${sessionScope.visitCount}次访问。
</c:if>
</body>
</html>
②<c:choose>、<c:when>和<c:otherwise>标签

<c:choose>标签没有属性,在它的标签体中只能嵌套一个或多个<c:when>标签,零个或一个<c:otherwise>标签,并且同一个<c:choose>标签中所有的<c:when>子标签必须出现在<c:otherwise>子标签之前。

java 复制代码
<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head></head>
<body>
<c:choose>
    <c:when test="${empty param.username}">
        Unknown find
    </c:when>
    <c:when test="${param.username=='zhangsan' }">
        ${ param.username} is manager.
    </c:when>
    <c:otherwise>
        ${ param.username} no
    </c:otherwise>
</c:choose>
</body>
</html>

案例:

③<c:forEach>
  • var属性:用于将当前迭代到的元素保存到page域中的名称。
  • items属性:用于指定将要迭代的集合对象。
  • varStatus属性:用于指定将当前迭代状态信息的对象保存到page域中的名称。
  • begin属性:用于指定从集合中第几个元素开始进行迭代,begin的索引值从0开始,如果没有指定items属性,就从begin指定的值开始迭代,直到迭代结束为止。
  • step属性:用于指定迭代的步长,即迭代因子的增量。
相关推荐
阿龟在奔跑1 小时前
引用类型的局部变量线程安全问题分析——以多线程对方法局部变量List类型对象实例的add、remove操作为例
java·jvm·安全·list
飞滕人生TYF1 小时前
m个数 生成n个数的所有组合 详解
java·递归
代码小鑫1 小时前
A043-基于Spring Boot的秒杀系统设计与实现
java·开发语言·数据库·spring boot·后端·spring·毕业设计
真心喜欢你吖1 小时前
SpringBoot与MongoDB深度整合及应用案例
java·spring boot·后端·mongodb·spring
激流丶2 小时前
【Kafka 实战】Kafka 如何保证消息的顺序性?
java·后端·kafka
周全全2 小时前
Spring Boot + Vue 基于 RSA 的用户身份认证加密机制实现
java·vue.js·spring boot·安全·php
uzong3 小时前
一个 IDEA 老鸟的 DEBUG 私货之多线程调试
java·后端
AiFlutter3 小时前
Java实现简单的搜索引擎
java·搜索引擎·mybatis
飞升不如收破烂~3 小时前
Spring boot常用注解和作用
java·spring boot·后端
秦老师Q3 小时前
Java基础第九章-Java集合框架(超详细)!!!
java·开发语言