EL
Expression Language 表达式语言
是为了使JSP写起来更加简便,替换JSP中的<%=%>,简化了JSP页面中输出数据的操作、
主要输出保存在某个作用域中的数据。
特点
如果通过"某个作用域对象.setAttribute(“cus”,customer)"方法保存的对象,
在JSP页面中,如果用表达式,使用<%=%>输出,用EL使用**${cus}**输出。
会依次从pageContext–>request–>session–>application中获取指定对象。
如果一旦从某个作用域中获取到了指定对象,就不再判断后续作用域。
也可以输出指定作用域中的对象。
-
只能输出保存在作用域中的对象
-
减少代码(省去了获取对象、转换的过程)
-
免去非空判断
- 如果要输出的对象不存在,不会输出null,而是输出空字符串""。
用法
在页面中输出保存在作用域中的对象
-
从作用域中依次查询并输出对象
${对象名}
-
从指定作用域中输出对象
作用域 对应作用域 代码 pageScope 当前页pageContext ${pageScope.对象} requestScope 请求request ${request.对象} sessionScope 会话session ${session.对象} applicationScope 项目application ${application.对象} -
输出对象的属性
${对象名.属性名} ${对象名[属性名]}
-
输出对象的方法的返回值
${对象名.方法名()}
如在servlet中
Person p = new Person("admin","男",20);
request.setAttribute("p",p)
跳转到某个页面中
<html>
<body>
<%-- 如果不用EL,先获取对象,向下转型 --%>
<%Person p = (Person)request.getAttribute("p");%>
//如果p为空,会报错;如果name没赋值,会输出null
<h3>
<%=p.getName()%>
</h3>
<%--如果使用EL,无需获取对象,无需转型,直接通过保存的对象名.属性名即可--%>
<h3>
${p.name}
${p["name"]}
</h3>
<%--使用EL输出对象的属性时,该对象必须要有getXXX()方法--%>
<%--如果没有在任何作用域中获取到对象p,或对象p没有name属性,不会保存,输出空字符串--%>
</body>
</html>
在页面中获取请求中的参数
EL可以使用${param.参数名}替换request.getParameter(“参数”)
如有表单
<html>
<body>
<form action="page.jsp">
<input type="text" name = "username">
<input type="submit">
</form>
</body>
</html>
在page.jsp中获取
<%-- 如果不用EL--%>
<%String username = request.getParameter("uername");%>
<h3>
<%=username%>
</h3>
<%-- 如果使用EL --%>
<h3>
${param.username}
</h3>
用于获取当前项目上下文(根目录+项目名)路径
如http://localhost:8080/Library就是一个项目上下文路径
在JSP中使用**${pageContext.request.contextPath}**获取上下文路径
<form action="${pageContext.request.contextPath}/servlet">
</form>
<a href="${pageContext.request.contextPath}/页面路径"></a>
注意
-
web.xml版本在4.0之后,JSP中使用EL时,默认可以识别
-
如果JSP无法识别EL,在指令<%@ %>中加入 isELIgnore="false"表示不忽略EL
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnore="false"%>
-
如果在使用EL过程中,出现PropertyNotFoundException错误,表示未发现指定属性,原因如下
- 缺少指定属性
- 指定属性没有对应的get方法
JSTL
Java Server Page Standarded Tag Library JSP标准标签库
可以使用JSTL中的特定标签,来替换JSP中常见的Java代码。如循环判断等,减少Java代码,提高页面的可读性。
1、导入JSTL对应的依赖
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
2、在JSP页面中,添加标签库指令
<%--在当前页面中使用jstl,加入以下指令--%>
<%@ taglib prefix="" uri="http://java.sun.com/jsp/jstl/core" %>
这句话可以不写,在使用循环遍历时会自动生成
3、具体用法
-
定义变量
<c:set var="变量名" value="值"></c:set>
如:
<c:set var="number" value="123123"></c:set>
-
if判断
<c:if test="判断条件"> 满足时的内容 </c:if>
如在servlet中
request.setAttribute("person",new Person("ez","男"));
在jsp中
<c:if test="${person.sex=='男'}"> <input type="radio" name="sex" checked>男 <input type="radio" name="sex">女 </c:if>
-
遍历List集合
<c:forEach item="要遍历的集合" var="遍历出的对象名"></c:forEach>
如servlet中保存了集合
List<BookInfo> list = dap.queryAll(); request.setAttribute("list",list);
在jsp页面中
<%--判断集合为空--%> <c:if test="${empty list}"> 无数据 </c:if> <c:forEach item="${list}" var="bi"> <tr> <td>${bi.bookName}</td> <td>${bi.bookAuthor}</td> </tr> </c:forEach>
-
遍历Map集合
<c:forEach items="要遍历的集合名" var="遍历出的键值对的名称"> ${键值对名.key.属性} ${键值对名.value.属性} </c:forEach>
如
<% HashMap<String,String> hm=new HashMap(); hm.put("yyds","永远单身"); hm.put("xswl","吓死我了"); hm.put("pyq","朋友圈"); session.setAttribute("hm",hm); %> <c:forEach items="${hm}" var="kv"> <!--遍历键--> <h3>${kv.key}</h3> <!--遍历值--> <h3>${kv.value}</h3> </c:forEach>