JavaWeb(五)之JSTL标签库

前言

  前面介绍了EL表达式,其实EL表达式基本上是和JSTL核心标签库搭配一起使用才能发挥效果的。接下来让我们一起来认识一下吧!

  在之前我们学过在JSP页面上为了不使用脚本,所以我们有了JSP内置的行为、行为只能提供一小部分的功能,大多数的时候还是会用java脚本,接着就使用了EL表达式,基本上EL表达式看似能满足我们的要求,

  它能够获取各种对象,各种值,并且还不会抛出NullPointerException之类的错误,但是EL表达式功能还是有限,例如不能遍历集合等,因此为了完善JSP,让其完全不使用java代码,就有了jstl标签库,

使用jstl和EL的配合使用,基本上可以实现所有的功能,显示数据,遍历数据等。

一、JSTL概述

1.1、JSTL标签库简介

  JSP虽然为我们提供了EL表达式用来替代JSP表达式,但是由于EL表达式仅仅具有输出功能,而不替代页面中的JSP脚本片段。

  为了方便开发使用Sun公司又定义了一套通用的标签库名为JSTL(JSP Tag Standard Tag Library),里面定义很多我们开发中常用的方法,方便我们使用。JSTL的标准由Sun公司定制,Apache的Jakarta小组负责实现。

  JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能。    

1.2、为什么要使用标签

  JSP是用来显示数据的,前面我们在JSP中的HTML中嵌入java代码,与<%%>等混在一起,可读性和可维护性都很差,而且使用java脚本不便于代码重用,要实现比较复杂的显示功能,

  也不方便,而JSP标签和HTML代码很类似,使用JSP标签显得JSP整洁而干净,可读性好,标签能够重复使用,所以就像我们上面说的,我们慢慢意识到不足,就自然在一步步改进,从使用JSP行为,

  使用EL,在使用标签,都是为了一个目的,让JSP更加完全,方便,只显示数据,而不嵌入逻辑代码。这个涉及到了分层思想,后面说讲解到。

1.3、使用JSTL

  使用JSTL必须在项目中导入两个jar包: 

     taglibs-standard-impl-1.2.1.jar

     taglibs-standard-spec-1.2.5.jar 

  然后还需要在JSP页面中通过taglib标签引入标签库:

     <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

    prefix用来指定前缀名,我们通过该名来使用JSTL

    uri相当于库的唯一标识,因为JSTL由多个不同的库组成,使用该属性指定要导入哪个库。

  使用JSTL

     <c:out value="hello"></c:out>

     这个例子标识,调用前缀为c的标签的out方法,向页面中输出value属性中的字符串。

     JSTL的使用非常像html标签。

  注意:在MyEclipse中使用java5.0版本以上会自动导入jar包

    打开c.tld可以查到uri的地址:http://java.sun.com/jsp/jstl/core

    在JSP中使用JSTL添加这段代码来引包:<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

1.4、JSTL标签库组成

  JSTL由五个不同功能的标签库组成

  介绍JSTL各个标签库:

    1)核心标签库中包含了实现WEB应用中的通用操作的标签。例如,用于输出一个变量内容的<c:out>标签、用于条件判断的<c:if>标签、用于迭代循环的<c:forEach>标签。     2)国际化/格式化标签库中包含实现WEB应用程序的国际化的标签。例如,设置JSP页面的本地信息、设置JSP页面的时区、绑定资源文件,使本地敏感的数据(例如数值、日期等)按照JSP页面中设置的本地格式显示。     3)数据库标签库中包含用于访问数据库和对数据库中的数据进行操作的标签。例如,从数据源中获得数据库连接、从数据库表中检索数据等。由于在软件分层的开发模型中,JSP页面仅用作表现层,

          我们一般不在JSP页面中直接操作数据库,而是在业务逻辑层或数据访问层操作数据库,所以,JSTL中提供的这套数据库标签库没有多大的实用价值。     4)XML标签库中包含对XML文档中的数据进行操作的标签。例如,解析XML文档、输出XML文档中的内容,以及迭代处理XML文档中的元素。

       因为XML广泛应用于WEB开发,对XML文档的处理非常重要,XML标签库使处理XML文档变得简单方便,这也是JSTL的一个重要特征。      5)JSTL中提供的一套EL自定义函数包含了JSP页面制作者经常要用到的字符串操作。例如,提取字符串中的子字符串、获取字符串的长度和处理字符串中的空格等。

二、core标签库

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

讲解<c:out/>、<c:set/>、<c:remove/>、<c:if  test=""/>、<c:choose  />、<c:forTokens />、<c:catch /> 、<c:url  />、 <c:redirect />、<c:forEach/>

2.1、<c:out/>标签

  out :将指定内容输出到浏览器,默认支持el表达式。

  格式: 

    <c:out value="" default="" escapeXml />

      value:输出的值,可以为EL表达式

      default:如果value属性的值不存在,会输出default属性值

      excapeXml:如果为true,则会为value中的特殊字符进行转义,默认为true。

  举例:

    <c:out value="faker"></c:out><br />
    <c:out value="${empty eng}"></c:out><br />    
    <c:out value="${eng}" default="没有eng对象"></c:out>    <br />
    <c:out value="<a>我是妞妞妞</a>" escapeXml="false"></c:out><br />    

  结果:

2.2、<c:set/>和<c:remove/>标签

  1)<c:set/>

  set标签:给指定作用域设置内容

  格式一:

    <c:set   value=" "  var=" "   scope=" " />

      value:设置值

      var:设置属性

      scope:设置作用域(page、reqeust、session、application)

  注:其实作用就相当于pageContext.setAttribute(var,value,scope);

  举例:

  结果:

  图中只介绍set标签的一种用法,其中var不能接受EL表达式,只能是字符.

  格式二: 

    <c:set target="" property="" value="" />

      target:跟var类似,但是它能够接受EL表达式,可以是一个对象,一个map等,和var进行互补。(要修改的域对象的属性名(必须是JavaBean或者Map)

      property:对象中的属性名 

      value:属性赋值

  举例:

    使用哪种set标签,就看自己的需求了。

  2)<c:remove/>标签

2.3、<c:if  test=""/>标签

  <c:if>用于实现if语句的判断功能

  格式:

    <c:if test=" " var=" " scope=" "></c:if>    

      test:设置if判断的条件,用于判断标签体是否被执行(参数类型:boolean)

      var:用于指定接收判断结果的变量名(参数类型:boolean)

      scope:指定判断结果保存到哪个域(参数类型:String)

  举例:  

    <c:set var="loginUser" value="angelbaby" scope="session"></c:set>
    <c:if test="${not empty sessionScope.loginUser }"> <%--当loginUser不为空时返回true-->
        欢迎angelbaby
    </c:if>
    <c:if test="${empty sessionScope.loginUser }">
        <a href="">登录</a>
    </c:if>

2.4、<c:choose  />、<c:when>、<c:otherwise>标签 

  <c:choose>、<c:when>、<c:otherwise>三个标签配合使用,功能类似于Java中的if/else

   <c:choose>是<c:when>和<c:otherwise>的父标签

   <c:when>的属性

    test:用于设置判断条件,若正确则c:when中的代码执行,否则不执行(参数类型:boolean)

   <c:otherwise>

    作用:如果所有的<c:when>都没有执行则执行<c:otherwise>的标签体

  举例1:

  举例2:

<c:choose>
  <c:when test="${param.age>=18 }">
      您已经成年
  </c:when>
  <c:otherwise>
      您未成年
  </c:otherwise>
</c:choose>

 2.5、<c:forEach/>标签

  <c:forEach>用于对多个对象的集合进行迭代,重复执行标签体,或者重复迭代固定的次数。(增强的for循环)

  格式:

    <c:forEach items="" var="" />

 var:用于存放遍历的每一项内容,存放在page作用域,只能在循环体中使用(也就是设置遍历出对象的名称)(参数类型:String)

 items:需要遍历的对象(参数类型:数组、字符串和各种集合)

  举例:

    1)items为字符串或字符串数组

      为字符串,直接输出。为字符串数组,遍历输出

      结果:

    2)items为list集合

      结果:

    3)items为map集合

      结果:

    4)普通for循环

        begin:从1开始

        end:到10结束

        step:每次加2

        var:循环的变量

2.6、<c:forTokens > 标签

  将自定义字符串,按照指定字符进行分割,并遍历输出

  格式:

    <c:forTokens items="" delims="" var=""></c:forTokens>

      items:自定义字符串

      delims:指定字符

      var:遍历的变量名。

  举例:

    结果:

2.7、<c:catch > 标签

  相当于try catch

  格式:

    var:捕捉后的异常对象

  举例:

    结果:

2.8、<c:url  />标签

  记得讲session的时候,如果cookie禁用了,那么只能将url进行重写才能让session继续生效,而使用的api是response.encodeURL();就是将SESSIONID当作参数带过来,而url标签的作用就是实现类似功能

  格式:

    <c:url value="" var="" scope="" />

      value:设置要处理的URI地址,注意这里要以/开头(可接受参数:String)  

      var:如果写了该变量,那么就会将其重写后的url存入page作用域中,如果scope没有的话,默认就是page,否则以scope属性值为准,在作用域范围内就可以直接拿着这个变量使用了。(修改后存储到域对象中的uri属性名)

      scope:作用域范围,默认是page。( 可接受参数:String)

  举例:

    测试:

      访问后点击超链接

      没有关闭cookie,所以不会将SESSIONID写入url中 。

2.9、<c:redirect />标签

   <c:redirect>主要用于将请求重定向到另一个资源地址

  格式:

    uri:指定要重定向到的目标地址,注意这里指定绝对路径会自动加上项目名( 参数类型:String)

  举例:

2.10、<c:import />标签

  类似于JSP的include行为和include指令,JSTL也提供了include功能的标签<c:import/>,不过import标签功能更强大,甚至可以把Internet上的网页包含进来。

  <c:import url="http://www.baidu.com" charEncoding="utf-8"/>

  举例:

  结果:

三、fmt标签库

3.1、fmt标签库概述

  为了简化WEB应用的国际化开发,JSTL中提供了一个用于实现国际化和格式化功能的标签库,我们将其简称为国际化标签库,JSP规范为国际化标签库建议的前缀名为fmt。

  国际化标签库中包括了一组用于实现WEB国际化功能的标签,这组标签封装了Java语言中java.util和java.text这两个包中与国际化相关的API类的功能。

  国际化标签库中提供了绑定资源包和从资源包中的本地资源文件内读取文本内容的标签,也提供了对数值和日期等本地敏感的数据按本地化信息进行显示和解析的标签,还提供了按本地特定的时区来调整时间的标签。  

3.2、fmt的使用

  使用前:

    <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>

  这个标签库其实用的不多,我们就简单介绍一下

  1)<fmt:requestEncoding/>设置编码

    标签只有一个属性,value

    相当于Java中的request.setCharacterEncoding("");

    post提交中文参数,使用<fmt:requestEncoding value="utf-8"/>来设置编码,就不会出现中文乱码了。

    get提交中文参数,该标签就会失效,除非到TOMCAT的server.xml中,将URLEncoding设置为UTF-8(默认为ISO-8859-1)。

  2)<fmt:setLocale/>显示所有地区的数据格式

大概就讲这些了,如果要用的话,到时候在详细查资料!喜欢 就点个“推荐”哦!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Play & Scala 技术分享

PlayScala实战 - 如何优雅地取出多层Future中的结果?

32750
来自专栏Golang语言社区

【Go 语言社区】并发性

并发性 并发的特点是需要锁Lock和互斥Mutex。在Java中加锁和解锁是一个复杂过程代码如下: try { mutex.acquire(); try...

370110
来自专栏贺贺的前端工程师之路

ES6特性-Generators

你可以将Generators认为是可以中断进程、恢复进程的代码段,like this:

7520
来自专栏Spring相关

第7章—SpringMVC高级技术—处理multipart形式的数据

MultipartResolver 用于处理文件上传,当收到请求时 DispatcherServlet 的 checkMultipart() 方法会调用 Mul...

35620
来自专栏北京马哥教育

shell脚本编程之终端打印

echo是用于终端打印的操作。默认情况下,echo在每次调用后添加一个换行符。 下面三条命令输出一样 html] view plain copy echo "...

29760
来自专栏达摩兵的技术空间

享元模式解读(1)

本文是基于《javascript设计模式与开发实践》的享元模式相关章节整理实践而出,建议阅读时间为15-25min.

10130
来自专栏帘卷西风的专栏

linux下shell技巧

    经常看到一些大牛操作linux的时候,双手运指如飞,指令如流水般输出,会不会感到羡慕呢?

10310
来自专栏macOS 开发学习

Swift 日常使用Tip

Swift中的Struct都有个系统提供默认的包含所有成员遍量的init方法,如果我们添加自定义的init方法时,系统默认提供的就会消失,如果需要既可以保留系统...

8630
来自专栏大内老A

三种属性操作性能比较:PropertyInfo + Expression Tree + Delegate.CreateDelegate

《上篇》主要介绍如何通过DataBinder实现批量的数据绑定,以及如何解决常见的数据绑定问题,比如数据的格式化。接下来,我们主要来谈谈DataBinder的设...

239100
来自专栏Golang语言社区

Go Channel 详解

Channel是Go中的一个核心类型,你可以把它看成一个管道,通过它并发核心单元就可以发送或者接收数据进行通讯(communication)。

27020

扫码关注云+社区

领取腾讯云代金券