EL和JSTL
- 掌握el表达式获取值
- 了解el表达式运算
- 了解el表达式内置对象
- 会用jstl常用的标签
一.el表达式
产生背景
- 从JSP2.0开始,就不推荐使用java脚本,而是使用el表达式或者动态标签代替 java脚本; 页面标签;
概念和原理
- 概念:Expression Language :jsp内置的一种表达式语言;
- 原理:el表达式的出现目的是替换jsp中的java的脚本中的<%=%>
- 并且内部进行了null值判断,如果为null则不会输出 ,不为null输出对应数据
写法规范
- ${表达式语言}
<%--<%= request.getAttribute("uname")%>--%>
<!-- 等价于<%= %>输出内容 会自动获取域中数据 并进行null值判断 -->
${uanme}
使用场景
- 获取域对象中的值(*)
- 执行运算符号
- 调用java中方法(了解)
- EL表达式内置常用对象(重要)
从作用域访问对象
从page,request,session,application域对象中取值
实现步骤
<%-- jsp的使用 --%>
<%-- 从域中取值 --%>
<%
/*分别为不同域设置相应key 不同值的数据*/
pageContext.setAttribute("key","pageValue");
request.setAttribute("key","requestValue");
session.setAttribute("key","sessionValue");
application.setAttribute("key","applicationValue");
%>
<%-- 1.指定取值的域 从中取值 --%>
当前页面:${pageScope.key}<br>
当前请求:${requestScope.key}<br>
当前会话:${sessionScope.key}<br>
当前应用:${applicationScope.key}<br>
<%-- 2.自动查找域中的值 从作用域小的向上查找--%>
<%-- 自动查找会由下向上查找第一个指定的key并返回 如果使用自动查找 建议多个域中不要存储相同的key--%>
自动查找:${key}
获取数据中的值
获取数组,list,map,对象的值
<body>
<%-- jsp的使用 --%>
<%-- 从域中取值(数组 list集合 map集合)并打印获取 --%>
<%
//分别创建数组 list集合 map集合 对象 存储至域中
String [] arr={"张三","李四","王五"};
ArrayList<String> arrayList=new ArrayList<>();
Collections.addAll(arrayList,"二狗子","猪蹄子");
HashMap<String,String> hashMap=new HashMap<>();
hashMap.put("username","zhangsan");
hashMap.put("password","123456");
Student student=new Student("lisi","abcddef");
//存到域中
pageContext.setAttribute("arr",arr);
pageContext.setAttribute("arrayList",arrayList);
pageContext.setAttribute("hashMap",hashMap);
pageContext.setAttribute("student",student);
%>
获取数组数据
<%-- 可以直接通过 域key值[索引] 的形式获取数组中对应的数据 --%>
${arr[0]}
${arr[1]}
${arr[2]}
<hr>
获取list集合数据
<%-- 可以直接通过 域key值[索引] 的形式获取数组中对应的数据 --%>
${arrayList[0]}
${arrayList[1]}
<%-- 也可以通过对应对象的方法进行操作(会进行类型转换) --%>
${arrayList.get(0)}
${arrayList.get(1)}
<hr>
获取map集合数据
<%-- 可以直接通过 域key值.map的key 形式获取对应的value--%>
${hashMap.username}
${hashMap.password}
<%-- 也可以通过对应对象的方法进行操作(会进行类型转换) --%>
${hashMap.get("username")}
${hashMap.get("password")}
<hr>
获取对象中的属性值
<%-- 可以直接通过 域key值.属性 形式获取对应的value --%>
${student.username}
${student.password}
<%-- 也可以通过对应对象的方法进行操作(会进行类型转换) --%>
${student.getUsername()}
<%-- 注意 在获取自定义对象属性时 如果使用.属性的形式进行获取 那么必须书写公开的的get方法 --%>
</body>
运算
基础运算 | 加减乘除取模 | |
---|---|---|
关系运算 | == eq > gt < lt >= ge <= le != ne | |
逻辑运算 | && 与 ||或 ! 非 | |
empty运算符 | 判断对象是否存在,或者集合的长度是否为0 |
<body>
<%
pageContext.setAttribute("n1", 20);
pageContext.setAttribute("n2", 10);
%>
${n1+n2}
${n1 == n2}
${n1 eq n2}
${n1 ne n2}
${empty a}//判断域对象中是否有a
</body>
内置对象
对象 | 含义 |
---|---|
pageScope requestScope sessionScope applicationScope | 代表当前页面 代表一次请求 代表一次会话 session 代表application |
param | 返回客户端请求参数字符串值,相当于request.getParameter() |
paramValues | 返回客户端请求参数字符串值,相当于request.getParameters() |
pageContext | 可以获取其他八个内置对象 |
headerValues | 代表请求头 |
cookie | 代表客户端发送请求中的所有cookie |
<h3>获取请求参数</h3>
<%= request.getParameter("username") %>
<h3>EL的方式</h3>
${ param.username }
${ paramValues.username[0] }
<h3>获取到请求头的信息</h3>
<%= request.getHeader("user-agent") %>
<h3>EL的方式</h3>
${ header["user-agent"] }
二.jstl标签库
概念
- 概念
- JavaServerPages Standard Tag Library,JSP标签标签库,是Apache提供的标签库,需要导入jar包,JSTL依赖EL表达式,获取值是由EL表达式来获取的,使用标签库提供的标签完成对应的功能
使用场景
<%-- 书写存储对象的集合 并存储至域中在jsp页面打印 --%>
<%
ArrayList<Student> list = new ArrayList<>();
list.add(new Student("zhangsan", "123456"));
list.add(new Student("wangwu", "456788"));
list.add(new Student("lisi", "987654"));
pageContext.setAttribute("list",list);
pageContext.setAttribute("s",new Student("lisi", "987654"));
%>
<%-- jsp el表达式只是替代获取与输出脚本 不能进行额外的操作 所以在获取集合时 只能依次取出 --%>
<table border="1">
<thead><tr><td>序号</td><td>账号</td><td>密码</td></tr></thead>
<tbody>
<tr><td>1</td><td>${list[0].username}</td><td>${list[0].password}</td></tr>
<tr><td>2</td><td>${list[1].username}</td><td>${list[1].password}</td></tr>
<tr><td>3</td><td>${list[2].username}</td><td>${list[2].password}</td></tr>
<tr><td>4</td><td>${list[3].username}</td><td>${list[3].password}</td></tr>
</tbody>
</table>
<%-- 但是一般数据由后台(servlet)从数据库中取出 不一定有多少条 虽然越界不会显示数据 --%>
<%-- 但是html对应的还是会显示 这个时候就需要使用jstl帮我们进行一些特殊的书写 --%>
- 向域对象存取值
- 判断域对象中的值
- 循环域对象中的值
使用步骤
1.导入jar包
- jstl1.jar
- stand.jar
2.在jsp中使用JSTL标签库
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
使用标签
<%-- jstl功能--%>
<%-- 1.对域对象进行赋值--%>
<%-- (1)c:set var声明变量(存储在域中的key) value值(存储在域中的值) scope选择域(存储在那个域中)--%>
<c:set var="aaa" value="bbb" scope="session"/>
${aaa}
<%-- (2)c:set target对象名(要修改属性的对象) property要修改的属性 value要修改的值 --%>
<c:set target="${s}" property="username" value="sssss"/>
${s}
<%-- 2.将指定数据输出 并进行设置 --%>
<%-- value输出的数据 default当数据为null时替代输出的数据 默认为""空字符串 escapeXml是否转义 --%>
<c:out value="${null}" default="默认值" escapeXml="false"/>
<%-- 3.移除域中指定数据 --%>
<%-- var移除的key scope移除数据的作用域 如果没有会自动查找 --%>
<c:remove var="s" scope="page"/>
<c:out value="${s}" default="没有数据" escapeXml="false"/>
if标签
-
对语句进行判断,只有if,没有else
- test:判断的条件 代替之前的()
- var:把判断的条件的结果(true或者false)保存到var中
- scope:作用域(将var值存放的作用域)
-
案例
<%-- 对域中数据进行判断操作 --%> <%-- 根据结果对页面内容进行书写 --%> <%-- c:if 根据test返回的结果执行对应代码块 将结果保存到var定义的变量并存储到scope设置的作用域中 --%> <c:if test="${s.username eq 'lisi'}" var="jg" scope="page"> 你叫李四 </c:if> <c:if test="${s.username ne 'lisi'}"> 你不叫李四 </c:if>
choose标签
-
用来进行判断,但是重合的标签
-
格式
<c:choose> <c:when></c:when> <c:otherwise></c:otherwise> </choose>
-
案例
<%-- 当判断的条件存在多个并可能取反的时候 需要使用c:choose标签 --%> <%-- 可以看做 if esle if else --%> <c:choose> <c:when test="${s.username eq 'zhangsan'}">你是张三</c:when> <c:when test="${s.username eq 'lisi'}">你是李四</c:when> <c:otherwise>我不认识你</c:otherwise> </c:choose>
foreach标签
-
用来迭代数据
-
属性
- var:声明变量
-
begin:从那开始
- end:结束
-
step:步长
- varStatus:变量的状态
current 当前这次迭代的(集合中的)项
index 当前这次迭代从 0 开始的迭代索引
count 当前这次迭代从 1 开始的迭代计数
first 用来表明当前这轮迭代是否为第一次迭代的标志
last 用来表明当前这轮迭代是否为最后一次迭代的标志
begin begin 属性值
end end 属性值
step step 属性值 - items:需要遍历的集合
- varStatus:变量的状态
-
案例
<%-- 当需要对域中存储的集合数据进行操作时 需要根据数据的实际数量进行页面的书写 --%> <%-- 这个时候就需要使用c:foreach标签 --%> <%-- 1.普通的循环操作 将内容重复指定次数输出 --%> <%-- var声明保存数据的变量(初始化语句) begin初始化变量的初始值 end结束值 step步长(迭代语句) --%> <%-- varStatus保存当前变量数据的信息对象 通过设置的对象名.属性名获取对应的信息 --%> <c:forEach var="i" begin="0" end="10" step="2" varStatus="status"> ${i} /${status.end} <br> </c:forEach> <%-- 2.遍历域中集合数据 --%> <%-- 只需要var 以及items 也可以携带 varstatus --%> <%-- var 每次取出的数据遍历 items域中存储的遍历的集合 --%> <c:forEach var="student" items="${list}" varStatus="status"> ${student}<br> </c:forEach> <%-- 通常使用表格以及c:foreach进行数据的展示 --%> <table border="1"> <thead> <tr> <td>序号</td> <td>账号</td> <td>密码</td> </tr> </thead> <tbody> <c:forEach var="student" items="${list}" varStatus="status"> <c:if test="${status.count%2==0}"> <tr style="background-color: red"><td>${status.count}</td><td>${student.username}</td><td>${student.password}</td></tr> </c:if> <c:if test="${status.count%2!=0}"> <tr style="background-color: green"><td>${status.count}</td><td>${student.username}</td><td>${student.password}</td></tr> </c:if> </c:forEach> </tbody> </table>