本文主要内容:1.EL表达式;2.JSTL:JSP标准标签库
本文目录
写在前面
JSTL仅是JSP表达式语言,而EL既是HTML也是JSP表达式语言,全称是Expression Language。 在JavaScript中也可以使用EL表达式。
JSP的代码块实在令人不忍直视,拆分标签、嵌入式写代码让人非常不习惯。EL表达式和JSTL出现,让JSP有了一丝顺滑。
一.EL表达式
1.概念
EL:Expression Language 是一种表达式语言。
2.作用
EL是用来替换和简化jsp页面中java代码的编写。
3.语法
语法格式:
${表达式}
4.注意事项
JSP默认支持EL表达式的。如果要忽略EL表达式,有以下两种方法实现:
- 设置jsp中page指令中:属性
isELIgnored="true"
忽略当前jsp页面中所有的EL表达式 \${表达式}
:在$符号前面加上反斜杠\,表示忽略当前这个EL表达式。
5.EL表达式使用
5.1 运算
表达式中支持以下运算符:
- 算数运算符: + - * /(或div) %(或mod)
- 比较运算符: > < >= <= == !=
- 逻辑运算符: &&(and) ||(or) !(not)
- 空运算符: empty
空运算符empty的功能比较强大:
- 功能:用于判断字符串、集合、数组对象是否为null或者长度是否为0
${empty list}
:判断字符串、集合、数组对象是否为null或者长度为0${not empty str}
:表示判断字符串、集合、数组对象是否不为null 并且 长度>0
例子:elDemo1.jsp
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>EL表达式</title>
</head>
<body>
<%--运算符--%>
${3>4};
<%--忽略EL表达式--%>
\${3>4};
<hr/>
<h3>算数运算符</h3>
${3+4}<br>
${3/4}<br>
${3 div 4}<br>
${3 % 4 }<br>
${3 mod 4}<br>
<h3>比较运算符</h3>
${3>4 && 3<4}<br>
${3>4 and 3<4}<br>
<h3>empty运算符</h3>
<%
String str = "";
request.setAttribute("str",str);
List list = new ArrayList<String>();
request.setAttribute("list",list);
%>
${not empty str}
${not empty list}
</body>
</html>
访问elDemo1.jsp
5.2 获取值
EL表达式只能从域对象中获取值。
语法:
1.${域名称.键名}
:从指定域中获取指定键的值。
常见域有:
域名称 | 对应的域 |
---|---|
pageScope | pageContext域 |
requestScope | request域 |
sessionScope | session域 |
applicationScope | application(ServletContext)全局域 |
域大小:pageContext < request < session < application(ServletContext)
例子:在request域中存储了【name=张三】的数据。
<!-- JSP中:EL表达式获取name值 -->
${requestScope.name}
整个
${requestScope.name}
值为张三
2.简化的语法
${键名}
:表示依次从最小的域中查找是否有该键名对应的值,直到找到为止。没有则不显示
例子:elDemo2.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>EL获取域中的数据</title>
</head>
<body>
<%
//在域中存储数据
session.setAttribute("name","李四");
session.setAttribute("age","23");
request.setAttribute("name","张三");
request.setAttribute("str","");
%>
<h3>EL获取值</h3>
${requestScope.name}
${sessionScope.age}
${sessionScope.haha}
<hr>
简化格式,由域小到大匹配键对应的值。<br>
${name}
${sessionScope.name}
</body>
</html>
访问elDemo2.jsp
5.3 获取对象、List集合、Map集合的值
1.获取对象
语法:
${域名称.键名}
:域中某个键的值是一个对象。${域名称.键名.属性名}
:获取对象的属性值, 本质上会去调用对象的getter方法。
2.List集合
语法:
${域名称.键名[索引]}
:域中某个键的值是一个List对象。加上索引可以获取到集合中对应的值。
3.Map集合
获取Map集合中的值有两种方式:
${域名称.键名.key名称}
${域名称.键名["key名称"]}
例子:elDemo3.jsp
<%@ page import="com.dong.domain.User" %>
<%@ page import="java.util.*" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>el获取数据</title>
</head>
<body>
<%
//创建User对象
User user = new User();
user.setName("董小帅");
user.setAge(21);
user.setBirthday(new Date());
//向域中存储数据
request.setAttribute("user",user);
//List集合
List list = new ArrayList();
list.add("aaa");
list.add("bbb");
list.add(user);
request.setAttribute("list",list);
//Map集合
Map map = new HashMap();
map.put("name","李四");
map.put("gender","男");
map.put("user",user);
request.setAttribute("map",map);
%>
<h3>el获取对象中的值</h3>
${requestScope.user}
<%--
* 通过的是对象的属性来获取
* setter或getter方法,去掉set或get,在将剩余部分,首字母变为小写。
* setName --> Name --> name
--%>
${requestScope.user.name}<br>
${user.name}<br>
${user.age}<br>
${user.birthday}<br>
${user.birthday.month}<br>
<%--获取自定义属性--%>
${user.birStr}
<h3>el获取List值</h3>
${list}<br>
${list[0]}<br>
${list[1]}<br>
${list[10]}<br>
${list[2].name}<br>
<h3>el获取Map值</h3>
${map.gender}<br>
${map["gender"]}<br>
${map.user.name}<br>
</body>
</html>
访问elDemo3.jsp
5.4 使用隐式对象
EL表达式中有11个隐式对象,不常用到,了解其中一个就可以了:
- pageContext:获取JSP其他八个内置对象
pageContext对象常用于动态获取虚拟目录。${pageContext.request.contextPath}
:动态获取虚拟目录。
例子:elDemo4.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>el隐式对象</title>
</head>
<body>
<%--获取request对象--%>
${pageContext.request}<br>
<h3>在jsp页面动态获取虚拟目录</h3>
${pageContext.request.contextPath}
</body>
</html>
访问elDemo4.jsp
二.JSTL标准标签库
1.概念
JSTL:JavaServer Pages Tag Library
,JSP标准标签库。
是由Apache组织提供的开源的免费的jsp标签,<标签>。
2.作用
也是用于简化和替换jsp页面上的java代码。
3.使用步骤
- 导入jstl相关jar包
- 在JSP页面中引入标签库:taglib指令:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
- 使用标签
jstl相关jar包下载地址:http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/
拉到下面下最新版
下完解压后进入lib文件夹把两个jar复制到你项目的lib里面并导入项目
4.常用的JSTL标签
4.1 if:相当于java代码的if语句
属性有:
- test :必须属性,接受boolean表达式。
- 如果boolean表达式为true,则显示if标签体内容,如果为false,则不显示标签体内容。
- 一般情况下,test属性值会结合el表达式一起使用。
注意事项:c:if
标签没有else情况,想要else情况,则可以再定义一个c:if标签,实现else逻辑。
例子:jstlDemo1.jsp
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>if标签</title>
</head>
<body>
<c:if test="true">
<h1>我一直真心</h1>
</c:if>
<br>
<%
//判断request域中的一个list集合是否为空,如果不为Null则显示遍历集合
List<String> list = new ArrayList<String>();
list.add("dong");
request.setAttribute("list",list);
request.setAttribute("number",4);
%>
<c:if test="${not empty list}">
我在遍历集合...
</c:if>
<br>
<c:if test="${number % 2 != 0}">
${number}为奇数
</c:if>
<br>
<c:if test="${number % 2 ==0}">
${number}为偶数
</c:if>
</body>
</html>
访问jstlDemo1.jsp
4.2 choose:相当于java代码的switch语句
- 使用
choose
标签声明:相当于switch声明 - 使用
when
标签做判断:相当于case - 使用
otherwise
标签做其他情况的声明:相当于default
例子:jstlDemo2.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>choose标签</title>
</head>
<body>
<%--
完成数字编号对应星期几案例
1.域中存储一数字
2.使用choose标签取出数字 相当于switch声明
3.使用when标签做数字判断 相当于case
4.otherwise标签做其他情况的声明 相当于default
--%>
<%
request.setAttribute("number",2);
%>
<c:choose>
<c:when test="${number == 1}">星期一</c:when>
<c:when test="${number == 2}">星期二</c:when>
<c:when test="${number == 3}">星期三</c:when>
<c:when test="${number == 4}">星期四</c:when>
<c:when test="${number == 5}">星期五</c:when>
<c:when test="${number == 6}">星期六</c:when>
<c:when test="${number == 7}">星期天</c:when>
<c:otherwise>数字输入有误</c:otherwise>
</c:choose>
</body>
</html>
访问jslDemo2.jsp
4.3 foreach:相当于java代码的for语句
1.完成重复的操作
<c:forEach var="i" begin="1" end="10" step="1" varStatus="s">循环体代码</c:forEach>
等价于Java中:
for(int i = 0; i < 10; i ++){循环体代码<}
forEach中的属性:
begin
:开始值end
:结束值var
:临时变量step
:步长varStatus
:循环状态对象,状态对象的属性:index
:容器中元素的索引,从0开始count
:循环次数,从1开始
2.遍历容器(集合等)
Java中遍历List集合:
List<User> list;
for(User user : list){//代码}
等价于forEach标签:
<c:forEach var="value" items="${list}" varStatus="s">代码</c:forEach>
属性介绍:
items
:容器对象var
:容器中元素的临时变量varStatus
:循环状态对象,状态对象的属性:index
:容器中元素的索引,从0开始count
:循环次数,从1开始
例子:jstlDemo3.jsp
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>foreach标签</title>
</head>
<body>
<c:forEach var="i" begin="1" end="10" step="2" varStatus="s">
${i}
索引值:${s.index}
循环次数:${s.count}
<br>
</c:forEach>
<hr>
<h3>遍历集合</h3>
<%
List list = new ArrayList();
list.add("aaa");
list.add("bbb");
list.add("ccc");
request.setAttribute("list",list);
%>
<c:forEach var="value" items="${list}" varStatus="s">
<%--索引 循环次数 值--%>
${s.index} ${s.count} ${value}<br>
</c:forEach>
</body>
</html>
访问jstlDemo3.jsp
5.EL和JSTL标签练习
需求:在request域中有一个存有User对象的List集合。需要使用jstl+el技术将List集合数据展示到jsp页面的表格table中。
代码:
User.java
/**
* 用户的javaBean
*/
public class User {
private String name;
private int age;
private Date birthday;
public User() {
}
public User(String name, int age, Date birthday) {
this.name = name;
this.age = age;
this.birthday = birthday;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
/**
* 逻辑视图,增强生日属性方法
* @return
*/
public String getBirStr(){
if(birthday != null){
//1.格式化日期对象
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//2.返回字符串即可
return sdf.format(birthday);
}else{
return "";
}
}
}
代码实现:jstlTest.jsp
<%@ page import="java.util.List" %>
<%@ page import="com.dong.domain.User" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.Date" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>jstl练习</title>
</head>
<body>
<%
List<User> list = new ArrayList<User>();
list.add(new User("董小帅",21,new Date()));
list.add(new User("张三",23,new Date()));
list.add(new User("李四",25,new Date()));
request.setAttribute("list",list);
%>
<table border="1" width="500">
<%--表格头--%>
<tr>
<th>编号</th>
<th>姓名</th>
<th>年龄</th>
<th>生日</th>
</tr>
<%--数据行--%>
<c:forEach var="user" items="${list}" varStatus="s">
<%--奇数行是绿色,偶数行是橘色--%>
<c:if test="${s.count % 2 != 0}">
<tr bgcolor="#adff2f">
<td>${s.count}</td>
<td>${user.name}</td>
<td>${user.age}</td>
<td>${user.birStr}</td>
</tr>
</c:if>
<c:if test="${s.count % 2 == 0}">
<tr bgcolor="orange">
<td>${s.count}</td>
<td>${user.name}</td>
<td>${user.age}</td>
<td>${user.birStr}</td>
</tr>
</c:if>
</c:forEach>
</table>
</body>
</html>
访问jstlTest.jsp
练习完成,到这对EL表达式和JSTL标签理解应该比较清晰了。
欢迎点赞评论,指出不足,笔者由衷感谢哦!~