1、EL、JSTL html
首先咱们要明白为何要使用EL(Expression Language 表达式语言)、JSTL(JSP Standard Tag Library JSP标准标签库),jsp页面彻底能够用java代码取代他们,也就是说原本是能够没有这两种技术的,可是咱们实际开发中,有一个原则:页面中不该该出现java代码。由于满篇的<% %>和java代码,会使页面极度混乱,到后期根本没法维护。因此这时EL和JSTL就出现了,使用各类标签方式,可让页面不出现一行<% %>。JSTL是sun公司定义的标准,它不依赖于任何一种框架,因此咱们应该重点掌握。 java
一、下面举一些简单的例子说明如何使用EL: 数组
假设在服务器端,设置了request.setAttribute("hello", "Hello World !") ; 服务器
在jsp页面能够有两种方式显示hello中的内容: session
(jsp脚本方式:)<%=request.getAttribute("hello") %> -->打印结果:Hello World ! app
(EL表达式,使用方法,$和{ }:)${hello} -->打印结果:Hello World ! 框架
大括号里面的hello 就是scope中的变量,也就是在服务器端setAttribute中的hello 变量。这样咱们就把<%%>去掉了,并且代码也简化了不少。 jsp
在EL表达式中也有内置对象(也叫隐含对象,隐式对象都是一个意思),和jsp的内置对象基本上对应着,包括:pageScope,requestScope,sessionScope,applicationScope。 函数
那么既然有这么多个对象,上面那个例子中,EL表达式它怎么去找那个hello呢? 它会按范围从小到大的顺序依次查找hello这个变量,上个例子中,咱们把hello放在了request中,那么她首先看pageScope中有这个hello吗,发现没有,那么继续requestScope,找到了,而后就显示其内容。 性能
这时默认的查找方法,咱们还能够明确的告诉它从那个scope中去找,这样能够提升性能,由于明确了嘛,不用一个个挨着去找了,上面的例子咱们能够改成:${ requestScope.hello }
注意的一点:EL和jsp脚本的不一样,假设在服务器端并无设置hello这个变量,那么jsp脚本就会显示null,而是用EL则什么都不显示。
再举一个取对象的例子:
假设定义了一个User类,里面包含了:userName, userAge, group 属性,还有相应的getter ,setter 方法。
还定义了一个Group类,里面包含了:groupName 属性,还有相应的getter, setter 方法。
在服务器端,有以下的代码:
Group group = new Group() ;
group.setGroupName("培训机构") ;
User user = new User() ;
user.setUserName("张三") ;
user.setUserAge(20) ;
user.setGroup(group) ;
request.setAttribute("userObject", user) ;
那么如今要在jsp页面中显示:
姓名:${userObject.userName}
年龄:${userObject.userAge}
所属组:${userObject.group.groupName}
这样就能够用“.”(存取器)导航把相应的信息显示出来了。内部实现的机制依旧是利用反射机制,因此“.”后面的名字要和getter方法上的名字一致。
再举一个例子用于显示Map和数组:
在服务器端,有以下代码
Map map = new HashMap() ;
map.put("key1", "value1") ;
map.put("key2", "value2") ;
String[] strArry = new String[]{"abc", "def", "ghi"}
request.setAttribute("mapvalues", map) ;
request.setAttribute("strarry", strArry) ;
在jsp中显示:
mapvalue.key1: ${ mapvalues.key1 } -->value1
mapvalue.key2: ${ mapvalues.key2 } -->value2
strArry的第二个元素:${ strarry[1]} --> def
对于对象数组,以及List的显示,也是相似的,以下语法:
${ userArray[1].userName }、 ${ userList[2].userName }
对于运算符的支持,如:${ 1+ 2 } --> 打印3
对函数的支持,如:${ empty value1} -->用于判断value1的值是否为空,为空这打印true , 不存在value1 也为true
二、JSTL(只总结核心标签C:)
*<c:out >: 用于输出,自己EL表达式就能够完成输出,为何还要用这个呢,这里面有一个default参数,就是当为空时,能够默认输出default里面的内容,这个EL表达式是不能作到的。 例如:<c:out value="${ abc }" default="不存在abc变量" /> -->若是在服务器端没有setAttribute abc 的值,那么此时就会输出:不存在abc变量 这样的结果。 另一种写法:<c:out value="${abc}" >不存在abc变量</c:out>
若是value中的值不是EL表达式,则直接打印出其中的字符串。
还能够设置out的escapeXml属性:分为true和false,true是默认属性,即把内容原样输出;false是转意输出,好比输出的若是是html代码,则能够按html效果输出。
*<c:if>: 用于条件判断,例如 :<c:if test="${ empty value1 }" var="v">value1为空</c:if> 此句代码的含义是:若是value1为空的话,则打印出 -->value1为空 并把判断结果放在v变量中。
*<c:choose>,<c:when>,<c:otherwise>: 用于条件分支选择,例如:
<c:choose>
<c:when test="${ empty value1 }">
value1为空!
</c:when>
<c:otherwise>
value1不为空!
</c:otherwise>
</c:choose>
能够有多个<c:when>,<c:when>必须在<c:otherwise>的前面
*<c:forEach>: 用于循环打印输出,例如:
<table border="1" width="100%">
<tr>
<td>姓名</td>
<td>年龄</td>
<td>所属组</td>
</tr>
<c:choose>
<c:when test="${ empty userlist}">
<tr>
<td colspan="3">没有符合条件的数据!</td>
</tr>
</c:when>
<c:otherwise>
<c:forEach items="userlist" var="user">
<tr>
<td>${ user.userName}</td>
<td>${ user.userAge}</td>
<td>${ user.group.groupName}</td>
</tr>
</c:forEach>
</c:otherwise>
</c:choose>
</table>
如今有另一个需求,要求偶数行的背景设置为红色,则能够这样写代码:
<table border="1" width="100%">
<tr>
<td>姓名</td>
<td>年龄</td>
<td>所属组</td>
</tr>
<c:choose>
<c:when test="${ empty userlist}">
<tr>
<td colspan="3">没有符合条件的数据!</td>
</tr>
</c:when>
<c:otherwise>
<c:forEach items="userlist" var="user" varStatus="vs">
<c:choose>
<c:when test="${ vs %2 == 0 }">
<tr bgcolor="red">
</c:when>
<c:otherwise>
<tr>
</c:otherwise>
</c:choose>
<td>${ user.userName}</td>
<td>${ user.userAge}</td>
<td>${ user.group.groupName}</td>
</tr>
</c:forEach>
</c:otherwise>
</c:choose>
</table>
也能够在<forEach>标签中加入begin, end, step 参数,表明从第几个开始输出,每次输出的步长为多少,如<c:forEach items="userlist" var="user" begin="2" end="8" step="2">。
还能够用<forEach:>标签循环取得Map中的值。例如:
<c:forEach items="mapvalue" var="v">
${ v.key } = ${ v.value }<br>
</c:forEach>
这样就循环输出Map的内容了。
*<c:forTokens>: 用于按特定的字符分隔的输出。例如:
假设在服务器端有这样的代码:request.setAttribute("strTokens", "1, 2, 3, 4, 5") ;
<c:forTokens items="strTokens" delims="," var="v" >
${ v } <br>
</c:forTokens>
*<c:url>: 用于生成一个url 地址。例如:
<c:url value="http://localhost/sysmgr/add_user.jsp" var="v">
<c:param name="userName" value="Jack" />
<c:param name=“userAge" value=30 />
</c:url>
<a href="${ v }">增长用户</a>
*<c:set>:用于设置一个变量的值,或者变量属性。
补充:<c:forEach>标签用法
<c:foreach>的varStatus属性暂存项的相关状态属性,可由EL表达式引用。继续上例所述。