JSTL标签
全称: jsp standard tag library, 标准标签库
为什么会有JSTL标签?
在jsp文件如果同时出现java片段+html标签+jsp标签, 页面代码会很乱, 于是有人提出: 能不能把<%%>java片段使用标签来替换,
这样jsp页面会很整洁, 于是有了JSTL标签.
使用JSTL标签的好处?
(1) 在应用程序和服务器之间提供了统一的接口, 从而提供了web应用在不同服务器的移植
(2) 简化了jsp与web应用程序的开发
(3) 减少jsp中java片段的代码, 可以达到没有任何的java代码, 使页面更加简洁
(4) 提高jsp的开发效率, 缩短开发周期
分类:
1. 一般用途的标签
2. 条件标签
3. 迭代标签
4. url相关的标签(xml, sql)
-------------------------------------------------
新建Web Project: jstl, 并引入jstl标签库
范例1: 在jsp页面输出Hello World !
index.jsp:
<!-- 跳转到c_out.jsp页面 -->
<jsp:forward page="/WEB-INF/c_out.jsp" />
c_out.jsp:
引入c标签: <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!-- 使用c标签输出Hello World ! -->
<c:out value="Hello World !" />
测试:
---------------------------------------------------
范例2:输出J2EE中域对象request, session, application, pageContext的数据
<!-- 输出J2EE中域对象request, session, application, pageContext的数据 -->
<%
// 这句话应该写在Controller中, 但是为了演示就写在这里
pageContext.setAttribute("username", "pageContext: 王五");
request.setAttribute("username", "request: 张三"); // 在jsp中, request是内置对象
session.setAttribute("username", "session: 李四");
application.setAttribute("username", "application: 赵六");
%>
<!-- 相当于request.getAttribute("username").tostring() -->
<!-- 当key值相同时, 四个域对象的c:out优先级: pageContext>request>session>application -->
<c:out value="${username }" /><br>
<!-- 如果找不到任何一个相匹配的key, 那么什么都不会输出, 也不报错 -->
<c:out value="${xxx }" /><br>
<!-- 如果设置了默认值, 那么将输出默认值 -->
<c:out value="${xxx }" default="没有值" />
测试:
---------------------------------------------------------
范例3: 是否解析/过滤<html>标签, 默认是true
<!-- 是否解析<html>标签 -->
<c:out value="<a href='http://www.sohu.com'>Sohu</a>" />
测试: <a href='http://www.sohu.com'>Sohu</a>
<c:out value="<a href='http://www.sohu.com'>Sohu</a>" escapeXml="false" />
测试: Sohu
-------------------------------------------------
范例4: 获取对象的属性
创建包: com.itcast.jstl.domain, 包下创建User.java
User.java:
private String name;
private int age;
+ getter/setter
c_out.jsp:
<!-- 获取domain对象的属性 -->
<%
// 这里只是为了方便测试, 将User对象在这里实例化
User user = new User();
user.setName("小明");
user.setAge(10);
request.setAttribute("user1", user);
%>
User对象: <c:out value="${user1 }" /><br>
name属性: <c:out value="${user1.name }" /><br>
age属性: <c:out value="${user1.age }" />
<hr>
<!-- 使用EL表达式输出User对象及其属性 -->
${user1 } | ${user1.name } | ${user1.age }
测试:
------------------------------------------------
范例5: 使用<c:set>标签
这个标签不常使用, 因为在Controller中就设定了值
<!-- 设定值, 相当于: request.setAttribute("address", "中国, 北京") -->
<c:set var="address" value="中国, 北京" />
<br>
<!-- 获取值, 相当于: request.getAttribute("address") -->
<c:out value="${address }" />
测试:
-------------------------------------------------
范例6: <c:remove>标签
c_remove.jsp:
<!-- remove标签演示 -->
<c:set var="abc" value="Hello" scope="request" /><br>
<c:out value="${abc }" />
<hr>
<!-- remove之后, var中写入set的var值, scope是域对象的类型,
如果不指定域对象, 那么就把四个域对象中的变量值都remove掉
-->
<c:remove var="abc" scope="request" />
<c:out value="${abc }" default="abc的值已经被remove了" />
测试:
-------------------------------------------
范例7: <c:catch>标签
此标签用于捕获异常
c_catch.jsp:
<c:catch var="myException">
<% int i = 8 / 0; %>
</c:catch>
输出异常信息:<br>
1. 详细信息: <c:out value="${myException }" /><br>
2. 简单信息: <c:out value="${myException.message }" />
测试:
--------------------------------------
范例8: <c:if>标签
用于条件判断, 除了以下几种判断之外还有很多, 具体使用查手册
index.jsp: <jsp:forward page="/WEB-INF/c_if.jsp" />
(1) 字符串判断
c_if.jsp:
<%
request.setAttribute("username", "Peter");
%>
<!-- 使用c:if标签判断 -->
<c:if test="${username == 'Peter' }">
<h3>YES!</h3>
</c:if>
<c:if test="${username != 'Peter' }">
<h3>NO!</h3>
</c:if>
测试:根据条件输出YES!或者NO!
(2) 年龄范围判断, 会自动把字符型的age转换成数值型
<%
request.setAttribute("age", "11");
%>
<!-- 使用c:if标签判断 -->
<c:if test="${age > 10 and age < 20 }">
<h3>年龄在10 - 20 之间</h3>
</c:if>
<c:if test="${age <= 10 or age >= 20 }">
<h3>年龄不在10 - 20 之间</h3>
</c:if>
(3) 获取对象的属性
Rat.java:
private String name;
private int age;
+ getter/setter()
c_if.jsp:
<%
Rat rat = new Rat();
rat.setName("Kitty");
rat.setAge(10);
request.setAttribute("rat", rat);
%>
<!-- 使用c:if标签判断 -->
<c:if test="${rat.name == 'Kitty' and rat.age == 10 }">
<h3>YES!</h3>
</c:if>
注意: 底层rat.name和rat.age调用的是getXxx()方法, 并不是调用属性
---------------------------------------------
范例8: <c:choose>标签
<c:if>是单分支, <c:choose>是多分支, <c:choose>是父标签, 里面还有<c:when>和<c:otherwise>子标签
<%
Rat rat = new Rat();
rat.setName("Kitty");
rat.setAge(4);
request.setAttribute("rat", rat);
%>
<c:choose>
<c:when test="${rat.age < 5 }">
<font color="red">年龄太小</font>
</c:when>
<c:when test="${rat.age > 10 }">
<font color="red">年龄太大</font>
</c:when>
<c:otherwise>
<font color="green">年龄适合</font>
</c:otherwise>
</c:choose>
测试:
范例9: 迭代标签<c:foreach>
(1) 第一种foreach
<%
List<Rat> rats = new ArrayList<Rat>();
Rat rat1 = new Rat();
rat1.setName("小宝");
rat1.setAge(2);
Rat rat2 = new Rat();
rat2.setName("大宝");
rat2.setAge(5);
Rat rat3 = new Rat();
rat3.setName("老宝");
rat3.setAge(10);
rats.add(rat1);
rats.add(rat2);
rats.add(rat3);
request.setAttribute("rats", rats);
%>
使用传统方法获取, java片段:<br>
<%
List<Rat> allRats = (List<Rat>)request.getAttribute("rats");
for(Rat rat : allRats) {
out.println(rat.getName() + " | " + rat.getAge() + "<br/>");
}
%>
<hr>
使用c:foreach标签获取:<br>
<c:forEach items="${rats }" var="rat">
<c:out value="${rat.name }" /> | <c:out value="${rat.age }" /><br/>
</c:forEach>
测试:
(2) 第二种foreach
<c:forEach var="i" begin="1" end="10">
<c:out value="${i }" />,
</c:forEach>
测试:
(3) 第三种foreach: 可以指定步长
<c:forEach var="i" begin="1" end="10" step="3">
<c:out value="${i }" />,
</c:forEach>
测试:
(4) c:forTokens, 使用分隔符
<c:forTokens items="12,56,你好!" delims="," var="splitPart">
<!-- 这里直接使用EL表达式输出 -->
${splitPart }
</c:forTokens>
测试:
--------------------------------------------
10. <c:foreach>标签遍历Map集合
c_foreach_map.jsp:
<%
Map<String, String> all = new HashMap<String, String>();
all.put("p1", "Peter");
all.put("p2", "Tom");
all.put("p3", "Lucy");
request.setAttribute("persons", all);
%>
<!-- 从Map集合中取出key和value -->
<c:forEach items="${persons }" var="person">
key: ${person.key } , value: ${person.value } <br>
</c:forEach>
测试:
如果Map中的value放入的是对象, 怎么取值?
<%
Map<String, Object> all = new HashMap<String, Object>();
Rat rat1 = new Rat();
rat1.setName("小宝");
rat1.setAge(2);
Rat rat2 = new Rat();
rat2.setName("大宝");
rat2.setAge(5);
all.put("l_Rat", rat1);
all.put("m_Rat", rat2);
request.setAttribute("rats", all);
%>
<!-- 从Map集合中取出key和value -->
<c:forEach items="${rats }" var="rat">
key: ${rat.key } , name: ${rat.value.name } , age: ${rat.value.age } <br>
</c:forEach>
测试:
11. <c:foreach>标签遍历Set集合
<%
Set all = new HashSet();
Rat rat1 = new Rat();
rat1.setName("小宝");
rat1.setAge(2);
Rat rat2 = new Rat();
rat2.setName("大宝");
rat2.setAge(5);
all.add(rat1);
all.add(rat2);
request.setAttribute("rats", all);
%>
<!-- 从Set集合中取出key和value -->
<c:forEach items="${rats }" var="rat">
name: ${rat.name } , age: ${rat.age } <br>
</c:forEach>
测试:
添加功能: 如果集合中没有对象, 即集合是空的, 那么给出提示, 实现:
<%
Set all = new HashSet();
Rat rat1 = new Rat();
rat1.setName("小宝");
rat1.setAge(2);
Rat rat2 = new Rat();
rat2.setName("大宝");
rat2.setAge(5);
all.add(rat1);
all.add(rat2);
request.setAttribute("rats", all);
%>
<!-- 从Set集合中取出key和value -->
<c:choose>
<c:when test="${empty rats }">
<font color="red">没有任何对象</font>
</c:when>
<c:otherwise>
<c:forEach items="${rats }" var="rat">
name: ${rat.name } , age: ${rat.age } <br>
</c:forEach>
</c:otherwise>
</c:choose>
测试:
12. <c:redirect>重定向
<!-- 重定向到百度 -->
<c:redirect url="http://www.baidu.com" />
输入http://localhost:8080/jstl, 回车就会重定向到百度
13. <c:import>引入别的页面
<c:import url="/WEB-INF/a.jsp" />
<c:import url="/WEB-INF/b.jsp" />
a.jsp: <h4>Page a.jsp</h4>
b.jsp: <h4>Page b.jsp</h4>
测试: