JSTL&EL表达式
- 一.EL表达式
- JSTL
- 概述和作用:
- 使用步骤
- JSTL常用标签
- 核心标签库core
- 1. < c : o u t > <c:out> <c:out>
- 2. < c : s e t > <c:set> <c:set>
- 3. < c : r e m o v e > <c:remove> <c:remove>
- 4. < c : i f > <c:if> <c:if>
- 5. < c : c h o o s e > < c : w h e n t e s t = " " > < c : o t h e r w i s e > <c:choose><c:when test=""><c:otherwise> <c:choose><c:whentest=""><c:otherwise>
- 6.迭代输出 < c : f o r E a c h > <c:forEach> <c:forEach>
一.EL表达式
1.EL表达式概述:
Expression Language
2.作用:
EL(Expression Language) 是为了使JSP写起来更加简单。表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法,让Jsp的代码更加简化。
3.语法:${表达式类型}
例如:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
${3>4}
</body>
</html>
结果
jsp会自动解析EL表达式,如果想要输出EL表达式句子的话,可以在jsp的page指令中添加参数 isELIgnored = “true”,或者是在EL表达式前面加 \
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="true" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
${3>4}
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
\${3>4}
</body>
</html>
结果:
4.EL表达式运算
运算符
运算代码:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<h3>算数运算符</h3>
${3+4}<br>
${3-4}<br>
${3/4}<br>
${3 div 4}<br>
${3%4}<br>
${3 mod 4}<br>
<h3>比较运算符</h3><br>
${3>4}<br>
${3>2}<br>
${3==3}<br>
${3!=3}<br>
<h3>逻辑运算符</h3><br>
${false && true}<br>
${false || true}<br>
</body>
</html>
结果:
EL获取值
1.EL表达式只能从域对象中获取值
*域对象:Javaweb四大域对象分别是PageContext、request、session、ServletContext.
2.语法:
语法一:
如果没有找到值,则会输出空字符串,不会输出null
代码展示:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
request.setAttribute("name","zhangsan");
session.setAttribute("name","lisi");
%>
${requestScope.name}<br>
${sessionScope.name}
</body>
</html>
结果展示:
语法二:不需要加域名,直接用键,例如:${name}
那么按域的大小,从小到大找是否存在键为name的键值对,找到就结束,否则继续往下找,知道找完位置
四大域的大小:
PageContext<request<session<ServletContext
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
request.setAttribute("name","zhangsan");
session.setAttribute("name","lisi");
%>
${name}
</body>
</html>
因为request<session域,所以先找到request域中存储的name键值对,输出结果为zhangsan
结果展示:
EL获取对象值
user对象的class
public class User {
private String username;
private String password;
private int id;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
创建一个user对象,存储到request域中
<%@ page import="cn.itcast.domain.User" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
User user = new User();
user.setId(1);
user.setUsername("zhangsan");
user.setPassword("123456");
request.setAttribute("user",user);
%>
${requestScope.user}
</body>
</html>
通过${requestScope.user}只能获取到对象的地址值,如果要获取对象的成员变量的值,需要通过属性来完成,而并非成员变量
属性是什么?
setter或getter方法去掉set或get然后首字母变小写就得到了属性,如果没有setter方法就没有属性
例如 setName->Name>name,那么此时name就是属性
例如:我们这里获取username的值,通过属性来完成
${requestScope.user.username}
为什么说是通过属性获取的值而不是成员变量呢,如果没有getter方法是获取不到值的,因为成员变量的私有的无法直接获取,而是间接调用getter,只不过简写了,大家可以尝试一下.
EL获取list集合的值
语法:${域名.键名[索引]}
<body>
<%
List list = new ArrayList<>();
list.add("张三");
list.add("李四");
list.add("王五");
request.setAttribute("list",list);
%>
${requestScope.list}<br><!--获取整个list集合的值-->
${requestScope.list[0]}<!--张三-->
</body>
EL获取map集合的值
语法:
语法1:${域名.键名.key名}
语法2:${域名.键名[key名]}
<body>
<%
Map map = new HashMap();
map.put("zhangsan","张三");
map.put("lisi","李四");
map.put("wangwu","王五");
request.setAttribute("map",map);
%>
${requestScope.map."list"}<br><!--李四-->
${requestScope.map["zhangsan"]}<!--张三-->
</body>
EL_empty运算符
常用于判断对象是否为空,或者字符串长度是否为0
<body>
<%
Map map = new HashMap();
String str="";
%>
${empty map}<br><!--为null,返回true-->
${empty str}<!--字符串长度为0,返回true-->
</body>
EL隐式对象PageContext对象
通过PageContext对象可以获取其他隐式对象,调用方法即可
这里主要学习PageContext对象,用的很多
1.用于获取动态虚拟路径
${pageContext.request.contextPath}
JSTL
概述和作用:
1.概述:JSTL(Java server pages standarded tag library,即JSP标准标签库)是由JCP(Java community Proces)所制定的标准规范,它主要提供给Java Web开发人员一个标准通用的标签库,并由Apache的Jakarta小组来维护。
2.作用:开发人员可以利用这些标签取代JSP页面上的Java代码,从而提高程序的可读性,降低程序的维护难度。
使用步骤
step1.导入JSTL相关的jar包到项目中
step2.引入标签库:taglib指令:
<%@ taglib %>
step3.使用标签
JSTL常用标签
1.下载JSTL的jar包
2.导入jar包到WEB-INF/lib目录下
3.jsp中引入标签库就可以使用了
<%--导入core和fmt标签--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="f" uri="http://java.sun.com/jsp/jstl/fmt"%>
核心标签库core
核心标签库中,一般用途标签分别有<c:out>,<c:set>,<c:remove>,<c:catch>
1. < c : o u t > <c:out> <c:out>
<c:out>标签和<%=jsp脚本%>或${EL表达式}作用是一样的,都是在页面输出静态或动态信息.
语法:<c:out value=“value”[default = “defaultvalue”][escapXml]="{true|false}">
示例:输出"你好啊",和一个对象的属性值
<body>
<%
User user = new User();
user.setUsername("lisi");
user.setPassword("123");
user.setId(15);
request.setAttribute("user",user);
%>
<%--输出"你好啊",输出request域user对象中的username属性--%>
<c:out value="你好啊"/>
<c:out value="${requestScope.user.username}"/>
</body>
2. < c : s e t > <c:set> <c:set>
语法:<c:set value = “value” var = “varName” [scope="{page|request|session|application}"]/>,value是值,var是存值的变量名,scope是选择存值的域对象
示例:使用java脚本生成一个随机数,然后用<c:set> 标签把随机数存到request域对象中,然后<c:out>输出
<body>
<%
int rand = (int)(Math.random()*100);
%>
<c:set value="<%=rand%>" var="r" scope="request"></c:set>
<c:out value="${r}"></c:out>
</body>
3. < c : r e m o v e > <c:remove> <c:remove>
语法<c:remove var=“varName” scope=“四大域对象之一”/>
示例,把随机数存储到request域中,再用<c:remove>删除
<body>
<%
int rand = (int)(Math.random()*100);
request.setAttribute("rand",rand);
%>
<%--获取随机数--%>
<c:out value="${rand}"></c:out>
<c:remove var="rand" scope="request"></c:remove>
<%--移除后获取随机数--%>
<c:out value="${rand}"></c:out>
</body>
4. < c : i f > <c:if> <c:if>
语法:<c:if test=“判断条件”>输出信息</c:if>,当test里面条件成立,返回true时,才会输出输出信息,一般和EL表达式配套使用
注意:JSTL中是没有if…else语法结构的,如果需要使用if…else,可以使用两个if来代替
示例:判断随机数是否大于50
<body>
<%
int rand = (int)(Math.random()*100);
request.setAttribute("rand",rand);
%>
<c:if test="${rand>50}">随机数大于50</c:if>
</body>
5. < c : c h o o s e > < c : w h e n t e s t = " " > < c : o t h e r w i s e > <c:choose><c:when test=""><c:otherwise> <c:choose><c:whentest=""><c:otherwise>
这个语法想当于java中的switch语句
语法:
<c:choose>
<c:when test=""></c:when>
<c:when test=""></c:when>
<c:when test=""></c:when>
…
<c:otherwise></c:otherwise>
</c:choose>
示例判断随机数实在50~80,80~100,还是小于50
<body>
<%
int rand = (int)(Math.random()*100);
request.setAttribute("rand",rand);
%>
<c:choose>
<c:when test="${rand>=80}">rand在80~100</c:when>
<c:when test="${rand>=50}">rand在50~80</c:when>
<c:otherwise>rand小于50</c:otherwise>
</c:choose>
</body>
6.迭代输出 < c : f o r E a c h > <c:forEach> <c:forEach>
参数<c:forEach var=“varName” items="${集合对象}"/>
示例输出list集合的所有值
<body>
<%
List list = new ArrayList<>();
list.add("zhangsan");
list.add("list");
list.add("wangwu");
request.setAttribute("list",list);
%>
<table>
<c:forEach var="listvalue" items="${list}">
${listvalue}<br>
</c:forEach>
</table>
</body>