Jstl标签技术
1.jstl的介绍
2.一般用途的标签
3.条件标签
4.迭代标签
5.url相关的标签(xml,sql)
6.jstl标签实际运用-购物车
Jstl
Jstl(jsp standard tag library):jsp标准标签库
为什么有?
在系统中,jsp文件有大量的<% %>java片段 jsp中 html标签+jsp标签+java片段->jsp很乱
提出:能不能把java片段用 标签来替换 ->jsp页面就简洁
Jstl的好处
(1)在应用程序服务器之间提供统一的接口,从而提供了web应用在不同服务器的移植
(2)简化jsp于web应用程序的开发
(3)减少jsp中java片段的代码(scriptlet代码),可以达到在Jsp页面中没有任何java代码,代码更加简洁
(4)提高jsp开发速度,缩短开发周期
解决之道-jstl
目前软件公司用不用jstl标签?
不同公司严要求可能不一样,一类公司要求jsp页面中不能有任何的java代码,还有一类公司没有必须的要求
在jstl中,最常用的标签有:
一般途径的标签
(1)<c:out>
(2)<c:set>
(3)<c:remove>
(4)<c:catch>
条件标签
(1)<c:if>
(2)<c:choose>
(3)<c:when>
(4)<c:otherwise>
迭代标签
(1)<c:forEach>
(2)<c:forTokens>
Url相关的标签
(1)c:redirect
(2)c:import
(3)c:param
uri查看jstl-impl-1.2.2.jar ->META-INF->c.tld
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuIDNzQDMycTM1IDNwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
注意:什么时候前面 : 如 果 是 从 某 个 域 对 象 中 取 出 值 , 使 用 { } :如果是从某个域对象中取出值,使用 :如果是从某个域对象中取出值,使用{?} ?表示属性名
jstl标签讲解
注意:引入标签库
<!-- 引入jstl标签库 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
一般途径的标签
(1)c:out标签
<body>
<%
//System.out.println("hello.world");
//这句话本身应当放在controller,这里是为了方便测试
//如果域对象中有相同的属性名,c:out 优先级是 pageContext>request>session>application
request.setAttribute("abc", "你好<a href='http://www.baidu.com'>百度</a>");
// session.setAttribute("abc", "你好2");
// application.setAttribute("abc", "你好3");
// pageContext.setAttribute("abc", "你好4");
User u=new User("xiaoming",14);
request.setAttribute("user1",u);
%>
<c:out value="hello.world"></c:out>
<h1>如何输出request/session/application/pageContext域对象的数据</h1>
<!-- escapeXml用于指定是否按照html样式显示,默认是true[表示文本] false[html形式] -->
<c:out value="${abc}" default="没有值" escapeXml="false"></c:out>request.getAttribute("abc").toString();
<h1>如何输出对象的值</h1>
<c:out value="${user1.name}"></c:out><==>(User)request.getAttribute("user1").getName();
||<c:out value="${user.age}"></c:out>
<h1>el表达式</h1>
${user.name}||${user1.age*20}
</body>
(2)c_set标签
<body>
<c:set var="abc" value="中国北京" scope="request"></c:set>
<%
//上面的标签等价
//request.setAttribute("abc","中国北京");
%>
<c:out value="${abc}"></c:out>
</body>
(3)c_remove标签
<body>
<%
request.setAttribute("a","你好");
%>
<h1>输出</h1>
<c:out value="${a} "></c:out>
<c:remove var="a" />
<c:out value="${a}" default="没有了"></c:out>
</body>
(4)c:catch标签
<body>
<h1>c_catch使用</h1>
<c:catch var="myexception">
<% int i=8/0; %>
</c:catch>
<c:out value="${myexception}"></c:out><br>
<c:out value="${myexception.message}"></c:out>
</body>
条件标签
(1)c:if标签
<body>
<h1>c:if的使用</h1>
<%
request.setAttribute("a", "hello");
request.setAttribute("age", "23");
//放入一个Rat对象
Rat rat=new Rat("xiaobai",10);
request.setAttribute("rat1", rat);
%>
<h1>判断字符串</h1>
<c:if test="${a=='hello'}">
ok!
</c:if>
<c:if test="${a!='hello'}">
no ok!
</c:if>
<h1>判断数值</h1>
<c:if test="${age==56}">
等于56
</c:if>
<c:if test="${age<56}">
小于56
</c:if>
<c:if test="${age>10 and age<34 }">
age>10 and age<34
</c:if>
<h1>判断对象中的属性</h1>
<c:if test="${rat1.age>3}">
小老鼠年龄大于3岁
</c:if>
</body>
(2)c:choose标签
<body>
<h1>c_choose</h1>
<%
//放入一个Rat对象
Rat rat=new Rat("xiaobai",1);
request.setAttribute("rat1", rat);
%>
switch()
case:
case:
case:
default:<br>
<c:choose>
<c:when test="${rat1.age<2 }">
<font color="red">老鼠很小不能吃</font>
</c:when>
<c:when test="${rat1.age>2 and rat1.age<8}">
<font color="green">老鼠很壮 好吃</font>
</c:when>
<c:otherwise>
<font color="blue">老鼠很lao 不好吃</font>
</c:otherwise>
</c:choose>
</body>
迭代标签
(1)c:foreach标签
<body>
<h1>迭代标签 c:foreach</h1>
<%
ArrayList<Rat> al=new ArrayList<Rat>();
Rat rat1=new Rat("xiaobai",2);
Rat rat2=new Rat("xiaobao",4);
Rat rat3=new Rat("dabao",8);
//放到al
al.add(rat1);
al.add(rat2);
al.add(rat3);
request.setAttribute("allrats", al);
%>
<%
ArrayList<Rat> al2=(ArrayList<Rat>)request.getAttribute("allrats");
for(Rat rat:al2)
out.println(rat.getName()+" "+rat.getAge());
%>
<h1>foreach取法</h1>
<!-- ${allrats}表示域对象的哪个属性(一般是一个集合) ;var ="rat"表示取出来的具体对象-->
<c:forEach items="${allrats}" var="rat">
<c:out value="${rat.name }"></c:out>
<c:out value="${rat.age }"></c:out>
</c:forEach>
<h1>第二种迭代:1 to 10 </h1>
<c:forEach var="i" begin="1" end="10">
<c:out value="${i}"></c:out>-->
</c:forEach>
<h1>第二种迭代:1 to 10,step=3 </h1>
<c:forEach var="i" begin="1" end="10" step="3">
<c:out value="${i}"></c:out>-->
</c:forEach>
</body>
(2)c:fortokens标签
<body>
<h1>fortokens</h1>
<%
request.setAttribute("abc", "12;56;你好;ddd;uuu");
%>
<c:forTokens items="12;56;你好;ddd" delims=";" var="temp">
${temp}
</c:forTokens>
<c:forTokens items="${abc }" delims=";" var="temp">
${temp}
</c:forTokens>
</body>
Jstl细节问题
1.前面用到的是ArrayList集合迭代、HashMap/HashSet
<body>
<%
//模拟
Map map=new HashMap();
// map.put("aa", "zhangsan");
// map.put("bb", "lisi");
//把map放入某个域对象 session request pageContext application
// request.setAttribute("persons", map);
Rat rat1=new Rat("xiaobai",2);
Rat rat2=new Rat("xiaobao",4);
Rat rat3=new Rat("dabao",8);
map.put("aa", rat1);
map.put("bb", rat2);
map.put("cc", rat3);
request.setAttribute("rats", map);
//set
Set set=new HashSet();
set.add(rat1);
set.add(rat3);
set.add(rat2);
request.setAttribute("myrats", set);
%>
<c:forEach items="${rats}" var="rat">
key=${rat.key }值=${rat.value.name}age=${rat.value.age}<br>
</c:forEach>
<h1>set集合 jstl标签取法</h1>
<c:forEach items="${myrats }" var="myrat">
value=${myrat.name }||age=${myrat.age }<br>
</c:forEach>
//如何使用jstl if去判断集合是否为空
<h1>如何使用jstl if去判断集合是否为空</h1>
<c:if test="${empty myrats }">
没有老鼠
</c:if>
<c:if test="${!empty myrats }">
有老鼠
</c:if>
</body>
2.Url相关的标签
(1)c:redirect标签
<body>
<h1>redirect</h1>
<c:redirect url="http://www.baidu.com"></c:redirect>
</body>
(2)c:import标签 与param标签
<body>
<c:import url="a.jsp">
<c:param name="name" value="hyf"/>
</c:import>
<%
request.setAttribute("aa", "hello");
%>
<c:if test="${ 2>1?true:false}">
ok!!!
</c:if>
</body>
a.Jsp
<body>
aaaa.<br>
${param.name }
</body>
(3)c:param标签
aa.jsp
<body>
<a href="/jstl1/bb.jsp?id=12" target="_blank" rel="external nofollow" >点击</a>
</body>
bb.jsp
<body>
${param.id }
</body>