JSTL使用说明
今天讲讲JSTL基础使用(非原理,原理自己去看源代码,这就是JAVA开源的好处,嘿嘿)
JSTL分为标签库和EL表达式两部分。
要使用JSTL,必须导入标签库
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c"%>
重点讲下EL表达式和常用标签
<c:out>
<c:set>
<c:forEach>
<c:if>
<c:choose>
EL表达式
用${}表示
${user}
和session.getAttribute("user")一样,这里的不只是session,默认查找顺序page,request.session,application。就是说首先在page范围内查找有没有user,如果没有就到request中查找,以此类推。如果都没有,就为空.当然你也可以指定查找范围,比如${sessionScope.user}就是在session范围内查找。
属性范围在EL中的名称
Page对应PageScope
Request对应RequestScope
Session对应SessionScope
Application对应ApplicationScope
如果获取的对象是个JavaBean,可以用“.”或者“[]”来确定bean的属性。
比如有个userBean
Public class UserBean {
Private int uid;
Private String uname;
Public void setUname(String uname){
This.uname=uname;
}
.........
.........
.........
}
Session中存放了一个UserBean的实例user,我们要去的uname属性,可以这样
${sessionScope.user["uname"]}或者${sessionScope.user.uname}(可以省略sessionScope,就会按照返回依次查找)
如果对象是个Map之类的,和上面一样。获取key即可。
map.put("uname","uname");
${map.uname}
如果对象是个List直接用下标就行
list.add("hello1");
list.add("hello2");
${list[0]}
就等于java代码中的list.get(0)
<c:out>标签
<c:out>标签是页面输出标签
<c:out value="" default="">
Vaue属性是要输出的值(可以是EL)
Default是当value为null的时候输出的内容
<c:set>标签
<c:set>标签是设置变量或者属性的值
<c:out value="" var="" target="" property="" scope="">
Value设置的值
Var是设置的变量
Target是个javaBean
Property是要设置的属性名(target和property共存,但是使用target的时候就不能使用var,可以理解为c:set标签有两种版本或者两种使用方式)
Scope范围
Var版本
<c:set var="i" value="1"></c:set>
<c:set var="str" value="hello"></c:set>
(如过变量在返回内没有,会创建一个新对象)
用EL引用的时候就是${i}、${str},显示1、hello
Target版本
比如前面的UserBean,现在user是UserBean的实例对象,且uname等于“admin”,我可以用set来修改
<c:set target="${user}" property="uname" value="supermanager"></c:set>
现在再看看uname的值${user["uname"]},显示的不是“admin”而是“supermanager”
<c:forEach>
<c:forEach>标签就像是JAVA中的for循环
<c:forEach items="" var="" begin="" step="" end="">
Items循环体(必须)
Var存放循环的变量,
Begin开始位置
End结束位置
Step步长
如果用java中的for来比较
List<String> strs=new ArrayList<String>();
<c:forEach items="strs" var="str" begin="5" step="2" end="14">
<c:out value="${str}"></c:out>
<c:forEach>
可以理解问下面的JAVA代码
Int i=0;
For(i=5;i<=14;i+=2){
String str=strs.get(i);
Out.print(str);
}
问题:现有如下信息,用JSTL显示出来?
Map<String, Object> map1 = new HashMap<String, Object>();
map1.put("uname", "admin");
map1.put("upwd", "adminpwd");
Map<String, Object> map2 = new HashMap<String, Object>();
map2.put("uname", "admin2");
map2.put("upwd", "adminpwd2");
List<Map> list = new ArrayList<Map>();
list.add(map1);
list.add(map2);
解题:
<c:forEach items="${list}" var="maps">
<c:forEach items="${maps}" var="map">
<c:out value="key:${map['key']} value:${map['value']}"></c:out><br />
</c:forEach>
<br />
</c:forEach>
显示截图
If标签
和java的if差不多。
Test表达死,var存放表达式的值
<c:set vat="t" value="admin"></c:set>
<c:if test="${t == 'chenjin2'}" var="v">
<c:out value="${v}"></c:out>
</c:if>
页面显示false
<c:choose>标签
上面的if只能做一般的判断,不能像JAVA中的if(){}else if{}else{}这样,现在就可以用choose标签了。
<c:set var="i" value="14"></c:set>
<c:choose>
<c:when test="${i<5}">
i小于5
</c:when>
<c:when test="${i<10}">
i小于10
</c:when>
<c:otherwise>
i大于等于10
</c:otherwise>
</c:choose>
可以理解为choose标签说明里里面的是多重判断
When就等于java中的else if
Otherwise 就等于java中多重判断的最后的那个else