程序媛JavaEE第六章JSP-JSTL-超详细教程

JSTL

问题

使用Servlet进行请求处理

  • 使用JSP将请求处理的结果展示在jsp页面
  • 使用EL表达式获取并输出域对象中数据
  • 但是如果要循环输出一个list集合的数据,得在jsp页面使用<%%>java小脚本的形式 写java代码来完成!比较麻烦!

解决

  •  使用JSTL标签来完成,例如:循环、判断等情况的与数据输出
  • JSTL的作用:替换在Jsp中声明的Java逻辑代码(el表达式只是取出域对象中数据,而jstl是对数据进行各种处理,所以jstl是辅助el的)

介绍

  •  JSTL标签库是第三方发明的自定义的标签,每个标签都有自己特定的含义,表示一个具体的java逻辑。
  • 要在JSP中 使用JSTL 必须使用taglib标签 引入第三方的标签库资源。 ​
  • 标签库的内容有:
  1. 核心标签库

  2. SQL标签库

  3. 函数标签库

  4. XML标签库

  5. 格式化标签库

核心标签库

Oracle Java Technologies | OracleOracle Java Technologies | Oracleicon-default.png?t=N7T8http://java.sun.com/jsp/jstl/core Oracle Java Technologies | Oracle

  •  包含 Web 应用的常见工作,比如:循环、表达式赋值、基本输入输出等。

格式化标签库

Oracle Java Technologies | OracleOracle Java Technologies | Oracleicon-default.png?t=N7T8http://java.sun.com/jsp/jstl/fmt Oracle Java Technologies | Oracle


JSTL的使用

使用步骤:

  1. 在项目中导入JSTL的jar包

  2. 在jsp页面中通过taglib指令引入jstl标签库

  3. 使用jstl标签完成开发

  •  为了在 JSP 页面使用 JSTL 类库,必须以下列格式使用 taglib 指令标签:
<%@taglib uri="" prefix="" %>
  • uri:要使用的jstl库的地址
  • prefix:用来自定义标签的前缀,通过前缀去操作库中的标签。(类似于SQL语句中 表的别名)
  • 例如:
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
  • 前缀可以是任意内容
  • 建议使用:使用核心库,前缀一般使用c;使用格式化库,前缀一般是fmt。
  • 对应jar包

  • 从Apache的标准标签库中下载的二进包
  • 官方下载地址:Index of /dist/jakarta/taglibs/standard/binaries
  • 下载 jakarta-taglibs-standard-1.1.2.zip 包并解压,将 jakarta-taglibs-standard-1.1.2/lib/ 下的两个 jar 文件:standard.jarjstl.jar 文件拷贝到项目的指定目录下。
条件动作标签
  • 条件动作指令用于处理 页面的输出结果 依赖于某些输入值的情况
  • 在 Java 中:利用 if、 if…else 和 switch 语句来进行处理
  • 在 JSTL 中:也有 4 个标签可以执行条件式动作指令:if、 choose、when 和 otherwise。
if 标签
  • if 标签:先对某个条件进行测试,如果该条件运算结果为 true, 则处理它的主体内容
  • 测试结果保存在一个 Boolean 对象中,并创建一个限域变量来引用 Boolean 对象。
  • 可以利用 var 属性设置限域变量名,利用 scope 属性来指定其作用范围。

语法格式

<c:if test="<boolean>" var="<string>" scope="<string>">
   ...
</c:if>

属性

  • if 标签有如下属性:
属性描述是否必要默认值
test条件
var用于存储条件结果的变量(限域变量名)
scope

var属性的作用域

可取值:page|request|session|application

page

示例

<%--
  Created by IntelliJ IDEA.
  User: gym
  Date: 2024/7/19
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>条件动作标签</title>
</head>
<body>
<%---------------------if条件标签------------------%>
<%
    // 在request作用域中存储数据:
    request.setAttribute("score",95);
%>
<%--如果成绩在60分以上 则及格:--%>
<c:if test="${score >= 60}">
    及格!
</c:if>
<c:if test="${score < 60}">
    不及格!
</c:if>
<%--var scope属性:
    var:接收test表达式的结果(true或者false)
    scope:代表var变量的作用域
 --%>
<c:if test="${score >= 60}" var="flag" scope="request">
    <%--
    也可以实现服务器的跳转:类似请求转发
    <jsp:forward page="index.jsp"></jsp:forward>
    --%>
</c:if>
</body>
</html>
  • 注: JSTL中没有else标签,为了模拟 else 的情景,需要使用两个 if 标签,并且这两个标签为相反的条件。
choose、when 和 otherwise 标签
  • choose 和 when 标签的作用与 Java 中的 switch 和 case 关键字相似,用于在多选项中做选择。
  • switch语句中有case,而choose标签中对应有when
  • switch语句中有default,而choose标签中有otherwise。
  • 语法格式
<c:choose>
    <c:when test="<boolean>">
        ...
    </c:when>
    <c:when test="<boolean>">
        ...
    </c:when>
    ...
    ...
    <c:otherwise>
        ...
    </c:otherwise>
</c:choose>

属性

  • choose标签没有属性。

  • when标签只有一个test属性。

  • otherwise标签没有属性。

示例

<%-------------choose、when 和 otherwise 标签-------------%>
<c:choose>
    <c:when test="${score>=85}">
        A
    </c:when>
    <c:when test="${score<85&&score>=70}">
        B
    </c:when>
    <c:when test="${score<75&&score>=60}">
        C
    </c:when>
    <c:otherwise>
        D
    </c:otherwise>
</c:choose>

注意点

  • choose标签和otherwise标签没有属性,而when标签必须设置test属性

  • choose标签中必须有至少一个when标签,可以没有otherwise标签

  • otherwise标签必须放在最后一个when标签之后

  • choose标签中只能有when标签和otherwise标签,when标签和otherwise标签可以嵌套其他标签

  • otherwise标签在所有的when标签不执行的情况下才会执行

  • 注意:如果不想每次改动jsp都要重启服务器或者重新部署,可以配置以下内容:
  • 这个配置只对jsp生效,如果更改servlet还是需要重启的

迭代标签
  • forEach 是将一个主体内容迭代多次,或者迭代一个对象集合。
  • 可以迭代的对象包括所有的 java.util.Collection 和 java.util.Map 接口的实现
  • 以及对象或者基本类型的数组。
  • 还可以迭代 java.util.Iterator 和 java.util.Enumeration
  • 不能在多个动作指令中使用 Iterator 或者 Enumeration,因为 Iterator 或者 Enumeration 都不能重置(reset)。 
forEach标签

语法格式

<c:forEach
    items="<object>"
    begin="<int>"
    end="<int>"
    step="<int>"
    var="<string>"
</c:forEach> 

属性

属性描述是否必要默认值
items要被循环的数据
begin开始的元素(0=第一个元素,1=第二个元素)0
end最后一个元素(0=第一个元素,1=第二个元素)Last element
step每一次迭代的步长1
var代表当前条目的变量名称

示例

1.遍历主体内容多次

<c:forEach var="限域变量名" begin="开始数" end="结束数" step="迭代数" >

</c:forEach>

相当于java的for循环:

for(int i = 0; i < 10; i++) {}

如下:

<%--
  Created by IntelliJ IDEA.
  User: gym
  Date: 2024/7/19
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>foreach迭代标签</title>
</head>
<body>
<%--输出0-10--%>
<c:forEach var="i" begin="0" end="10">
    ${i}
</c:forEach>
<hr>
<%--输出0-10偶数--%>
<c:forEach var="i" begin="0" end="10" step="2">
    ${i}
</c:forEach>
</body>
</html>

2.循环

<c:forEach items="被循环的集合" var="限域变量名">
					
</c:forEach>

相当于java的foreach循环:

for(String str : list) {

}

如下:

<%----------------类似于增强for循环----------------%>
<%
    //储存字符串
    request.setAttribute("str1","java,html,js,jsp");
    request.setAttribute("str2","java#html#js#jsp");
%>
<%--遍历字符串(拼接的符号是逗号):--%>
<c:forEach items="${str1}" var="i">
    ${i}--->
</c:forEach>
<hr>
<%--遍历字符串(拼接的符号是#):delims表示分隔符号:--%>
<c:forTokens items="${str2}" delims="#" var="i">
    ${i}--->
</c:forTokens>


<%
    //存储数组
    String[] str3 = {"java","css","servlet"};
    request.setAttribute("str3",str3);
%>
<%--对数组进行遍历:--%>
<c:forEach items="${str3}" var="i">
    ${i}--->
</c:forEach>
<hr>


<%
    //存储list
    List<String> list = new ArrayList<>();
    list.add("aaa");
    list.add("bbb");
    list.add("ccc");
    request.setAttribute("list",list);
%>
<%--对List集合进行遍历:--%>
<c:forEach items="${list}" var="i">
    ${i}--->
</c:forEach>
<hr>

<%
    //存储map
    Map map = new HashMap<>();
    map.put("a","1111");
    map.put("b","2222");
    map.put("c","3333");
    request.setAttribute("map",map);
%>
<%--对Map集合进行遍历:--%>
<c:forEach items="${map}" var="i">
    ${i}--->${i.key}--->${i.value}
</c:forEach>
格式化动作标签
  • JSTL 提供了格式化和解析数字日期的标签,如:formatNumber、formatDate、parseNumber及parseDate。
formatNumber标签
  • formatNumber标签用于格式化数字,百分比,货币。
  • 该标签用指定的格式或精度来格式化数字。(将数值型数据转换成指定格式的字符串类型。)

语法格式

<fmt:formatNumber
  value="<string>"
  type="<string>"
  var="<string>"
  scope="<string>"/>

属性

属性描述是否必要默认值
value要显示的数字
typeNUMBER,CURRENCY,或 PERCENT类型Number
var存储格式化数字的变量Print to page
scopevar属性的作用域page
  • 注意:
  1. 如果设置了var属性,则格式化后的结果不会输出,需要通过el表达式获取var对应的限域变量名

  2. 默认的类型(type)的取值为number。可取值:number数值型、percent百分比类型、currency货币型 ​

示例

<%--
  Created by IntelliJ IDEA.
  User: gym
  Date: 2024/7/19
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
    <title>格式化动作标签</title>
</head>
<body>
<%--
    value:要处理的数据
    type:数据要处理为哪种类型
    var:数据用var里面指定的变量做接收
    如果设置了var属性 则格式化后的结果不会输出 要通过el表达式获取var对应的限域变量名
    如果没有设置var属性 可以自动输出结果
    scope:变量作用域:4个作用域
--%>
<%--用EL表达式获取--%>
<fmt:formatNumber value="10" type="number" var="num"/>${num}<br>
<%--数值--%>
<fmt:formatNumber value="10" type="number"/><br>
<%--百分比--%>
<fmt:formatNumber value="10" type="percent"/><br>
<%--货币¥--%>
<fmt:formatNumber value="10" type="currency"/><br>
<%--设置时区--%>
<fmt:setLocale value="en_US"/>
<%--US货币$--%>
<fmt:formatNumber value="10" type="currency"/>
</body>
</html>

结果:

formatDate标签
  • formatDate标签用于使用不同的方式格式化日期。(将Date型数据转换成指定格式的字符串类型。)

语法格式

<fmt:formatDate
  value="<string>"
  type="<string>"
  dateStyle="<string>"
  timeStyle="<string>"
  pattern="<string>"
  timeZone="<string>"
  var="<string>"
  scope="<string>"/>

属性

属性描述是否必要默认值
value要显示的日期
typeDATE, TIME, 或 BOTHdate
dateStyleFULL, LONG, MEDIUM, SHORT, 或 DEFAULTdefault
timeStyleFULL, LONG, MEDIUM, SHORT, 或 DEFAULTdefault
pattern自定义格式模式
timeZone显示日期的时区默认时区
var存储格式化日期的变量名显示在页面
scope存储格式化日志变量的范围页面

标签格式模式

代码描述实例
y不包含纪元的年份。如果不包含纪元的年份小于 10,则显示不具有前导零的年份。2002
M月份数字。一位数的月份没有前导零。April & 04
d月中的某一天。一位数的日期没有前导零。20
h12 小时制的小时。一位数的小时数没有前导零。12
H24 小时制的小时。一位数的小时数没有前导零。0
m分钟。一位数的分钟数没有前导零。45
s秒。一位数的秒数没有前导零。52

示例

<%----------------------formatDate-------------------%>
<%
    // 在作用域中存储日期:
    request.setAttribute("date",new Date());
%>
<%--将日期从作用域中取出:--%>
${date}<br>
<fmt:formatDate value="${date}" pattern="yyyy-MM-dd"/><br>
<fmt:formatDate value="${date}" pattern="yyyy年MM月dd日"/>
结果:

parseNumber标签
  • parseNumber标签用来解析数字,百分数,货币。(parseNumber 标签可以将数字、货币或百分比类型的字符串转换成数值型)

语法格式

<fmt:parseNumber
  value="<string>"
  type="<string>"
  var="<string>"
  scope="<string>"/>

属性

属性描述是否必要默认值
value要解析的数字Body
typeNUMBER,,CURRENCY,或 PERCENTnumber
var存储待解析数字的变量Print to page
scopevar属性的作用域page

示例

<%----------------------parseNumber-------------------%>
<fmt:parseNumber value="100"/> <br>
<fmt:parseNumber value="100" type="number"/> <br>
<fmt:parseNumber value="100%" type="percent"/> <br>
<fmt:parseNumber value="$10.00" type="currency"/> <br>
结果:

parseDate标签
  • parseDate标签用于解析日期。(将指定格式的字符串转换成Date类型。)

语法格式

<fmt:parseDate
   value="<string>"
   type="<string>"
   dateStyle="<string>"
   timeStyle="<string>"
   pattern="<string>"
   var="<string>"
   scope="<string>"/>

属性

属性描述是否必要默认值
value要显示的日期
typeDATE, TIME, 或 BOTHdate
dateStyleFULL, LONG, MEDIUM, SHORT, 或 DEFAULTdefault
timeStyleFULL, LONG, MEDIUM, SHORT, 或 DEFAULTdefault
pattern自定义格式模式
var存储格式化日期的变量名显示在页面
scope存储格式化日志变量的范围页面

示例

<%----------------------parseDate-------------------%>
<fmt:parseDate value="2003/10/18" pattern="yyyy/MM/dd" />

结果:

  • 总结
  • formatNumber:将数值 转换为 指定格式的字符串
  • formatDate:将Date数据转换为 指定格式的字符串
  • parseNumber:将不同类型的字符串 转换为 数值类型
  • parseDate:将不同类型的字符串 转换为 Date类型
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值