JSTL简介
JSTL标签库下载:http://tomcat.apache.org/taglibs/standard/
可以发现有三个版本,最新的版本可以参照记录,实现的jar包名字变更了。但是功能一般不用,所以一般下载Standard1.1版本即可。
Standard 1.2.3
Standard 1.1 //将解压的lib文件夹中的 jstl.jar 和 standard.jar文件放到对应Web App的 WEB-INF\lib 目录下即可以使用啦。
Standard 1.0
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
JSTL标签进行分类,根据其功能分为以下,可用于创建一个JSP页面时,JSTL标签库组:
核心标签(Core Tags) //一般只会用到这个,其他的不怎么用。
格式化标签(Formatting tags)
SQL标签(SQL tags)
XML标签(XML tags)
JSTL函数(JSTL Functions)
表达式操作
c:out
在jstl中可以直接写EL,EL表达式不单独使用的理由:
<%request.setAttribute("book", "<<java>>"); %>
${requestScope.book } //该位置HTML中虽然是<<java>>但是在浏览器中只会显示<>
因为在html中会把<java>当做标签来解析,不会显示任何东西,所以只剩下你外边的<>
而jstl的c:out则可以正常显示,原因是对<<>>进行了转义 <<java>>
<c:out value="${requestScope.book }"/> //正常显示<<java>>
c:out默认是将标签转义的,即<变为<,可以通过设置不进行转义。
正常情况下,在html中永远都是进行转义的。
<c:out value="${requestScope.book }" default="NoData" escapeXml="false"/>
c:set
直接对域对象的属性赋值
<c:set var="name" value="high" scope="page"></c:set>
等价于
<% pageContext.setAttribute("name", "high") %>
<c:set var="name" value="high" scope="request"></c:set> //设置request范围的属性
<% out.println(request.getAttribute("name")); %><br> //读取数据和下面的EL表达式读取时一样的。
<c:out value="${requestScope.name }"/>
设置域对象中的Javabean的属性:
<%
Student student = new Student();
request.setAttribute("student", student);
%>
<c:set target="${requestScope.student }" property="name" value="${param.name }"/>
<c:out value="${requestScope.student.name }"/>
remove
<c:set var="name" value="high" scope="session"/>
<c:remove var="name"/>
catch
//用来抓异常,实际开发中基本不用。
流程操作
c:if
<c:if test="testCondition" var="varName" scope="{page|request|session|application}"/>
test若结果为true,则执行本体内容。scope用来表示var的保存范围。
※注意:只有if 没有else,但是if中提供了一个强大功能,用var属性来保存if判断的结果。
如果想用到if else 的效果可以用下面的组合语句。
c:choose c:when c:otherwise
c:when和c:otherwize必须在c:choose中作为子标签使用,
c:otherwise必须在c:when之后。且必须是c:choose的最后一个,等同于最后的else
<c:choose>
<c:when test="${param.score > 80 }">
优秀<br>
</c:when>
<c:when test="${param.score > 60 }">
及格<br>
</c:when>
<c:otherwise>
不及格<br>
</c:otherwise>
</c:choose>
迭代操作
※重要 c:forEach
可以对Array,Collection, Map等进行遍历。
下面的循环输出:1 3 5 7 9
<c:forEach begin="1" end="10" step="2" var="i">
${i }
</c:forEach>
遍历集合:
<%
List<Student> students = new ArrayList<Student>();
Student s1 = new Student();
s1.setName("high");
Student s2 = new Student();
s2.setName("high2");
Student s3 = new Student();
s3.setName("high3");
students.add(s1);
students.add(s2);
students.add(s3);
request.setAttribute("students", students);
%>
<!-- 注意items一定要是EL表达式,否则会被当做字符串来处理 begin从0开始 -->
<c:forEach items="${ requestScope.students}" var="st" begin="0" end="2" step="1" >
${st.name }<br>
</c:forEach>
<!-- varStatus显示当前index,总数,是否第一个,是否最后一个 -->
<c:forEach items="${ requestScope.students}" var="st" begin="0" end="2" step="1" varStatus="status" >
${status.index }, ${status.count }, ${status.first }, ${status.last }<br>
</c:forEach>
<!-- 遍历map items一定要在某个域对象中 -->
<c:forEach items="${requestScope.maps }" var="map">
${map.key }:${map.value }<br>
</c:forEach>
<!-- 遍历数组 -->
<%
String[] strs = new String[]{"A", "B", "C"};
request.setAttribute("strs", strs);
%>
<c:forEach items="${requestScope.strs }" var="str">
${str }<br>
</c:forEach>
<c:forTokens>相当于分割遍历字符串-不常用
以下例子输出 hello jstl
<c:forTokens items="hello,jstl" delims="," var="token">
${token }
</c:forTokens>
URL操作
<c:import>可以包含任意的内容
<c:import url="http://www.baidu.com"></c:import>
<c:redirect>重定向页面
<c:redirect url="/test.jsp"/>
※/test.jsp 的/代表的是web应用根目录,这里/代表web应用还是网站需要看
对应的语句是jsp容器解析还是浏览器解析。如果是jsp容器解析则是web应用。
而像response.sendRedirect() 是发给浏览器解析的,则视为网站的根目录。
<c:url>产生一个url地址
可以根据cookie是否可用来智能添加sessionID
<c:url>标签将URL格式化为一个字符串,然后存储在一个变量中。这个标签在需要的时候会自动重写URL。
比如如果cookie可以用,则会将sessionID添加到浏览器中。
var属性用于存储格式化后的URL。
<c:url>标签只是用于调用response.encodeURL()方法的一种可选的方法。
它真正的优势在于提供了合适的URL编码,包括<c:param>中指定的参数。
<c:url value="/index.jsp" var="urlvalue">
<c:param name="user" value="high"/>
</c:url>
<c:out value="${urlvalue }"></c:out>
输出结果为:/webproject/index.jsp?user=high
<完>