EL&JSTL
- MVC开发模式
- EL表达式
- JSTL标签
早期只有Servlet
, 只能用response
输出标签数据,非常麻烦.后来有了JSP
,简化了Servlet
开发,如果过度使用JSP
,在JSP
中写大量的java
代码,HTML
表,造成难于维护,难于分工协作.再后来,java
的web
开发,借鉴MVC
开发模式,使得程序的设计更加合理.
MVC开发模式
⭐️M:Model,模型.JavaBean
完成具体的业务操作,如:查询数据库,封装对象
⭐️V:View,视图.JSP
展示数据
⭐️C:Controller,控制器.Servlet
获取用户的输入;调用模型;将数据将给视图进行展示.
优点:耦合性低,方便维护,利于分工合作
缺点:使得项目架构变得复杂
EL表达式
1.概念:Expression Language
表达式语言
2.作用:替换和简化jsp页面中java代码的编写
3.语法: ${表达式}
4.注意:jsp默认支持el表达式,如果要忽略el表达式.1.
设置jsp中page指令中:isEIIgnored="true"
忽略当前jsp页面中所有el表达式;2.
${表达式},忽略当前这个el表达式
5.使用
⭐️运算符:
算术运算符,+
-
* /(div)
%(mod)
比较运算符,>
<
>=
<=
==
!=
逻辑运算符,&&(and)
||(or)
!(not)
空运算符,empty
用于判断字符串,集合,数组对象是否为null并且长度是否为0,
${empty list} 判断字符串,集合,数组对象是否为null或者长度是否为0
${not empty str} 表示判断字符串,集合,数组对象是否不为null 并且长度>0
⭐️获取值:
el只能从域对象中获取值
${域名城.键名}
从指定域中获取指定键的值
域名称 :pageScope–>pageContext
requestScope–> request
sessionScope–> session
application–> application(servletcontext)
举例:在request域中存储了name=张三
获取:&{requestScope.name}
&{键名}
表示依次从最小的域中查找是否有该键对应的值,直到找到为止.
获取对象,List集合,Map集合的值
对象
${域名称.键名称.属性名}
本质上会去调用对象的getter
方法
&{requestScope.u.birstr}
逻辑视图
并没有对应对象,只是为了格式好看
<%
User user=new User();
user.setName("张三");
user.setAge(23);
user.setAttribute("u",user);
%>
${requestScope.u}
${requestScope.u.name}
${u.age}
public String getBirStr(){
if(birthday!=null){
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return sdf.format(birthday);
}else{
return "";
}
}
List集合
${域名称.键名[索引]}
${list}
${list[0]},如果下标越界的话,不会提示错误,客户端无显示
${list[2].name},如果list存储的是对象,可以通过.name获取用户属性
Map集合
${域名称.键名.key名称}
${map.gender}
${域名称.键名[“key名称”]}
${map[“gender”]}
隐式对象:
EL表达式中有11个隐式对象
pageContext
获取jsp其他八个内置对象
${pageContext.request.contextPath}
动态获取虚拟目录
JSTL标签
1.概念: JavaServer Pages Tag Library JSP标准标签库
2.作用:用于简化和替换jsp页面上的java标签
3.使用步骤
1
导入jstl相关jar包
2
引入标签库:taglib指令 <%@ taglib%>
<%@ page contentType="text/html;charest=UTF-8" language="java"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
3
使用标签
4.常用的JSTL标签
if
相当于java代码的if语句
<c:if test="" ></c:if>
test 必须属性,接收Boolean表达式,如果表达式为true,则显示标签体内容,如果为false,则不显示标签体内容
一般情况下,test属性值会结合el表达式一起使用
<c:if test="${number%2 != 0}">
${number}为奇数
</c:if>
<c:if test="${number%2 == 0}">
${number}为偶数
</c:if>
注意: c:if标签没有else情况,想要else情况,则可以再定义一个c:if标签
choose
相当于java代码的choose语句
foreach
相当于java代码的for语句
完成重复操作
begin
开始值
end
结束值
var
临时变量
step
步长
varStatus
循环状态对象,index
容器中元素的索引,从0开始.count
循环计数,从1开始
遍历容器
items
容器对象
var
容器中元素的临时变量
varStatus
循环状态对象,index
容器中元素的索引,从0开始.count
循环计数,从1开始
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<title>test</title>
</head>
<body>
<%
ArrayList list = new ArrayList();
list.add(new User("张三",24,new Date()));
list.add(new User("李四",23,new Date()));
list.add(new User("王五",21,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}" var="user" varStatus="s">
<tr>
<td>${s.count}</td>
<td>${user.name}</td>
<td>${user.age}</td>
<td>${user.date}</td>
</tr>
</c:forEach>
</table>
</body>
</html>