前言
本文为JavaWeb基础JSTL & EL表达式相关知识介绍,Java全栈学习路线可参考:【Java全栈学习路线】最全的Java学习路线及知识清单,Java自学方向指引,内含最全Java全栈学习技术清单~
一、JSP标签
jsp标签的分类:
(1)内置标签(动作标签): 不需要在jsp页面导入标签
(2)jstl标签: 需要在jsp页面中导入标签
(3)自定义标签 : 开发者自行定义,需要在jsp页面导入标签
内置标签(动作标签)
<jsp:forward />转发标签:
<!--语法:--> <jsp:forward page="/MyJsp001.jsp"></jsp:forward> <!--相当于java代码:--> request.getRequestDispatcher("/MyJsp001.jsp?name=jxf").forward(request, response); <!--注意:但是java代码的转发可以通过url带参数的方式进行传递参数,而转发标签需要借助于下面的<jsp:param>标签实现参数传递-->
jsp:pararm/参数标签:
<!--语法:--> <jsp:param value="jxf" name="name"/> <%-- 传递一个名为name,值为jxf的参数,参数一般作为其他标签的子标签使用--%> <!--结合<jsp:forward>标签用法:--> <jsp:forward page="/MyJsp001.jsp"> <jsp:param value="jxf" name="name"/> </jsp:forward>
jsp:include/包含标签:
<!--语法:--> <jsp:include page="/MyJsp001.jsp"> <jsp:param value="jxf" name="name"/><%--可以将参数传递给包含进来的页面--%> </jsp:include>
与@inclue包含指令的区别:
(1)首先是语法不同:<jsp:include page=“/MyJsp001.jsp”>;<%@inclue file=“被包含的页面”%>
(2)jsp:include可以传递参数,<%@inclue%>不可以
(3)jsp:include:包含页面与被包含页面分别编译为两个java源文件,在运行时引用;<%@inclue%>:包含页面与被包含页面合并编译为一个java源文件
二、JSTL标签
1.什么是JSTL
JSP标准标识库,使用JSTL可实现JSP页面的逻辑处理; 可用于编写各种动态JSP页面
JSTL(Java server pages standarded tag library,即JSP标准标签库)是由JCP(Java community Proces)所制定的标准规范,它主要提供给JavaWeb开发人员一个标准通用的标签库,并由Apache的Jakarta小组来维护。
开发人员可以利用JSTL标签取代JSP页面上的Java代码,从而提高程序的可读性,降低程序的维护难度。
2.JSTL环境搭建
导入jar包文件
- jstl-x.x.jar
在jsp页面添加taglib指令
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
这里的uri 标识符指向jar包的tld文件,prefix为前缀,可以自定义,一般定义为c;也称为c标签
使用JSTL标签
刚才用c作为前缀的,那么直接写<c:标签 , 标签属性>内容</c:标签> 即可
3.条件标签 —if
if标签的几个属性:
test:Boolean类型;决定是否处理标签体的内容,即条件判断
var:String类型;指定变量名,保存test属性的判断结果
scope:String类型;指定var值的作用域范围,默认为page,可选值:page,request,session,application
代码示例:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%--使用tablib指令指向jstl标签库,定义前缀名prefix--%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <html> <head> <title>Title</title> </head> <body> <%-- 在test中可写入条件判断(仅有test支持使用el标签), var定义属性名,scope声明作用范围(默认为page,即PageContext域对象); 将该标签的test返回结果自动赋值给var,再由scope决定哪个域对象可以调用;--%> <c:if test="${10<20}" var="qwe" scope="application"> test判断为true:内容可显示!<br/> </c:if> scope指定了作用域,其他域对象获取不到==> ${pageScope.qwe}<br/> 上面指定的是application应用程序域对象==> ${qwe} </body> </html>
启动服务器,页面显示:
test判断为true:内容可显示! scope指定了作用域,其他域对象获取不到==> 上面指定的是application应用程序域对象==> true
4.迭代标签 —forEach
forEach对Java中的集合与数组进行遍历
forEach标签的几个属性:
(1)items : 获取需要迭代的集合或数组,支持EL表达式;类型为数组,字符串,集合;
(2)var : 定义一个变量,接收循环中获取的数据;不支持EL表达式,类型为String;
(3)varStatus : 获取循环的状态信息,不支持 EL表达式,类型为String;varStatus调用的几个参数:常用index,count
(4)step : 设置迭代的步长,默认为1; 支持EL表达式,类型为int;
(5)end : 设置迭代的结束索引 ,支持EL表达式,类型为int;若指定end属性,则在items的下标到指定end的位置就会结束迭代,若不指定,就全部迭代
(6)begin : 设置迭代的开始索引,支持EL表达式,类型为int;若指定begin属性,则从items的下标为begin的位置开始迭代,若不指定,则全部迭代
代码示例:
<% ArrayList<String> people = new ArrayList<>(); people.add(0, "张三"); people.add(1, "李四"); people.add(2, "王五"); people.add(3, "赵六"); people.add(4, "丁一"); people.add(5, "胡二"); request.setAttribute("list", people); %> <%-- var,每一次遍历出来的变量 items,要遍历的对象 begin, 开始位置 end, 结束位置 step, 步长 --%> <c:forEach var="people" items="${list}"> <c:out value="${people}"/> <br> </c:forEach> <hr> <c:forEach var="people" items="${list}" begin="1" end="3" step="2"> <c:out value="${people}"/> <br> </c:forEach>
5.迭代标签 —forTokens
forTokens 用于迭代分隔字符串
有以下属性:
items:需要进行处理的字符串
delims :分隔符,可以是数字、字符串或特殊字符
var:分隔items的字符串后的定义名
varStatus:当前迭代的状态信息
step: 迭代的步长
begin:设置迭代开始的索引
end:设置迭代结束的索引
代码示例:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%--指定导入的jstl标签库,定义前缀名prefix--%> <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <html> <head> <title>Title</title> </head> <body> <%--forTokens 遍历字符串,进行分割--%> <% String str="学习,forTokens,标,签,Q,WE,R12,3X10:100,500,IO,:,的,"; request.setAttribute("str",str); %> <%--使用forTokens分割字符串--%> <%-- items:需要遍历的字符串; delims:定义分隔符 ; var: 接收每次分割的字符 --%> <c:forTokens items="${str}" delims="," var="ch"> ${ch}<br/> </c:forTokens> </body> </html>
启动服务器,页面显示:
学习 forTokens 标 签 Q WE R12 3X10:100 500 IO : 的