EL&JSTL
EL表达式
概述
- 概念:expression language 表达式语言
- 作用:替换和简化jsp页面中java代码的编写
- 语法:
${表达式}
- 注意:
- jsp是默认使用el表达式的。如果要忽略el表达式:
- 设置jsp中page指令中:
isElIgnored="true"
忽略当前jsp页面中所有el表达式 - ${表达式}:忽略当前这个el表达式,转为字符串形式输出
- 设置jsp中page指令中:
- jsp是默认使用el表达式的。如果要忽略el表达式:
使用
运算
- 运算符
- 算数运算符:
+
-
*
/(div)
%(mod)
- 比较运算符:
<
>
==
<=
>=
!=
- 逻辑运算符:
&&(and)
||(or)
!(not)
- 空运算符:empty
- 功能:用于判断字符串、集合、数组对象是否为null或者长度为0
${empty list}
:判断字符串、集合、数组对象是否为null或者长度为0,是返回true,否返回false${not empty str}
:表示字符串、集合、数组对象不为null并且长度>0
- 算数运算符:
获取值
-
el表达式只能从域对象中获取值
-
语法:
-
${域名称.键名}
:从指定域中获取指定键的值- 域名称:范围从小到大
- pageScope --> pageContext
- requestScope --> request
- sessionScope --> session
- applicationScope --> application(ServletContext)
- 举例:在request域中存储了name=张三
- 获取:${requestScope.name}
- 域名称:范围从小到大
-
${键名}
:表示依次从最小的域中查找是否有该键对应的值,直到找到为止 -
获取对象、List集合、Map集合的值
-
对象:
${域名称.键名.属性名}
- 本质上会去调用对象的getter方法
import java.text.SimpleDateFormat; import java.util.Date; /** * @author zhuxianglong * @version 1.0 * @date 2021/8/30 20:10 */ public class User { private String name; private int age; private Date birthday; /** * 逻辑视图 * @return */ public String getBirStr(){ //1.格式化日期对象 if (birthday != null){ SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); //2.返回字符串 return sdf.format(birthday); }else { return ""; } } public User() { } public User(String name, int age, Date birthday) { this.name = name; this.age = age; this.birthday = birthday; } @Override public String toString() { return "User{" + "name='" + name + '\'' + ", age=" + age + ", 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; } }
<%@ page import="net.seehope.domain.User" %> <%@ page import="java.util.Date" %><%-- Created by IntelliJ IDEA. User: zhuxianglong Date: 2021/8/30 Time: 20:11 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>el获取数据</title> </head> <body> <% User user = new User(); user.setName("张三"); user.setAge(23); user.setBirthday(new Date()); request.setAttribute("u",user); %> <h3>el获取对象中的值</h3> ${requestScope.u}<br> <%-- 通过的是对象的属性来获取 setter或getter方法,去掉set或get,再讲剩余部分首字母变为小写 setName-->Name-->name --%> ${requestScope.u.name}<br> ${u.age}<br> ${u.birthday}<br> ${u.birthday.month}<br> ${u.birStr}<br> </body> </html>
-
List集合:
${域名城.键名[索引]}
- 索引越界不会报错,默认空字符串
-
Map集合:
${域名城.键名.key名称}
${域名城.键名.["key名称"]}
-
-
隐式对象:
- el表达式中有11个隐式对象
- pageContext:
- 获取jsp其他八个内置对象
${pageContext.request.contextPath}
:动态获取虚拟目录
- 获取jsp其他八个内置对象
JSTL标签
概述
- 概念:JavaServer Pages Tag Library JSP标准标签库
- 是由Apache组织提供的开源的免费的jsp标签
- 作用:用于简化和替换jsp页面上的java代码
使用步骤
- 导入jstl相关jar包
- 引入标签库:taglib指令
<%@ taglib %>
- 使用标签
常用的JSTL标签
-
if:相当于java代码的if语句、
- 属性:
- test 必须属性,接受boolean表达式
- 如果表达式为true,则显示标签体内容,如果为false,则不表示标签体内容
- 一般情况下,test属性值会结合el表达式一起使用
- test 必须属性,接受boolean表达式
- 注意:c:if标签没有else情况,想要else则可以再定义c:if标签
<%@ page import="java.util.ArrayList" %> <%@ page import="java.util.List" %><%-- Created by IntelliJ IDEA. User: zhuxianglong Date: 2021/8/30 Time: 20:47 To change this template use File | Settings | File Templates. --%> <%@ 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集合是否为空,如果不为空则显示遍历集合 List list = new ArrayList(); list.add("aaa"); request.setAttribute("list",list); request.setAttribute("number",3); %> <c:if test="${not empty list}"> <h4>遍历集合...</h4> </c:if> <br> <c:if test="${number mod 2 != 0}"> ${number}为奇数 </c:if> <br> <c:if test="${number mod 2 == 0}"> ${number}为偶数 </c:if> </body> </html>
- 属性:
-
choose:相当于java代码的swtich语句
<%-- Created by IntelliJ IDEA. User: zhuxianglong Date: 2021/8/30 Time: 21:05 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <title>choose标签</title> </head> <body> <%-- 完成数字编号对应星期几案例: 1. 域中存储一数字 2. 使用choose标签取出数字,相当于switch声明 3. 使用when标签做数字判断,相当于case 4. otherwise标签做其他情况的说明,相当于default --%> <% request.setAttribute("number",3); %> <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>
-
foreach:相当于java代码的for语句
-
完成重复的操作
for(int i = 0; i < 10; i++){ }
- 属性:
- begin:开始值
- end:结束值
- var:临时变量
- step:步长
- varStatus:循环状态对象
- index:容器中元素的索引从0开始
- count:循环次数从1开始
- 属性:
-
遍历容器
List<User> list; for(User user : list){ }
- 属性:
- items:容器对象
- var:容器中元素的临时变量
- varStatus:循环状态对象
- index:容器中元素的索引从0开始
- count:循环次数从1开始
- 属性:
<%@ page import="java.util.ArrayList" %> <%@ page import="java.util.List" %><%-- Created by IntelliJ IDEA. User: zhuxianglong Date: 2021/8/30 Time: 21:11 To change this template use File | Settings | File Templates. --%> <%@ 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 begin="1" end="10" var="i" step="1" varStatus="s"> ${i} <h3>${s.index}</h3><h4> ${s.count}</h4><br> </c:forEach> <hr> <% List list = new ArrayList(); list.add("aaa"); list.add("bbb"); list.add("ccc"); request.setAttribute("list",list); %> <c:forEach items="${list}" var="str" varStatus="s">\ ${s.index} ${s.count} ${str}<br> </c:forEach> </body> </html>
-
练习
-
需求:在request域中有一个存有User对象的List集合,需要使用jstl和el将list集合数据展示到jsp页面的表格table
-
代码实现:
<%@ page import="java.util.ArrayList" %> <%@ page import="java.util.List" %> <%@ page import="java.util.Date" %> <%@ page import="net.seehope.domain.User" %><%-- Created by IntelliJ IDEA. User: zhuxianglong Date: 2021/8/30 Time: 21:25 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <title>Title</title> </head> <body> <% List list = new ArrayList(); list.add(new User("张三",23,new Date()); list.add(new User("李四",38,new Date()); list.add(new User("王五",15,new Date()); request.setAttribute("list",list); %> <table border="1" width="500" align="center"> <tr> <th>编号</th> <th>姓名</th> <th>年龄</th> <th>生日</th> </tr> <%--数据行--%> <c:forEach items="${list}" varStatus="s" var="user"> <c:if test="${s.count % 2 == 0}"> <tr bgcolor="blue"> <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="red"> <td>${s.count}</td> <td>${user.name}</td> <td>${user.age}</td> <td>${user.birStr}</td> </tr> </c:if> </c:forEach> </table> </body> </html>
三层架构:软件设计架构
- 界面层(表示层):用户看的界面。用户可以通过界面上的组件和服务器进行交互
- 业务逻辑层:处理业务逻辑的。
- 数据访问层:操作数据存储文件。