el和jstl
1、什么是el以及特性是什么?
1)el:即为表达式语言。
2)格式:${ ...}
3)作用:用来获取jsp四大作用域对象中的属性值并显示[赋值]在jsp的节点上。它实质上就是 <%= 表达式 %> 简洁式。另外, 它还可以获取 实 体内容。同时,可以实现表达式的计算与判断。
底层利用的反射机制:
A)可以利用如下方式直接进行属性的访问,
格式:对象.属性。例如有一个user对象。取里面的age属性。
就可以表达为${user.age}; 可以进行判断后自动根据真假取值:${dog.sex? ’公’:’母’}
注意:age等书写的方式一定的第一个单词的首字母小写然后遵循驼峰型格式。
B)获取容器中的值使用容器.key获取其中的value。
C)从JSP的四大作用域对象中获取属性的值。
pageContext ----> pageScope ${pageScope.属性名} 或 ${属性名}
request ----> requestScope ${requestScope.属性名} 或 ${属性名}
session ----> sessionScope ${sessionScope.属性名} 或 ${属性名}
application ----> applicationScope ${applicationScope.属性名} 或 ${属性名}
注意: 当不写 XXXScope 前缀时,而直接 ${属性名} 去获取四大作用域中的值,则会从小到大去找,找到,则结束。即作用域越小优先级越高;
D)从JSP的请求实体中获取参数的值:
param ----> ${param.参数名}
paramValues ---> ${paramValues.参数名[索引号] } 或 ${paramValues.参数名['索引号']
E)EL表达式中可以进行运算。
算术运算, 关系运算, 逻辑运算:
关系运算 ${ "5" > 3 }得到结果为true;
注意: 在运算前,若数据类型不一致,则会发生类型的自动转换。 如: ${'123' + 100};
注意: EL 表达式中不能进行字符串的连接运算。 ${"Beijing" + 2008} //报错
4)特有的运算符。
A) . 和 [] ;//此处.为成员运算符;[]为偏移运算符号;
EL为了获取实体内容。为此,提供了专门的关键字 param 或 paramValues
例如: 早期, 获取请求时的实体内容: <%= request.getParameter("uname") %>
现在, 获取请求时的实体内容: ${param.uname}
早期, 获取请求时的同名不同值的实体内容中:
<%
String[] favs = request.getParameterValues("fav");
for(int i = 0; i < favs.length; i++ ){
out.print( favs[i] + " ");
}
%>
现在, 获取请求时的同名不同值的实体内容中
[其中第一个参数是]: ${paramValues.fav[0] }
[第二个参数是: ] ${paramValues.fav['1'] }
b) empty 判断运算符
当属性值为空值,EL中如何判断?
案例如下:
<%
//String name = null;
String name = "";
request.setAttribute("name", name);
Map<String,Integer> dogs = new HashMap<String,Integer>();
session.setAttribute("dogs", dogs);
Set<String> cats = new TreeSet<String>();
List<String> cars = new LinkedList<String>();
pageContext.setAttribute("cats", cats);
pageContext.setAttribute("cars", cars);
%>
在EL表达式中,对属性值进行空值判断
例如: 对request对象的name属性值进行判断,其结果为: ${ empty requestScope.name}
例如: 对session对象的dogs属性值进行判断,其结果为: ${ empty sessionScope.dogs } ----- ${empty dogs }
例如: 对pageContext对象的cats属性值进行判断,其结果为: ${ empty cats }
例如: 对pageContext对象的cars属性值进行判断,其结果为: ${ empty cars }
特别注意: EL表达式中的变量必须是 四大作用域的属性或请求实体中的参数。
2 、 什么是JSTL? ----jsp standard tag lib;
它是 JSP 的标准标签库。
它主要是将 java的流程控制语句简化或优化成一个 JSP页面上可直接使用的标签。
3、JSTL的基本格式?
格式:
<c:标签>
输出的信息
</c:标签>
注意: 在使用 JSTL标签之前,必须在JSP页面使用 taglib 指令将用到的标签库导入过来。
4、导入标签库的taglib指令,其使用方式如下:
<%@ taglib prefix="前缀" uri="标签库的地址及库名" %> 。。。//一般前缀使用字母c。
5、常用的标签库及其标签?
a) http://java.sun.com/jstl/core_rt 核心标签库
---> [ <c:if> | <c:choose><c:when><c:otherwise> | <c:forEach> ]
另外了解: <c:url> | <c:param> | <c:import> | <c:redirect>
而 请求转发:<jsp:forward page=” xxx.jsp”> </jsp:forward> 形式称之为JSP的页面元素或页面标签,它是JSP内置的。
重定向<c:redirect url=”xxx.jsp ”></c:redirect>
b) http://java.sun.com/jstl/fmt_rt 格式化标签 --->[ <fmt:formatDate> | <fmt:formatNumber> ]
6、<c:if> 标签的应用
a) 形式一
<c:if test="${条件表达式}" var="存放结果的变量">
结果表现体
</c:if>
b) 形式二
<c:if test="${条件表达式 }" var="存放结果的变量" scope="作用域对象">
结果表现体
</c:if>
注意: 在JSP的 jstl标签库中 <c:if>只是单向的,没有双向的。 那问: 如何实现双向的if语句功能?
例如:
<c:if test=”${dog.sex==true}”> 公</c:if>
<c:if test=”${dog.sex==false}”> 母</c:if>
7、<c:choose><c:when><c:otherwise> 标签的应用
<c:choose>
<c:when test="${条件表达式}"> 结果表现体 </c:when>
<c:when test="${条件表达式}"> 结果表现体 </c:when>
......
<c:otherwise> 结果表现体 </c:otherwise>
</c:choose>
8、<c:forEach>标签的应用形式
a) 形式一
<c:forEach begin="起始值" end="终止值" var="存放每次循环的结果变量">
${表示式 }
</c:forEach>
注意: 它相当于java中的标准for循环语句 for(int i=1; i<=10; i++) { ... }
b) 形式二
<c:forEach begin="起始值" end="终止值" var="存放每次循环的结果变量" step="增量" >
${表示式 }
</c:forEach>
注意: 它相当于java中的标准for循环语句 for(int i=1; i<=10; i+=增量) { ... }
c) 形式三
<c:forEach items="${容器}" var="存放每次循环的值" varStatus="状态变量">
结果表现体
</c:forEach>
注意: 状态变量中有一个 index 属性,表示每种状态的索引号。
注意: 这种形式最常用。
例如: 若有 List<Person> ps = new ArrayList<Person>();
则对 List 的 ps 容器进行遍历如下:<br/>
<c:forEach items="${ps}" var="person" varStatus="id">
${id.index + 1} ---- ${person.name} --- ${person.sex ? "男":"女" } --- ${person.age } <br/>
</c:forEach>
9、<fmt:formatDate> 和 <fmt:formatNumber>格式化标签的应用
一、日期的格式化:
1) 固有格式:
<fmt:formatDate value="${d1 }" type="date" dateStyle="short"/> <br/>
其中 type="date" 时, 有: dateStyle="short"/"long"/"full"
2) 自定义格式
<fmt:formatDate value="${d1 }" pattern="yyyy-MM-dd"/> <br/>
<fmt:formatDate value="${d1 }" pattern="||^_^yyyy年MM月dd日^_^||"/> <br/>
二、时间的格式化:
1) 固有格式:
<fmt:formatDate value="${d1 }" type="time" dateStyle="short"/> <br/>
其中 type="time" 时, 有: dateStyle="short"/"long"/"full"
2) 自定义格式:
<fmt:formatDate value="${d1 }" pattern="HH:mm:ss"/> <br/>
<fmt:formatDate value="${d1 }" pattern="北京时间>>>HH时mm分ss秒"/> <br/>
三、格式化数值型数据
<fmt:formatNumber value="${data }" pattern="########.##" /> <br/>
<fmt:formatNumber value="${data }" pattern="##,###,###.##" /> <br/>
<fmt:formatNumber value="${data }" pattern="##,###,###" /> <br/>
<fmt:formatNumber value="${data }" pattern="##,###,###.0" /> <br/>
<fmt:formatNumber value="${data }" pattern="00,000,000.0" /> <br/>
<fmt:formatNumber value="${data }" pattern="$00,000,000.0" /> <br/>
<fmt:formatNumber value="${data }" pattern="¥00,000,000.0" />
10.Jsp的EL与JSTL对两种容器进行操作:
1)存放对象(javaBean)的容器
在<c:forEach>中可以直接通过EL访问属性
Obj.getXXX()--->${obj.属性}
2)存放Map容器的List容器
在<c:forEach>中可以直接通过EL去访问属性;
Map.get(key)------>${map.key}