JSTL

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则可以正常显示,原因是对<<>>进行了转义 &lt;&lt;java&gt;&gt;
<c:out value="${requestScope.book }"/> //正常显示<<java>>

c:out默认是将标签转义的,即<变为&lt;,可以通过设置不进行转义。
正常情况下,在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 }&nbsp;
</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  

<完>

你可能感兴趣的:(JSTL)