要使用JSTL首先要引入相关jar包。必须导包引入!!!一般引入的代码也放到base标签中
jsp脚本片段使用JSTL替代
- 取出域中的属性值,先判断,然后遍历或者直接显示到页面中
- jstl一般结合EL表达式使用,先取出值然后使用jstl判断或遍历
- jstl每个标签都是一套java代码
JSTL: jsp standard tag lib
使用步骤:
1、将jstl需要使用的jar包拷贝到项目中
2、在需要使用jstl的页面中通过taglib指令引入需要使用的标签库
3、给需要使用的标签库指定标签的前椎名
核心标签库:core 重点
- if、if-else、for、域属性值的操作、重定向...
- c
格式化标签库:fmt
- 日期时间的处理 、 国际化
函数标签库:fun
- 字符串处理的方法: 截取
xml标签库:解析xml的标签库,已经淘汰
ql标签库:和数据库交互的标签库,淘汰
一般结合el使用
1、c:out 取出域中的值显示到页面中
作用:向页面输出内容
value:要输出的值
default:如果value值为空,显示默认值
escapeXml:是否对xml特殊符号转义
默认会对value值进行检查,对html符号进行转义 true
false 不转义
例子: <% request.setAttribute("address", "我也不知道"); request.setAttribute("code", "<script>alert('tianwanggaidihu')</script>"); %> <c:out value="${address }" default="北京"></c:out><br/> <%-- ${code } --%><!-- 将域中属性值取出写入到响应体中交给浏览器 , 如果内容是html内容,浏览器会解析 --> <c:out value="${code }" escapeXml="true"></c:out> |
2、c:set 向域中设置属性值
request.setAttribute("address", "我也不知道");
scope: 要存储值的域
不指定默认存在pageContext域中
page/request/session/application
var: 存储的键
value: 存储的属性值
<h4>c:set</h4> <c:set var="key" value="pagehehe" scope="page"></c:set> <c:set var="key" value="requesthehe" scope="request" ></c:set> <c:set var="key" value="sessionhehe" scope="session"></c:set> <c:set var="key" value="applicationhehe" scope="application"></c:set>
pageScope: ${pageScope.key }<br/> requestScope:${requestScope.key }<br/> sessionScope: ${sessionScope.key }<br/> applicationScope: ${applicationScope.key }<br/> |
3、c:remove 移除域中指定的属性值
request.removeAttribute("key");
var:要移除的属性的键
scope:如果不指定,默认全域移除[所有域中的指定键对应的值都会移除]
c:remove var="key" scope="session"/> <h4>c:remove</h4> pageScope: ${pageScope.key }<br/> requestScope:${requestScope.key }<br/> sessionScope: ${sessionScope.key }<br/> applicationScope: ${applicationScope.key }<br/> |
条件一般是使用el表达式判断后得到一个布尔类型的结果进行使用
4、 c:if if(boolean 条件){//代码块}(就是java中学习的if else 语句)
作用:相当于java中单个的if语句
test: if语句执行的条件
双标签的内部就是控制的要执行的代码块
如果条件结构复杂,一般不适用单个的if语句,多个if之间没有直接的互斥关系
<!-- 判断用户提交的请求参数score是否>=60 --> <c:if test="${param.score>=60 }"> <h4>恭喜你及格了...</h4> </c:if>
<c:if test="${param.score<60 }"> <h4>恭喜你不及格...</h4> </c:if> |
if-else if-else
5、c:choose : 在页面中创建一个if-else的语句结构
c:when: 相当于 if 或 else if
c:otherwise: 相当于 else
注意:
1、choose内只能有when和otherwise子标签组成,如果需要内部注释,只能使用jsp注释
2、choose中可以有多个when语句,但是如果条件有包含关系,范围小的需要在上面
3、othserwise 一般最多使用一个,在条件的最后使用
4、when和otherwise只能当做choose的子标签使用,when和otherwise内可以随意写
<!-- 判断用户提交的age参数,如果>40 输出 如果>30 如果>18 其他 --> <c:choose> <%-- 开始了判断 --%> <c:when test="${param.age>40 }"> <c:choose> <c:when test="${param.age>=90 }"> <h3>人生90古来稀...</h3> </c:when> <c:when test="${param.age>=70 }"> <h3>人生70古来也稀...</h3> </c:when> <c:otherwise> <!-- hehe --> <h3>你的路已经走了一半了...</h3> </c:otherwise> </c:choose> </c:when> <c:when test="${param.age>30 }"> <h3>你的路已经快。。走了一半了...</h3> </c:when> <c:when test="${param.age>18 }"> <h3>那就是我...</h3> </c:when> <c:otherwise> <h3>你还嫩着呢....</h3> </c:otherwise> </c:choose>
|
6、c:forEach : 相当于java中的for循环
如果遍历一组数:相当于普通for[ for(int i=1;i<=5;i++){//代码块 i } ]
如果遍历集合:相当于增强for[ for(Object obj:list){//代码块} ]
-->
<!-- 6。1 遍历一组数
begin:遍历的起始索引值 不能小于0
end:遍历的结束索引值
step:步进 ,默认1
var: 如果在遍历的代码块中需要使用正在遍历的索引值,可以设置var属性,标签默认会将正在遍历的索引值存到pageContext域中,键就是var的值
标签遍历结束后会自动移除域中var对应的属性
应用:生成页码
<c:forEach begin="1" end="5" var="index" >
<!-- 每次遍历执行的代码块 -->
<%-- <h5>hehe + ${pageScope.index }</h5> --%>
<a href="pageServlet?pageNumber=${index }">${index }</a>
</c:forEach>
6.2 遍历list
items:指定要遍历的集合,需要使用EL从域中取出
标签会自动根据集合的长度进行遍历
var: 标签每次遍历时可以将正在遍历的集合的元素存到pageContext域中,var的值就是属性名
<%
List list = new ArrayList();
list.add("tingjie");
list.add("cls");
list.add("zhanglaoshi");
list.add("xiaohu");
list.add("wangyang");
request.setAttribute("list", list);
%>
<c:forEach items="${list }" var="item">
<span>${item }<span>
</c:forEach>
<br/>
6.3 遍历map: foreach标签遍历map时,由于map是键值对的结构,每次遍历可以得到键和值
标签会将正在遍历元素的键和值封装为一个对象,如果设置了var属性,就会存到pageContext域中
封装的对象有两个属性: key , value
开发中一般不会直接遍历map,将map的值获取进行遍历
了解:foreach标签在遍历开始时会创建一个状态对象,用来记录正在遍历的状态,随着遍历刷新状态值
varStatus: 标签会将正在遍历的对象存到pageContext域中,varStatus的值会作为键
状态包括: 当前遍历的元素是不是第一个、是不是最后一个、已经遍历了几个元素、当前元素的索引...
<%
Map map = new HashMap();
map.put("t1", "val1");
map.put("t2", "val2");
map.put("t3", "val3");
request.setAttribute("map", map);
%>
<c:forEach items="${requestScope.map }" var="item" varStatus="vs">
<c:if test="${vs.first }">
<h5 style="background-color: red;">${item.key } -->${item.value }-->索引:${vs.index }->数量:${vs.count }->是否第一个:${vs.first }->是否最后一个:${vs.last }</h5>
</c:if>
<c:if test="${vs.last }">
<h5 style="background-color: green;">${item.key } -->${item.value }-->索引:${vs.index }->数量:${vs.count }->是否第一个:${vs.first }->是否最后一个:${vs.last }</h5>
</c:if>
</c:forEach>
<!--总结:主要的作用
c:out
c:set
c:remove
c:if
c:choose-c:when-c:otherwise 重点
c:forEach 重点
c:redirect
-->
<!-- 重定向的路径由浏览器解析
重定向标签由jsp引擎翻译,绝对路径由服务器先解析,会自动在地址前追加项目名
jsp所有的技术中[inclue/转发动作标签/重定向标签/动态包含标签] 如果使用了绝对路径都是由服务器解析
-->
<c:redirect url="/jsp01.jsp"></c:redirect>
函数标签库:function
处理字符串的
必须在EL内使用
在el中调用方法处理字符串后,el会将结果输出到页面中显示
-->
${fn:replace("jintiantianqizhenhao" , "tian" ,"WAN") }