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属性:用于指定迭代的步长,即迭代因子的增量。
相关推荐
葡萄城技术团队9 小时前
在 Java 中优化 MySQL 查询以提升性能
java·开发语言·mysql
杀死那个蝈坦9 小时前
短链接生成-基于布隆过滤器和唯一索引
java·数据库·微服务·oracle·rocketmq
慕白Lee9 小时前
Java foreach在lambda的foreach遍历中退出操作(lambda foreach break)
java
winfield82110 小时前
Java 中大量闲置 MySQL 连接的解决方案(从根因到落地)
java·mysql
moxiaoran575310 小时前
Java开发中VO的使用
java·开发语言
计算机毕设指导610 小时前
基于微信小程序图像识别的智能垃圾分类系统【源码文末联系】
java·spring boot·mysql·微信小程序·小程序·分类·maven
LJianK110 小时前
前后端接口常见传参
java·spring
独自破碎E10 小时前
消息队列如何保证消息的有效性?
java·开发语言·rocketmq·java-rocketmq
38242782710 小时前
使用 webdriver-manager配置geckodriver
java·开发语言·数据库·爬虫·python
骚戴10 小时前
2025企业级架构演进:重构 Java/Python 的 RAG 与 Agent 系统的六种核心策略
java·人工智能·大模型·llm·api