javaWeb之JSTL和EL表达式
原生的jsp中嵌套java代码的写法,使得整个jsp页面看着比较混乱,牵扯到有逻辑判断的时候,大多数情况都需要进行拼接,拼接是比较麻烦的且容易出现错误,所以就有了jstl标签库和el表达式。
el表达式
el表达式:通过一种特定的书写格式,能够简化小脚本中的代码量
<%
Object obj = session.getAttribute("namekey");
String name = (String)obj;
out.println("name="+name);
Object empObj = session.getAttribute("empkey");
Emp emp = (Emp)empObj;
String ename = emp.getEname();
String sex = emp.getSex();
out.println(ename+"--"+sex);
%>
<hr>
name:${namekey }
<!-- 该语法底层其实还是通过调用getter的方法来实现 -->
ename:${empkey.ename },
sex:${empkey.sex }
EL 存取变量数据的方法很简单,例如:${username}。它的意思是取出某一范围中名称为username的变量。
因为我们并没有指定哪一个范围的username,所以它的默认值会先从Page 范围找,假如找不到,再依序到Request、Session、Application范围。
pageContext–>request–>session–>application
假如途中找到username,就直接回传,不再继续找下去,
例如:${sessionScope.username}是取出Session范围的username 变量。这种写法是不是比之前JSP 的写法:
String username =(String) session.getAttribute(“username”);容易、简洁许多
但是假如全部的范围都没有找到时,就回传null,当然EL表达式还会做出优化,页面上显示空白,而不是打印输出NULL。
指定作用域获取数据:
- ${pageScope.键名} 指明获取pageContext作用域中的数据
- ${requestScope.键名} 指明获取request作用域中的数据
- ${sessionScope.键名} 指明获取session作用域中的数据
- ${applicationScope.键名} 指明获取application作用域中的数据
el表达式中的运算符
关系运算符 | 说明 |
---|---|
== 或 eq | 判断是否相等 |
gt 或 > | 大于 |
< 或 lt | 小于 |
!= 或 ne | 不等于 |
<= 或 le | 小于等于 |
>= 或 ge | 大于等于 |
empty | 判断是否为null |
not empty | 不为null |
${ A ? B : C} | 条件运算符 |
如果需要在支持表达式语言的页面中正常输出“ ” 符 号 , 则 在 “ ”符号,则在“ ”符号,则在“”符号前加转义字符“\”,否则系统以为“$”是表达式语言的特殊标记。
缺点:
el表达式是不能做逻辑运算的,如果需要做逻辑运算,那就需要使用jstl标签库
JSTL标签库
为了简化jsp的代码编写。替换<%%>这种写法。一般与EL表达式配合
流程:
1、导入jar包
需要导入两个jar包:jstl.jar(标签库的jar)、standard(标签库的语言规范jar).jar
2、引入标签库
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
JSTL常用标签:
-
<c:out> 用于在JSP中显示数据,就像<%= … >
<%=request.getAttribute("str") %>--${str}--<c:out value="${str}" default="我是out标签"></c:out> <br />
属性 描述 是否必要 默认值 value 要输出的内容 是 无 default 输出的默认值 否 主体中的内容 escapeXml 是否忽略XML特殊字符 否 true -
<c:set> </c:set> 用于保存数据
声明了一个对象name,对象的值是zhangsan,存储到了page(默认)。指定是session
<c:set var =“name” value=“zhangsan” scope=“session”></c:set>
取出:${sessionScope.name}
属性 描述 是否必要 默认值 value 要存储的值 否 主体的内容 target 要修改的属性所属的对象 否 无 property 要修改的属性 否 无 var 存储信息的变量 否 无 scope var属性的作用域 否 Page 如果指定了target属性,那么property属性也需要被指定。
-
<c:if></c:if>
1).判断test里面的表达式是否满足,如果满足,就执行c:if标签中的输出。c:if 没有else
<c:set var=“age” value=“18”></c:set>
<c:if test="${age > 25 }">
年龄大于25岁
</c:if>
2).定义一个变量名flag,去接收前面表达式的值。然后存在session域中
<c:if test ="${age > 25}" var = “flag” scope=“session”>
年龄大于25岁
</c:if>
属性 描述 是否必要 默认值 test 条件 是 无 var 用于存储条件结果的变量 否 无 scope var属性的作用域 否 page
-
<c:forEach></c:forEach>
基础迭代标签,接受多种集合类型
<% String[] arr = {"Joke","Jack","Haha","heihei"}; //将数组存储到域中 pageContext.setAttribute("arr", arr); List<String> list = new ArrayList(); list.add("name"); list.add("age"); list.add("sex"); pageContext.setAttribute("list", list); Map<String,Object> map = new HashMap(); map.put("name","haha"); map.put("age",20); pageContext.setAttribute("map", map); %> <!-- items:指的是要遍历的对象 begin:起始下标 end:结束下标 step:阶梯,每次间隔几个数 1:i++ 2:i+2 默认是1 var:每次遍历的对象 arr[i] varStatus:其中存储的是下标 --> <c:forEach items="${arr }" step="1" var="str" varStatus="status"> ${str },${status.index } </c:forEach> <hr> <c:forEach items="${list }" var="key" varStatus="status"> ${key },${status.index } </c:forEach> <hr> <c:forEach items="${map }" var="user" varStatus="status"> ${user.key },${user.value },${status.index } </c:forEach> <hr> <c:forEach begin="0" end="9" var="index"> ${index } </c:forEach>
属性 描述 是否必要 默认值 items 要被循环的信息 否 无 begin 开始的元素(0=第一个元素,1=第二个元素) 否 0 end 最后一个元素(0=第一个元素,1=第二个元素) 否 Last element step 每一次迭代的步长 否 1 var 代表当前条目的变量名称 否 无 varStatus 代表循环状态的变量名称 否 无 -
<c:remove>
移除<%-- <% pageContext.removeAttribute("hello",4); //request.removeAttribute("hello"); //session.removeAttribute("hello"); %> --%> <c:remove var="hello" scope="request"/> ${hello} <br />
属性 描述 是否必要 默认值 var 要移除的变量名称 是 无 scope 变量所属的作用域 否 所有作用域
JSTL和EL区别
JSTL(JSP Standard Tag Library,JSP标准标签库)是一个bai不断完善的开放源代码的duJSP标签库,是由apache的jakarta小组来维护的。zhiJSTL只能运行在支持JSP1.2和Servlet2.3规范的容器上dao,如tomcat 4.x。在JSP 2.0中也是作为标准支持的。
JSTL(JavaServerPages Standard Tag Library)JSP标准标签库
JSTL标准标签库包括核心标签库和SQL标签库,核心标签库常用的是if和forEach
EL即Expression Language(表达式语言)
EL的语法:${ EL exprission }
${ bean.name } 或 ${ bean[‘name’] }
说白了,EL是用来显示数据的,功能跟<%=表达式%> 一样,EL是不需要引入什么东西的