jsp standard tag libaray,即jsp标准标签库。
jstl是由Apache的Jakarta小组开发的,属于开放源代码的标签库,jstl至少要运行在支持jsp1.2和Servlet2.3规范的容器上。
我们为什么需要JSTL标签呢?
(1)在应用程序服务器之间提供统一的接口,从而提供了web应用在不同服务器的移植
(2)简化jsp与web应用程序的开发
(3)减少jsp中java片段的代码,可以达到在jsp页面中没有任何java代码,代码更加简洁
(4)提高jsp开发速度,缩短开发周期
在这里要知道的是,使用JSTL标签,必须先在项目中引入它的标签库,在MyEclipse中新建项目时它默认会直接引入JSTL标签库,如下图,我引入的是JSTL 1.2.1版本。
jstl的核心标签,也就是c标签,它是最常用的jstl标签。在jsp文件中使用核心标签,需要在文件开头使用tablib
指令引入核心标签库,语法如下:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
之后就可以使用c标签了。
在jstl中,最常用的核心标签有:<c:out>
,<c:set>
,<c:remove>
和<c:catch>
<c:out>
标签<c:out>
用于把计算的结果输出到JspWriter对象。
(1)简单地输出一个’Hello,World!’.
<c:out value="Hello,World!"></c:out>
这句话就相当于在jsp写如下java片段:
<%
out.println("Hello,World!");
%>
(2)输出request域对象中的值
假设我们在request域对象中放入下述属性:
<%
request.setAttribute("abc","request");
%>
这时我们可以这样输出:
<c:out value="${abc}"></c:out>
其实这里用到了JSP的EL表达式。关于这个知识点,后续再说。
(3)request,session,application,pageContext域对象的优先顺序
假如,我们在request,session,application,pageContext域对象中都放入了key=abc的属性,那么输出是怎么样的,比如,我们这么写:
<%
request.setAttribute("abc", "request");
session.setAttribute("abc", "session");
application.setAttribute("abc", "application");
pageContext.setAttribute("abc", "pageContext");
%>
这时候我们再使用标签输出,会输出什么呢?
<c:out value="${abc}"></c:out>
答案是输出pageContext,它查找的优先顺序是:pageContext > request > session > application
当然,要知道的是EL表达式也可以指定读取哪个域对象中的数据!(该知识点后续说明)
(4)c:out标签的其他属性
request中放如下属性:
<%
request.setAttribute("url","<a href="www.baidu.com">Baidu</a>");
%>
jsp页面做如下输出:
<c:out value="${url}" default="没有值" escapeXml="false"></c:out>
它会在页面输出一个超链接,而不是一串文本。
这里default属性用于指定域对象中没有值时的默认值。
escapeXml属性用于指定是否按照html样式输出,默认是true,代表以文本形式输出。
(5)输出JavaBean的属性
比如,我们的request域对象中放入了一个User对象,如下:
<%
User user = new User();
user.setName("Gavin");
user.setAge(12);
request.setAttribute("u", user);
%>
现在我们要输出u的name和age属性:
写法如下:
<c:out value="${u.name }"></c:out>
<c:out value="${u.age}"></c:out>
再一次用到了EL表达式。这里可以使用u.name和u.age属性是因为User类中有getName和getAge方法
<c:set>
标签这个标签用于在某个范围(page,request,session,application等)中设置某个值
用法如下:
<c:set var="abc" value="China,北京" scope="request"></c:set>
scope属性指定将该值放在哪个域对象中。
这句话等价于:
request.setAttribute("abc","China,北京");
然后我们将这个属性值输出:
<c:out value="${abc }"></c:out>
<c:remove>
标签这个标签用于删除某个变量或者属性,比如我们要删除request对象中名字为’a’的属性:
<c:remove var="a" scope="request"/>
<c:catch>
标签这个标签用于捕获嵌套在它内部的标签抛出的异常
<c:catch var="myexception">
<% int i=8/0; %>
</c:catch>
<c:out value="${myexception}"></c:out>
<c:if>
标签该标签用于进行条件判断,如果它的test属性为true,那么就去处理它的body。
(1)判断一个字符串
request域对象中放入:
request.setAttribute("a", "hello");
判断如果a为’hello’则输出’ok!’,否则就输出’no!’,如下:
<c:if test="${a=='hello' }">
ok!
</c:if>
<c:if test="${a!='hello' }">
no!
</c:if>
要注意的是,这里没有if-else多分支语句,所以只能使用两个if语句去判断。
(2)判断一个JavaBean对象的属性
request域对象中放如下User对象:
<%
User user = new User();
user.setAge(28);
request.setAttribute("u", user);
%>
判断u的年龄:
<c:if test="${u.age > 27 }">
User的年龄大于27
</c:if>
<c:choose>
,<c:when>
和<c:otherwise>
标签【1】<c:choose>
用于条件的选择,它和<c:when>
和<c:otherwise>
一起使用。
【2】<c:when>
它代表了<c:choose>
的一个条件分支,使用它的限制条件:
<c:choose>
作为它的父标签<c:otherwise>
之前出现【3】<c:otherwise>
代表了<c:choose>
的最后一个分支,使用它的限制条件:
<c:choose>
作为它的父标签<c:choose>
的最后分支出现其实它类似于JavaSE中的switch-case-default语句,看下述例子:
<body>
<% User user = new User(); user.setName("Gavin"); user.setAge(22); request.setAttribute("u",user); %>
<c:choose>
<c:when test="${u.age<10}">
用户的年龄小于10岁
</c:when>
<c:when test="${u.age>=10 and u.age<20 }">
用户的年龄不小于10岁,但小于20岁
</c:when>
<c:otherwise>
用户的年龄大于20岁
</c:otherwise>
</c:choose>
</body>