目录
- 回顾
- 使用EL表达式和JSTL表达式 的 前提
- EL表达式 是什么
- JSTL表达式是什么
- 为什么要使用表达式
- EL表达式和JSTL表达式 区别
- EL表达式原理
- EL获取对象属性的原理
- EL和JSTL常用标签(用案例进行学习)
回顾
利用estl语句进行计算一个班的男生和女生的人数。思路是,在jsp页面定义一个变量,之后判断遍历出来的学生的性别,如果是男,变量加一
以上是之前我们使用过的这些表达式,现在开始系统的学习
使用EL表达式和JSTL表达式 的 前提
后端返回到jsp页面的时候,需要使用JSTL/EL的前提条件是:xxx.setAttribute(); 也就是设置了数据,这个数据前端需要拿过来使用
EL表达式 是什么
E L(Expression Language)目的:为了JSP写起来更简单。灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法。
使用JSTL/EL的前提条件是:xxx.setAttribute(); 这句话的意思是,只有后端在返回给jsp页面的时候,给设置了值,jsp页面要取出值的时候,我们就可以在jsp页面获取到后端传到前段的值
总结: 就是通过这个表达式获取到后端传到前段的数据
JSTL表达式是什么
JSTL(JSP Standard Tag Library,JSP标准标签库)是一个不断完善的开源的JSP标签库,是由apache的jakarta小组来维护的。根据JSTL标签所提供的功能,可以将其分为5个类别。 核心标签 格式化标签 SQL 标签 XML 标签 JSTL 函数 使用JSTL/EL的前提条件是:xxx.setAttribute();
这些标签是人家定义的,我们只需要在jsp页面引入,使用人家的标签,我们就可以在jsp页面简单的操作后端传到前段的数据。
记住: 这个jstl有5个类型的标签库
引入的每一个标签库,里面都有自己的标签,我们学这个表达式,就是学习如何使用这些标签。
总结: 就是通过这个表达式,进行操作这个el表达式获取到的数据,比如遍历数据
为什么要使用表达式
如果我们不使用这个表达式,之前我们自己写的jsp页面,要获取后端传到前段的数据,需要自己写小脚本。就是这样
用以上的方式获取到数据,但是这样java代码和HTML代码就混在一起了,为了解决这个问题,就有了一个新的技术,就是这个表达式,只需要引入之后,使用人家规定的表达式,就可以轻松的获取到后端传到前段的数据。
总之: 就是使用表达式代替之前写小脚本
EL表达式和JSTL表达式 区别
EL表达式 是获取后端传回jsp页面的数据
jsp页面的以下这种:
JSTL表达式 是操作传回的数据,他就是一个标签库,根据这些标签,进行操作,比如遍历
这种标签的就是JSTL表达式
EL表达式原理
EL的四个范围和JSP的四个范围对应,分别为pageContextScope、requestScope、sessionScope,applicationScope。 也就是后端传回来的数据,jsp页面会使用这4个接收到,只要在jsp页面从这4个里面就可以获取到数据
jsp页面如果不写这4个作用域,直接获取
这样也是可以获取到的,底层会把4个里面都找一遍。
EL获取对象属性的原理
底层采用了反射机制 调用的是相应属性的getter方法,而不是属性
代码语言:javascript复制request.setAttribute(“stu”, stu2);
${requestScope.stu.name }
//获取对象
Object value =request.getAttribute(“stu”);
//获取对象对应的类
Class clazz = value.getClass();
//通过属性获取属性对应的操作方法
Method method = clazz.getMethod("get" "N" "ame");
//开始执行
Object returnValue = method.invoke(value);
EL和JSTL常用标签(用案例进行学习)
我们说了,学习JSTL表达式,就是学习人家定义的标签咋使用,现在我们用案例进行学习标签,强化学习。
第一步:写一个实体类
第二步: 写一个jsp页面,将实体类导入,将jstl 标签库也导入
第三步,在jsp页面准备数据, 在小脚本里面创建对象,准备数据
代码语言:javascript复制<body>
<%
//1.准备数据
int n=70;//基本类型
double avgScore = 57.45678;//基本类型
//Student stu = null;
Student stu = new Student();//引用类型
stu.setId(1);
stu.setName("张晓红");
stu.setBirth(Date.valueOf("1999-12-12"));
String [] strs = {"Java","Oracle","JSP","HTML"};//数组
String courses="Java,Oracle,JSP,HTML,Servlet";//特殊的字符串
String courses2="Java#Oracle#JSP#HTML#Servlet";//特殊的字符串
String str = null;
String str3 = "";
List list = new ArrayList();//分配空间,没有元素
list.add(90);
list.add(80);
List list2 =null;//没有分配空间
List list3 =new ArrayList();//分配空间,没有元素 size()==0
Map<String,String> map = new HashMap<String,String>();//Map
map.put("cn", "China");
map.put("fr", "France");
//setAttribute
request.setAttribute("r1",n);
request.setAttribute("avgScore",avgScore);
request.setAttribute("stu",stu);
request.setAttribute("strs",strs);
request.setAttribute("courses",courses);
request.setAttribute("courses2",courses2);
request.setAttribute("now",new java.util.Date());
request.setAttribute("list", list);
request.setAttribute("list2", list2);
request.setAttribute("list3", list3);
request.setAttribute("map", map);
request.setAttribute("str", str);
request.setAttribute("str3", str3);
//2.使用JSTL和EL输出
%>
</body>
第四步: 因为已经在小脚本里面 ,根据 request.setAttribute(“map”, map);这个语句设置了值,相当于后端在request对象里面设置了值,在jsp页面要获取,那么如何获取
后端在request里面获取了对象,前端用requestScope这就可以获取数据
代码语言:javascript复制<h2>EL和JSTL表达式</h2>
n:${requestScope.r1} <br/>
分数:${requestScope.avgScore}<br/>
分数:<fmt:formatNumber value="${requestScope.avgScore}" maxFractionDigits="3"></fmt:formatNumber><br/> 这个是进行格式化的操作,maxFractionDigits属性是设置保留几位小数
获取到对象里面的东西
姓名:${stu.name} <br/>
生日:${stu.birth}<br/>
生日:<fmt:formatDate value="${stu.birth}" pattern="yyyy年MM月dd日"></fmt:formatDate><br/> 对生日进行格式化
<hr/>
遍历strs这个数组
<c:forEach items="${strs}" var="st">
${st}--->
</c:forEach>
<hr/>
<c:forEach items="${courses}" var="cou">
${cou}--->
</c:forEach>
<hr/>
<c:forEach items="${courses2}" var="cou2">
${cou2}-->
</c:forEach>
<hr/>
"Java#Oracle#JSP#HTML#Servlet";//特殊的字符串
<c:forTokens items="${courses2}" delims="#" var="cou">
${cou}--->
</c:forTokens>
<hr/>
<c:forEach items="${list}" var="li">
${li}-->
</c:forEach>
<hr/>
获取键值对
<c:forEach items="${map}" var="m">
${m.key}-${m.value}
</c:forEach>
<hr/>
每页显示
<select>
<c:forEach begin="10" end="50" step="10" var="size">
<option>${size}</option>
</c:forEach>
</select>
条记录
判断st是否为空 返回boolean值
${empty st} --> 等价于 (${st==null}||${st==''})
${not empty st}