JSTL ---[什么是JSTL,JSTL标签]

Posted 小智RE0

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JSTL ---[什么是JSTL,JSTL标签]相关的知识,希望对你有一定的参考价值。



什么是JSTL

JSP标准标识库,使用JSTL可实现JSP页面的逻辑处理; 可用于编写各种动态JSP页面.

JSTL(Java server pages standarded tag library,即JSP标准标签库)是由JCP(Java community Proces)所制定的标准规范,它主要提供给Java Web开发人员一个标准通用的标签库,并由Apache的Jakarta小组来维护。开发人员可以利用这些标签取代JSP页面上的Java代码,从而提高程序的可读性,降低程序的维护难度。

JSTL环境搭建

  • 导入jar包文件;

  • 在jsp页面添加taglib指令
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

这里的uri 标识符指向jar包的tld文件,prefix为前缀,可以自定义,一般定义为c;也称为c标签

  • 使用JSTL标签

刚才用c作为前缀的,那么直接写<c:标签 , 标签属性>内容</c:标签> 即可


条件标签 —if

if标签的几个属性
test中可写入条件判断(仅有test支持使用el标签);
var定义属性名(用于保存test中的判断结果),scope声明作用范围(默认为page,即PageContext域对象);
将该标签的test返回结果自动赋值给var,再由scope决定哪个域对象可以调用;

属性类型是否用EL表达式`说明
testBoolean决定是否处理标签体的内容,即条件判断
varString指定变量名,保存test属性的判断结果
scopeString指定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

迭代标签 —forEach

forEach对Java中的集合与数组进行遍历

forEach标签的几个属性:

(1)items : 获取需要迭代的集合或数组,支持EL表达式;类型为数组,字符串,集合;

(2)var : 定义一个变量,接收循环中获取的数据;不支持EL表达式,类型为String;

(3)varStatus : 获取循环的状态信息,不支持 EL表达式,类型为String;
varStatus调用的几个参数:常用index,count

参数描述getter
current迭代的集合/数组的项getCurrent( )
index从0开始的迭代索引值getIndex( )
count从1开始的计数序号getCount( )
first判断当前是否为第一个,返回布尔值isFirst( )
last判断当前是否为最后一个,返回布尔值isLast( )
begin迭代的起始索引,对应<c:forEach 设置的begin属性值>getBegin( )
end迭代的最终索引,对应<c:forEach 设置的end属性值>getEnd( )
step迭代的步长,对应<c:forEach设置的step属性值>getStep( )

(4)step : 设置迭代的步长,默认为1; 支持EL表达式,类型为int;

(5)end : 设置迭代的结束索引 ,支持EL表达式,类型为int;

若指定end属性,则在items的下标到指定end的位置就会结束迭代,若不指定,就全部迭代

(6)begin : 设置迭代的开始索引,支持EL表达式,类型为int;

若指定begin属性,则从items的下标为begin的位置开始迭代,若不指定,则全部迭代


案例练习:
  • 遍历集合中的数据

创建Person类

public class Person {
    //定义姓名年龄属性;
    private String name;
    private int age;
    //有参构造方法;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    //getter,setter方法;

    public String getName() {
        System.out.println("获取姓名方法");
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        System.out.println("获取年龄方法");
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

jsp文件

<%@ page import="com.xiaozhi.bean.Person" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ 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>
<%--forEach 对集合数据遍历--%>

<%--实际上此处的请求对象属性设置位于servlet;--%>
<%
    //将Person类的对象存入集合;
    List<Person> personList = new ArrayList<>();
    //创建几个对象;
    for (int i = 0; i <15; i++) {
        Person person=new Person(i+"号人类",50+i);
        personList.add(person);
    }
    //将集合的存入请求对象的personList属性中;
    request.setAttribute("personList",personList);
%>

<table width="600px" align="center" border="1">
    <tr>
        <td>索引(0开始)</td>
        <td>序号(1开始)</td>
        <td>是否为第一个</td>
        <td>是否为最后一个</td>
        <td>姓名</td>
        <td>年龄</td>
    </tr>
    <%--使用forEach标签--%>
    <%--items:获取需要迭代的集合; var:接收每次迭代的数据; varStatus:循环状态信息;
     step:设置迭代步长(默认为1); begin:设置迭代开始的索引; end:设置迭代结束的索引;
    --%>
    <c:forEach var="person" items="${personList}" varStatus="psStatus">
        <tr>
            <td>${psStatus.index}</td>
            <td>${psStatus.count}</td>
            <td>${psStatus.first}</td>
            <td>${psStatus.last}</td>
            <td>${person.name}</td>
            <td>${person.age}</td>
        </tr>
    </c:forEach>
</table>
</body>
</html>

启动服务器,页面的表格已填写数据;

设置属性 步长step="2",开始迭代位置 begin="4";结束迭代位置 end="14"

.....................
   <c:forEach var="person" items="${personList}" varStatus="psStatus" step="2" begin="4" end="14">
.....................

启动服务器,


  • 遍历数组中的数据
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--指向导入的jstl标签库,定义前缀名perfix--%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
    <title>Title</title>
</head>
<body>

<%--定义数组--%>
<%
    String[] name={"张三","李四","阿杰","赵五"};
    request.setAttribute("name",name);
%>
<%--遍历数组中数据--%>
<%--items:获取需要迭代的数组, var:接收每次迭代的数据; varStatus:迭代的状态
varStatus的参数 index 返回当前迭代的索引,0开始;
--%>
<c:forEach items="${name}" var="value" varStatus="arrayStatus">
数组元素:${arrayStatus.index}==>${value} <br/>
</c:forEach>
</body>
</html>

启动服务器


迭代标签 —forTokens

forTokens 用于迭代分隔字符串

有几个属性类似于forEach,属性delims为分隔符.

属性注释
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>

启动服务器;字符串已被分隔输出;


格式化日期标签 —formatDate

注意在使用taglib指令时,指定导入的标签库不是使用之前的;且前缀名prefix一般命名为fmt

<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
属性注释
valueDate类型,指定要格式化的目标;
pattern自定义的日期格式,例如:yyyy-MM-dd HH:mm:ss;(不考虑多种语言时可使用pattern)
var存储格式化日期的变量名
type值:time或date或both。控制仅出现时间,仅出现日期,或者都出现
dateStyle指定日期显示格式, 值:SHORT,MEDIUM,LONG,FULL(默认)
timeStyle指定时间显示格式 , 值:SHORT,MEDIUM,LONG,FULL(默认)
scope存储格式化日志变量的范围

案例练习

<%@ page import="java.util.Date" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--指定导入的jstl标签库;定义前缀名prefix--%>
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<html>
<head>
    <title>Title</title>
</head>
<body>

<%--将当前时间赋值给请求对象的自定义属性now;--%>
<%
  request.setAttribute("now",new Date());
%>
<%--value: 指定要格式化的目标, pattern:设置格式化的格式(规则)--%>
<fmt:formatDate value="${now}" pattern="yyyy年MM月dd日 HH时mm分ss秒"/>
</body>
</html>

启动服务器,页面输出为

20210812123045

以上是关于JSTL ---[什么是JSTL,JSTL标签]的主要内容,如果未能解决你的问题,请参考以下文章