是java中的一个定制标记库集
实现了jsp页面中的代码复用,基于标签库原理,重复率较高的代码块支持复用,提高效率
书写jsp页面时可读性更强
http://archive.apache.org/dist/
http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/
<!—
EL表达式(Expression Language)经常与JSTL配合使用,使得JSP页面更直观,写法更简单
格式:${表达式}
".","[]"运算符:
1.通常情况下是通用的${user.name} 、${user["name"]}
2."[]"还可以用来进行集合元素中的定位${list[0].name、list[1].name}
3.包含特殊字符时必须用"[]",${user["first-name"]}是对的,而${user.first-name}是错误的
4.通过变量动态取值时必须用"[]",${user[param]},"."的写法是${user.name}无法动态取值
JSP内置对象(Page,Request,Session,Application)
EL(PageScope,RequestScope,SessionScope,ApplicationScope)
-->
<!-- EL自动类型转换
如把String转换为int,
String str_num = request.getParameter("num");
int num = Integer.parseInt(str_num);
num+=10;
EL会进行自动类型转换,只需要这样写${param.num + 10}
-->
<!--
EL运算符
算术运算符:+,-,*,/(div),%(mod)
关系运算符:==(eq),!=(ne),<(lt),>(gt),<=(le),>=(ge)
逻辑运算符:&&(and),||(or),!(not)
验证运算符:empty(验证数据是否为空,空返回true,非空返回false)
-->
<%@page import="org.apache.jasper.tagplugins.jstl.core.ForEach"%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%> <!-- JSTL -->
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<jsp:useBean id="person" class="com.wzy.bean.Person"></jsp:useBean>
<!-- JSTL --> <!DOCTYPE html
PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>first</title>
</head>
<body> <c:out value="输出的值(常量)"></c:out>
<c:out value="${username}" default="默认值"></c:out><!-- 输出变量,如果为空,则什么都不输出 --><br />
<c:out value="1+2=${1+2}"></c:out>
<%
String name1 = "xiaoming";
request.setAttribute("username", name1);
%>
<br />
<c:out value="${empty username }"></c:out><!-- false --> <br />
<%
session.setAttribute("value1", "计算结果:");
session.setAttribute("value2", 100);
%> <c:out value="<${value1}" default="默认" escapeXml="false"></c:out>
<c:out value="${value2}*5="></c:out>
<c:out value="${value2*5}>" escapeXml=""></c:out>
<!--escapeXml=""或escapeXml="false"都可以进行转义字符操作
escapeXml="true"转义字符失效-->
<br>
<!--
set标签
1.存值到scope中,可将值以变量形式存放在指定的范围中
-->
<br>
<c:set var="today" value="12.16" scope="session"></c:set>
<c:out value="${today}"></c:out>
<br>
<c:set var="age" scope="application">20</c:set>
<c:out value="${age}"></c:out>
<!--
2.存值到javabean的属性中,需要配合target属性指定对象并且通过property属性指定要赋值给对象中的哪个属性
-->
<br>
<c:set target="${person}" property="pid" value="01"></c:set>
<c:set target="${person}" property="pname">小明</c:set>
<c:set target="${person}" property="page" value="21"></c:set>
<c:out value="${person.pid}"></c:out>
<c:out value="${person.pname}"></c:out>
<c:out value="${person.page}"></c:out> <!-- remove标签 , 移除掉某个数据-->
<c:set var="removevalue" value="hahahha"></c:set>
<c:remove var="removevalue"/>
<c:out value="${removevalue}"></c:out><br> <!-- catch标签 ,包含那些容易出错的JSTL标签,相当于javaz中的异常处理try{}catch(){}-->
<c:catch var="error">
<c:set target="aa" property="aa"></c:set>
</c:catch>
<c:out value="${error}"></c:out>
<br>
<!--if标签
同程序中的if作用相同
test属性用于存放判断的条件,一般使用EL表达式编写
var指定名称用来存放判断的结果类型为true或false
scope用来存放var属性存放的范围,不指定为默认的范围
-->
<form action="firstDemo.jsp" method="post">
<input type="text" name="score" value="${param.score001}">
<input type="submit" value="提交">
</form>
<c:if test="${param.score>=80}" var="result">
<c:out value="您的分数很好"></c:out>
</c:if>
<c:out value="${result}"></c:out> <br>
<!-- choose,when,otherwise
通常这三个标签放在一起配合使用
c:choose嵌套在c:when和c:otherwise外面作为他们的父标签来使用
其中choose和when也可以一起使用
--> <form action="firstDemo.jsp" method="post">
<input type="text" name="score02" value="输入分数">
<input type="submit" value="提交">
</form> <!-- 相当于switch语法 -->
<c:choose>
<c:when test="${param.score02>=90 && param.score02<=100}">
<c:out value="优秀"></c:out>
</c:when>
<c:when test="${param.score02>=80 && param.score02<=90}">
<c:out value="良好"></c:out>
</c:when>
<c:when test="${param.score02>=60 && param.score02<=80}">
<c:out value="及格"></c:out>
</c:when>
<c:when test="${param.score02>=0 && param.score02<=60}">
<c:out value="不及格"></c:out>
</c:when>
<c:otherwise>
<c:out value="不符合所有的要求"></c:out>
</c:otherwise>
</c:choose> <br>
<!-- forEach
根据循环条件遍历集合(Collection)中的元素
var设定变量名用于存储从集合中取出的元素(必须无默认值)
items指定要遍历的集合(必须无默认值)
begin、end用于指定遍历的起始位置和终止位置(有默认)
step指定循环的步长(有默认)
varStatus通过index、count、first、last几个状态值,描述begin和end子集中的元素的状态
--> <%
List<String> fruits = new ArrayList<String>();
fruits.add("apple00");
fruits.add("pear01");
fruits.add("orange02");
fruits.add("banana03");
fruits.add("apple04");
fruits.add("pear05");
fruits.add("orange06");
fruits.add("banana07");
request.setAttribute("fruits", fruits);
// for (Object f : fruits) {
// System.out.print(f);
// } %>
<!-- 1.全部遍历 -->
<c:forEach var="f" items="${fruits }">
<c:out value="${f}"></c:out>
</c:forEach>
<br>
<!-- 2.部分遍历 ,取出第2个到第6个-->
<c:forEach var="f" items="${fruits}" begin="1" end="5">
<c:out value="${f}"></c:out>
</c:forEach>
<br>
<!-- 3.部分遍历 ,取出第2个到第6个,指定步长,隔一个输出一个-->
<c:forEach var="f" items="${fruits}" begin="1" end="5" step="2">
<c:out value="${f}"></c:out>
</c:forEach>
<br>
<!-- 4.部分遍历 ,取出第3个到第6个,输出元素状态-->
<c:forEach var="f" items="${fruits}" begin="2" end="5" varStatus="fru">
<c:out value="${f}的4个属性:"></c:out>
<c:out value="index属性(在列表的位置)${fru.index}"></c:out>
<c:out value="count属性(输出的位置)${fru.count}"></c:out>
<c:out value="first属性(输出的如果的第一个,为true,否则false)${fru.first}"></c:out>
<c:out value="last属性(输出的如果的最后一个,为true,否则false)${fru.last}"></c:out>
<br>
</c:forEach>
<br>
<!-- forTokens标签,截取字符串
用于浏览字符串,并根据指定的字符串将字符串截取
items指定被迭代的字符串
delims指定使用的分隔符
var指定用来存放遍历到的成员
begin指定变量的开始位置(int型,从取值0开始)
end指定遍历结束的位置(int型,默认集合中最后一个元素)
step遍历的步长(大于0的整型)
varStatus通过index,count,first,last几个状态值,描述begin和end子集中的元素的状态
-->
<c:forTokens items="1534-4564-48" delims="-" var="num" >
<c:out value="${num}"></c:out><br>
</c:forTokens> <br>
<!-- import标签
可以把其他静态或动态文件包含到本jsp页面
同jsp:include的区别为:只能包含同一个web应用中的文件。
而c:import可以包含其他web应用的文件,甚至的网络上的资源 url被导入资源的url路径
context相同服务器下其他的web工程,必须以“/”开头
var以String类型存入被包含文件的内容
Scope var变量的jsp范围
charEncoding 被导入文件的编码格式
varReader以Reader类型存储被包含文件内容
-->
<!--导入绝对路径-->
<c:catch var="err09">
<c:import url="http://www.baidu.co"></c:import>
</c:catch>
<c:out value="${err09}"></c:out> <!-- 导入相对路径文件 -->
<c:catch var="err08">
<c:import url="a.txt" charEncoding="utf-8"></c:import>
</c:catch>
<c:out value="${err08}"></c:out>
<br>
<!-- var ,Scope属性 -->
<c:catch var="err07">
<c:import url="a.txt" var="a" scope="session" charEncoding="utf-8"></c:import>
</c:catch>
<c:out value="import标签存储的a字符串变量值为:${sessionScope.a}"></c:out>
<c:out value="${err07}"></c:out>
<br>
<!-- context属性 ,把另一个web下的文件导入到本页面-->
<c:catch var="err06">
<c:import url="/err.jsp" context="/StrutsTest" charEncoding="utf-8"></c:import>
</c:catch>
<c:out value="${err06}"></c:out> <!-- redirect标签,用来实现请求的重定向
同时可以在url中加入指定的参数
url指定重定向页面的地址,可以是一个String类型的绝对地址或相对地址
context用于导入其他web应用中的页面
-->
<c:catch var="redirtErr">
<c:redirect url="second.jsp" >
<c:param name="username">name</c:param>
<c:param name="usepasswd">passwd</c:param>
</c:redirect>
</c:catch>
<c:out value="${redirtErr}"></c:out>
<br> <!-- url标签
用于动态生成一个String类型的url,可以同c:param标签共同使用
也可以使用html的a标签实现超链接
value表示url路径值
var将url路径存储在的变量中
scope var变量的范围
-->
<c:if test="${1<3 }">
<c:set var="parturl">aa</c:set>
</c:if>
<c:url value="http://127.0.0.1:8080/${parturl}" var="newurl" scope="session"></c:url>
<a href="${ newurl}">动态生成url.....</a> </body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
</head>
<body>
this is ..... <c:out value="${param.username}"></c:out>
<c:out value="${param.usepasswd}"></c:out> <c:if test="${1<3}">
<c:set var="parturl">aa</c:set>
</c:if>
<c:url value="http://127.0.0.1:8080/${parturl}" var="newurl" scope="session"></c:url>
<a href="${newurl}">url..</a> <br>
<c:out value="你好。hello world字符串
是否包含hello:${fn:contains('你好。hello world','hello') }"></c:out><br>
<c:out value="你好。hello world字符串
是否包含aa:${fn:contains('你好。hello world','aa') }"></c:out><br> <c:out value="你好。HELLO world字符串
是否包含hello:${fn:containsIgnoreCase('你好。hello world','hello') }"></c:out><br> <c:out value="你好。HELLO world字符串ld是否在字符串结尾:
${fn:endsWith('你好。hello world','ld') }"></c:out><br>
<c:out value="你好。HELLO world字符串你是否在字符串开头:
${fn:startsWith('你好。hello world','你') }"></c:out> <book>escapeXML</book><br>
<c:out value="${fn:escapeXml('<book>escapeXML</book>')}"></c:out><br>
<c:out value="<book>escapeXML</book>"></c:out><br> <c:out value="hello world中,rl出现的index值:
${fn:indexOf('hello world中','rl')}"></c:out> </body>
</html>