Expression Language 表达式语言,常用于取值
我们之前在JSP中写java代码必须写在<%%>里面。并且取值代码比较繁琐。
而EL表达式可以使我们的取值代码更加简洁
语法非常简单
${}
看个小例子:
我们在一个表单填写账号和密码提交后在成功页面显示出账号密码。
这里就直接贴成功页面的代码
<%--
Created by IntelliJ IDEA.
User: YZQ
Date: 2018/7/29
Time: 20:16
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录成功title>
head>
<body>
<h1>登录成功h1>
<h3>传统的取值方式h3>
用户名:<%=request.getAttribute("account")%>
<br>
密码:<%=request.getAttribute("pwd")%>
<h3>EL表达式取值h3>
<%--使用EL表达式取值--%>
用户名:${requestScope.account}
<br>
密码: ${pwd}
body>
html>
运行结果:
可以看到,使用EL表达式取值非常的简单,直接${account}即可,我们的jsp页面主要就是用来显示数据的,那么,使用EL表达式则可以减少很多取值的代码。这些值是从哪取的呢,实际上就是从四大作用域中获取的。
servlet中的四个作用域分别为page,request,session,application
我们可以指定在某个作用域中取数据。
例如
<%--从 page 作用域中查找account--%>
${pageScope.account}
<%--从 request 作用域中查找account--%>
${requestScope.account}
<%--从 session 作用域中查找account--%>
${sessionScope.account}
<%--从 application 作用域中查找account--%>
${applicationScope.account}
如果我们不指定作用域的话,直接${account}的话,默认会按照作用域的范围从小到大依次查找,找到第一个为止,都找不到的话则为空
作用域从小到大:page->request->session->application
JSP标准标签库(JavaSeverPages Standard Tag Libary)
同样的也是为了简化我们的jsp代码,一般与EL表达式结合使用
EL表达式多用于取值操作,而JSTL则可以方便我们对集合进行遍历,对数据进行判断等操作。
首先,下载Standard Taglib
目前最新版本是1.2.5,将下面四个jar包下载后倒入到项目中即可。
然后我们在jsp页面添加如下指令后,即可使用jstl标签了
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--JSTL 核心标签--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--JSTL 格式化标签--%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%--JSTL SQL标签--%>
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
<%--JSTL XMLb标签--%>
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>
<%--JSTL 函数标签--%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
其中prefix表示前缀,前缀的值我们可以自己定义,但是不要使用关键字,会有冲突。为了保证可读性,一般都跟标签类型相对应
语法格式:前缀名:标签
平时最常使用的就是核心标签了,我们来看看核心标签中都有哪些常用标签
set标签:将值保存在指定的作用域中
<%-- var="变量名" value="值" scope="保存在哪个作用域(page、request、session、application)"--%>
set var="userName" value="yzq" scope="page"> set>
${userName}<%--配合EL表达式取值--%>
out标签:将结果输出
<%--取值--%>
<c:out value="${userName}"></c:out>
remove标签:删除某个值
<%--删除userName的值--%>
<c:remove var="userName"></c:remove>
if标签:判断
在之前的jsp中我们如果要对数据进行判断后显示符合条件的数据,要这么写。
<%--JSP程序脚本--%>
<%
/*
* 这里可以写变量声明,表达式,程序逻辑等
* 是局部的,相当于Java中的普通方法
* */
String name = "yzq";
int age = 23;
if (age > 20) {
%>
<span>奔三的人了span>
<%
} else {
%>
<span>奔二的人了span>
<%
}
%>
看起来是不是很费劲,当然写起来更费劲。
而是用JSTL的if标签就很简单了
test接收判断条件的值
<c:if test="${age>20}">
<span>奔三的人了span>
c:if>
choose:选择,跟java中的switch语句类似
作为when标签和otherwise标签的父标签
<c:set var="age" scope="page" value="40">c:set>
<c:choose>
<%--符合该条件时执行--%>
<c:when test="${age>20&&age<30}">
<span>奔三的人了span>
c:when>
<%--符合该条件时执行--%>
<c:when test="${age<20}">
<span>还是小鲜肉span>
c:when>
<%--之前条件都不满足时,执行这个--%>
<c:otherwise>
<span>可以考虑养生了span>
c:otherwise>
c:choose>
forEach标签:用于迭代集合
我们来一个servlet,用于创建一个集合数据,放到request中,User中就两个属性,name和age。
package servlet;
import data.User;
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(name = "JstlServlet",urlPatterns = "/jstl")
public class JstlServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
List users = new ArrayList<>();
for (int i = 0; i < 10; i++) {
users.add(new User("yzq", i));
}
request.setAttribute("users", users);
request.getRequestDispatcher("/jstl.jsp").forward(request, response);
}
}
在jsp中迭代集合并显示数据,其中items表示集合数据,var表示迭代出的数据的变量名
<%--迭代标签 用于迭代集合--%>
<c:forEach items="${users}" var="user">
${user.name}</span>:${user.age}>
</c:forEach>
foreach标签还有一些其他的属性
begin :从哪个下标开始迭代,默认值为0
end:迭代到第几个,默认值为集合的长度
step:迭代的步长
varStatus:迭代项的状态变量名,可以获取迭代项的相关状态
我们来看看用法
<%--迭代标签 用于迭代集合--%>
<c:forEach items="${users}" var="user" begin="2" end="6" step="2" varStatus="userStatus">
${user.name}</span>:${user.age}>
计数:${userStatus.count}
步长:${userStatus.step}
开始位置: ${userStatus.begin}
结束位置:${userStatus.end}
下标:${userStatus.index}
是否是第一个:${userStatus.first}
是否是最后一个:${userStatus.last}
</c:forEach>
EL表达式和JSTL常用的基本上就这些,比较简单