浅谈JSP之JSTL

举报
运气男孩 发表于 2021/12/05 22:41:21 2021/12/05
【摘要】 简介JSTL的英文全称是JavaServer Pages Standard Tag Library,中文全称是JSP标准标识库。JSTL技术标准是由JCP(lava Community Process)组织的JSR052专家组发布,Apache组织将其列入Jakarta项目,Sun公司将JSTL的程序包加入互联网服务开发工具包内(Web Services Developer Pack(WSD...

简介

JSTL的英文全称是JavaServer Pages Standard Tag Library,中文全称是JSP标准标识库。JSTL技术标准是由JCP(lava Community Process)组织的JSR052专家组发布,Apache组织将其列入Jakarta项目,Sun公司将JSTL的程序包加入互联网服务开发工具包内(Web Services Developer Pack(WSDP)),作为JSP技术应用的一个标准。

JSTL标签是基于JSP页面的,这些标签可以插入在JSP代码中,本质上JSTL也是提前定义好的一组标签,这些标签封装了不同的功能,在页面上调用标签时,就等于调用了封装起来的功能。JSTL的目标是简化JSP页面的设计。对于页面设计人员来说,使用脚本语言操作动态数据是比较困难的,而采用标签和表达式语言则相对容易,JSTL的使用为页面设计人员和程序开发人员的分工协作提供了便利。
JSTL标识库的作用是减少JSP文件的Java代码使Java代码与HTML代码分离,所以JSTL标识库符合MVC设计理念。MVC设计理念的优势是将动作控制、数据处理、结果显示三者分离。

主要组成


JSTL包含了和以下操作相关的标签:
1、核心标签:核心标签库是整个JSTL中最常用的部分,主要由以下几部分组成:基本输入输出、流程控制、迭代操作和URL操作。负责Web应用的常见工作,如:循环、表达式赋值、基本输入输出等。
2、I18N格式标签库:用来格式化显示数据的工作如:对不同区域的日期格式化等。
3、XML标签库:用来访问XML文件的工作,支持JSP对XML文档的处理。
4、数据库标签库:SQL标签库包括了大部分访问数据库的逻辑操作,包括查询、更新、事务处理、设置数据源等。可以做访问数据库的工作。
5、函数标签库:用来读取已经定义的某个函数。

优点

1、简化了JSP和Web应用程序的开发。
2、在应用程序服务器之间提供了一致的接口,最大限度地提高了Web应用在各应用服务器之间的移植。
3、允许JSP设计工具与Web应用程序开发的进一步集成。相信不久就会有支持JSTL的IDE开发工具出现。
4、以一种统一的方式减少了JSP中的Scriptlets代码数量,可以达到程序中没有任何Scriptlest代码。

JSTL封装了JSP开发中的常用功能。比如说,在没有JSTL时,通过Scriptlets来迭代输出某个List(Set),有了JSTL,就可以使用它的一系列的Tag进行迭代输出。由于JSTL是JSP2.0规范的一部分,所以最新的Web容器都会支持它。

使用条件

在JSP中使用JSTL标签需要具备如下两个条件。
条件一:要在JSP页面中使用JSTL标签,需使用taglib指令引用标签库。
条件二:要在JSP中使用JSTL标签,还需要下载安装JSTL实现(Implementation)。

JSTL1.2实现的下载地址为:https:jstl.dev.java.net,下载文件为jstl-impl-1.2.jar,将该文件复制到Web应用程序的WEB-INFlib文件夹中即可使用JSTL。

JSTL1.0实现的下载地址为:http://www.apache.org/dist/jakarta/taglibs/standard/,Windows用户下载jakarta-taglibs-standard-current.zip。下载后解压,在lib文件夹中有两个文件:
·jstl.jar;
·standard.jar.
将这两个文件复制到Web应用程序的WEB-INFlib文件夹中即可使用JSTL 
一般来说,引入格式如下:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

我这里使用的是老版本的jstl1.0,下面让我们使用jstl的几个核心标签来进行具体的演示:

核心标签

c:out

<c:out>标签用来显示一个表达式的结果,与<%= %>作用相似,它们的区别就是<c:out>标签可以直接通过"."操作符来访问属性。

语法格式
<c:out value="<string>" default="<string>" escapeXml="<true|false>"/>

参数:value:要输出的内容值  default:输出的默认值 escapeXml:是否忽略xml特殊字符

注意:<c:out>标签会自动忽略XML标记字符,所以它们不会被当做标签来处理。

下面写个小例子来说明下:

 <c:out value="JSTL核心库out标签显示内容"></c:out>
    <br>
    <c:out value="<a href = 'http://www.baidu.com/'>点击跳转百度</a>"></c:out>
    <br>
    <c:out value="<a href = 'http://www.baidu.com/'>点击跳转百度</a>" escapeXml="false"></c:out>
<%--    如果value的值为空,显示默认值里的内容--%>
    <c:out value="${null}" default="value值为null"></c:out>

看着上面代码,不妨在大脑里构思一下结果,第一个会输出value 的所有值,第二个因为escapexml默认为true,所以忽略了a标签,不会进行转义,第三个会转义a标签,第四个因为value的值用el表达式绑定的是null值,所以默认输出的是default的值

run一下,看看效果:

c:set

<c:set>标签用于设置变量值和对象属性。

<c:set>标签就是<jsp:setProperty>行为标签的孪生兄弟。

这个标签之所以很有用呢,是因为它会计算表达式的值,然后使用计算结果来设置 JavaBean 对象或 java.util.Map 对象的值。

语法格式:

<c:set
   var="<string>"
   value="<string>"
   target="<string>"
   property="<string>"
   scope="<string>"/>

参数含义:scope的默认值为page

注意:如果指定了target属性,那么property属性也需要被指定。

举例:

先引入JSTL标签库,引入了一个javabean对象Person

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<jsp:useBean id="person" class="com.hbnu.EL.Person" />
public class Person {
    private String username;
    private int age;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
<h4>将数据保存到page域中<c:set value="生如夏花" var="username" scope="page" /></h4>
    <h4>从page域中获取数据:${username}</h4>
        <%--    pageScope.username--%>
    <hr>
    <h4>将数据保存到request域中<c:set value="18" var="age" scope="request" /></h4>
    <h4>从request域中获取数据:${age}</h4>
    <hr>
    <h4>将数据保存到seesion域中<c:set value="湖北武汉" var="address" scope="session" /></h4>
    <h4>从seesion域中获取数据:${address}</h4>
    <hr>
    <h4>将数据保存到application域中<c:set value="男" var="sex" scope="application" /></h4>
    <h4>从application域中获取数据:${sex}</h4>
    <h4>${username} ${age} ${sex} ${address}</h4>
<hr>
<h4>将数据保存到JavaBean对象中<c:set value="冲击之刃" target="${person}" property="username" /> </h4>
<h4>从JavaBean对象中获取数据:${person.username}</h4>
<%
    Map map =new HashMap();
    request.setAttribute("mapkey",map);
%>
<c:set property="data" value="yang" target="${mapkey}"></c:set>
<h4>从map对象里获取数据:${mapkey.data}</h4>


这里我示例了四个范围:page,request,seesion,application和javabean、map,通过c:set保存值,然后通过el表达式取值

c:choose和c:when、c:otherwise

<c:choose>标签与Java switch语句的功能一样,用于在众多选项中做出选择,本身只当做<c:when>和<c:otherwise>的父标签。

switch语句中有case,而<c:choose>标签中对应有<c:when>,switch语句中有default,而<c:choose>标签中有<c:otherwise>。

<c:set var ="score" value="95"></c:set>
<c:choose>
    <c:when test="${score>=90}">
        <c:out value="你是最胖的!"></c:out>
    </c:when>
    <c:when test="${score<90&&score>=70}">
        <c:out value="良好"></c:out>
    </c:when>
    <c:when test="${score<70&&score>=60}">
        <c:out value="及格"></c:out>
    </c:when>

    <c:otherwise>
        <c:out value="你remake吧!"></c:out>
    </c:otherwise>
</c:choose>

1638714485228011039.png

c:if

<c:if>标签判断表达式的值,如果表达式的值为 true 则执行其主体内容。

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

scope的默认值为page

举例:判断输入框是否为admin ,是就输出欢迎登录

<form action="#" method="post">
     <input type="text" name="username" value="${param.username}" placeholder="请输入用户名">
    <input type="submit" value="提交">
 </form>
<c:if test="${param.username=='admin'}" var="result">
    <c:out value="欢迎登陆!!!"></c:out>
</c:if>
<br>
if条件判断结果:${result}

c:foreach

<c:forEach>标签是更加通用的标签,因为它迭代一个集合中的对象。

语法:

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

<%
    List<String> list =new ArrayList<>();
    list.add("element1");
    list.add("element2");
    list.add("element3");
    list.add("element4");
    list.add("element5");
    request.setAttribute("list",list);
%>
<h5>不指定begin、end遍历集合</h5>
<c:forEach var="element" items="${list}">
    <c:out value="${element}"></c:out>
</c:forEach>
<h5>指定begin、end、step</h5>
<c:forEach var="item" items="${list}" begin="1" end="4" step="2">
    <c:out value="${item}"></c:out>
</c:forEach>

以上关于JSTL的常用核心标签基础就介绍到这里了

总结:

这里从JSTL的简介、组成、特点、使用条件和常用核心标签进行一一举例介绍,如有不足之处,欢迎指正!

感恩能与大家在华为云遇见!希望能与大家一起在华为云社区共同成长。


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。