> 文档中心 > JSTL标签库 | 深入解析JSTL标签库

JSTL标签库 | 深入解析JSTL标签库

目录

一:深入解析JSTL标签库 

1、什么是JSTL标签库

2、使用JSTL标签库的步骤 

3、JSTL标签的原理

4、jstl中的核心标签库core当中常用的标签


一:深入解析JSTL标签库 

1、什么是JSTL标签库

①Java Standard Tag Lib(Java标准的标签库)。

JSTL标签库通常结合EL表达式一起使用,目的是让JSP中的java代码消失

标签是写在JSP当中的,但实际上最终还是要执行对应的java程序(java程序在jar包当中)

2、使用JSTL标签库的步骤 

第一步:引入JSTL标签库对应的jar包

(1)tomcat9之前引入的jar包是:

①taglibs-standard-impl-1.2.5.jar

②taglibs-standard-spec-1.2.5.jar

(2)tomcat10之后引入的jar包是:

①jakarta.servlet.jsp.jstl-2.0.0.jar

②jakarta.servlet.jsp.jstl-api-2.0.0.jar

(3)在IDEA当中怎么引入?

①在WEB-INF下新建lib目录,然后将jar包拷贝到lib当中,选中两个jar包右击鼠标,点击“Add Lib...”进行添加。

②一定是要和mysql的数据库驱动一样,都是放在WEB-INF/lib目录下的。

③什么时候需要将jar包放到WEB-INF/lib目录下?如果这个jar是tomcat服务器没有的。

第二步:在JSP中引入要使用标签库

①使用taglib指令引入标签库

②JSTL提供了很多种标签,重点掌握核心标签库 :http://java.sun.com/jsp/jstl/core

③语法格式如下:

prefix="起的名字,核心标签库,一般默认叫做c,可随意。"

uri=http://java.sun.com/jsp/jstl/core 表示使用的是这个库

第三步: 在需要使用标签的位置使用即可

①表面使用的是标签,底层实际上还是java程序 。

②例如: 实际上对应的就是一个java类。

3、JSTL标签的原理

以上uri后面的路径实际上指向了一个xxx.tld文件。鼠标停留在路径上,按ctr键就会自动显示对应的xxx.tld文件,例如:C:\Users\86177\IdeaProjects\JavaWeb\jsp\web\WEB-INF\lib\taglibs-standard-impl-1.2.5.jar!\META-INF\c.tld

tld文件实际上是一个xml配置文件,在tld文件中描述了“标签”和“java类”之间的关系
以上核心标签库对应的tld文件是:c.tld文件。它在taglibs-standard-impl-1.2.5.jar里面META-INF目录下,有一个c.tld文件。

 ③以里面的catch标签为例,进行源码分析

   对标签的描述     Catches any Throwable that occurs in its body and optionally     exposes it.  catch 标签的名字      org.apache.taglibs.standard.tag.common.core.CatchTag  标签对应的java类 JSP标签体当中可以出现的内容,如果是JSP,就表示标签体中可以出现符合JSP所有语法的代码。例如EL表达式(属于JSP的)。   属性      对这个属性的描述  Name of the exported scoped variable for the  exception thrown from a nested action. The type of the  scoped variable is the type of the exception thrown.          var 属性名     false false表示该属性不是必须的。true表示该属性是必须的。     false 这个描述说明了该属性是否支持EL表达式。false表示不支持。true表示支持EL表达式。     

④所以对于catch标签的语法格式如下:

JSP....

 ⑤以foreach标签进行举例说明,通过源码分析,发现foreach标签有一个items属性,这个属性是可以指向一个集合的,并且也支持EL表达式;还有一个var属性,var后面的名字是随意的,var属性代表的是集合中的每一个元素。

⑥所以现在就可以使用EL表达式来代替我们原来我们用java代码使用增强for循环取出数据的过程!

<%    // 创建List集合    List stuList = new ArrayList();    // 创建Student对象    Student s1 = new Student("110", "经常");    Student s2 = new Student("120", "救护车");    Student s3 = new Student("119", "消防车");    // 添加到List集合中    stuList.add(s1);    stuList.add(s2);    stuList.add(s3);    // 将list集合存储到request域当中    request.setAttribute("stuList", stuList);%><%    /// 从域中获取List集合    List stus = (List)request.getAttribute("stuList");    // 编写for循环遍历list集合    for(Student stu: stus){%>    id:,name:
id:${s.id},name:${s.name}

⑦进行测试访问:http://localhost:8080/jsp/17.jsp 发现这两种方式都能取出数据!

4、jstl中的核心标签库core当中常用的标签

(1)if标签

①语法格式: 。

test属性是必须的,test属性支持EL表达式;test属性值只能是boolean类型

③if标签还有var属性,不是必须的;v变量中存储的是test属性的值。

④还有scope属性,用来指定var的存储域,也不是必须的。scope有四个值可选:page(pageContext域)、request(request域)、session(session域)、application(application域)

    

用户名不能为空

欢迎${param.username}登录

${v}

😊发送请求http://localhost:8080/jsp/18.jsp​​​​​​ ,前端没有传入username,后端就取不到数据,调用隐式对象param.username返回的就是一个false;所以变量v取出来的也就是false

😊发送请求http://localhost:8080/jsp/18.jsp?username=zhangsan,前端传入username为张三,后端就能取到数据,调用隐式对象param.username返回的就是一个true;所以变量v取出来的也就是true

(2)forEach标签

① ${i} ;var用来指定循环中的变量;begin开始;end结束;step步长。forEach底层实际上会将i存储到pageContext域当中;因为EL表达式只能从某个域当中取数据!

         ${i} 

执行结果如下:

②varStatus属性:表示var的状态对象,这里是一个java对象,这个java对象代表了var的状态;并且varStatus这个状态对象有count属性,可以直接使用

<%    // 创建List集合    List stuList = new ArrayList();    // 创建Student对象    Student s1 = new Student("110", "经常");    Student s2 = new Student("120", "救护车");    Student s3 = new Student("119", "消防车");    // 添加到List集合中    stuList.add(s1);    stuList.add(s2);    stuList.add(s3);    // 将list集合存储到request域当中    request.setAttribute("stuList", stuList);%>        编号:${stuStatus.count}  ,id:${s.id},name:${s.name} 

执行结果:

(3)choose-when-otherwise

①这实际上是一个嵌套结构,语法格式是固定的,不能随意使用!

    <c:when test="${param.age  青少年        <c:when test="${param.age  青年        <c:when test="${param.age  中年         老年    

执行结果: