• JSP常用标签——JSTL标签和EL表达式


    一、JSTL简介

    1、什么是JSTL

    JSTL是Java中的一个定制标记库集。(这个标记库集不需要自己编写,可以直接使用)

    2、为什么要使用JSTL

    • 实现了JSP页面中的代码复用(基于标签库原理,重复率较高的代码块支持复用,提高效率)
    • 书写JSP页面时可读性更强(长得很像xml,方便前端查看和参与开发)

    用事实告诉你为什么使用JSTL:

    实现:

    但是,使用JSTL效果如下:

    3、JSTL环境搭建

    JSTL的下载:

    下载地址:http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/

    下载文件:jakarta-taglibs-standard-1.1.2.zip————2004-10-25 20:57 933K

    解压文件后,在lib文件夹会获得两个jar包: standard.jar和jstl.jar

    需要把这两个jar包导入到项目中,注意:

    载入外来包,我们不介意采取:右击项目——Build Path方式,因为这样只是引入了一个jar包的link进来,如果把项目挪动位置或者把jar包删除了,则报错。所以我们推荐直接把要载入的文件复制到:项目——WebRootWEB-INFlib里面,不要忘了把jar包选中——右键——Build Path----Add to Build Path。这样做可以让jar包随着项目走,绑在了一起。

    二、EL表达式配合使用JSTL

    1、JSTL小程序

    如果要使用JSTL,要先导入JSTL的标签库,如果要进行页面的输出的话,需要使用<c:out>输出标签。<c:out>是属于JSTL核心标签的一个。

    导入核心标签库:

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

    Ps:在uri中之所以能找到该http,是因为导入了上面两个jar,否则是找不到的。prefix="c",里面的名字可以自定义,一般为“c”。

    <c:out value="输出内容"></c:out>

    具体如下:

    2、JSTL标签的四大分类及JSTL函数

    JSTL标签中Value中的值其实可以输出变量和常量。其中常量可以直接输出,变量需要通过EL表达式去获取。

    3、EL表达式

    什么是EL表达式?

    全名是Expression Language,常常配合jstl标签库使用,使得JSP页面更直观,写法更简单。

    比如:普通写法:

    EL表达式写法:

    EL表达式的格式:

    用美元符号“$”定界,内容包括在花括号“{}”中,即${表达式}

    注意“.”和“[]”运算符:

    但是:以下两种情况,两者不通用。

    4、EL变量

    如:<c:out value="${temp}"></c:out>

    如果没有做范围的限定,会依据默认从小到大开始搜索,如果还是找不到,则输出空字符串。

    5、EL自动类型转换

    普通情况:

    如果是用EL表达式:

    6、EL隐式对象

    7、EL运算符

    对empty举例:

    <% String username="null"; request.setAttribute("username", username); %>
    <c:out value="${empty username}"></c:out>

    Ps:如果username为null或者"",则返回true;如果username为"有内容",则返回false。

    el表达式中empty运算符对字符串为Null,及空字符串都返回 TRUE。

    三、JSTL核心标签的使用

    1、out标签(表达式控制标签)

    out标签的作用:

    2、set标签(表达式控制标签)

    set的标签的作用:

    • 存值到scope中(page,request,session,application);
      • 可以将值以变量形式存放在指定范围内,有两种方式:

    • 存值到JavaBean的属性中。 
      • 需要配合target属性指定对象并通过property属性指定要赋值给对象的哪个属性。

    Person类:

    将Person类实例化

    实例化话后的变量名叫person。那实例化后如何通过set标签向person中赋值。

    变量的赋值需要配合target属性指定对象并通过property属性指定要赋值给对象的哪个属性。

    3、remove标签(表达式控制标签)

    remove标签的用法:

    • 只能remove掉某个变量(不能remove某个类对象的某个属性);
    • var属性是必选;
    • scope属性是可选。

    比如:

    此时运行结果就输出不了firstName的值了。

    4、catch标签(表达式控制标签)

    catch标签的用法:

    • catch标签中可以包含那些容易出错的JSTL标签(逻辑)

    输出结果:

    5、if标签(流程控制标签)

    if标签的用法:

    • 同程序中的if作用相同,用来实现分支条件控制。
      • test属性用于存放判断的条件,一般使用EL表达式来编写。
      • var指定名称用来存放判断的结果类型为true或false
      • scope用来存放var属性存放的范围。

    比如:根据用户输入的成绩进行等级判断

    运行结果:

    用户什么都没输入的时候,默认进来是false

    输入90:

    输入80:

    6、choose、when、otherwise(流程控制标签)

     choose、when、otherwise 标签的作用:

    • 通常这三个标签被放在一起配合使用
    • <c:choose>标签嵌套在<c:when>和<c:otherwise>标签的外面作为他们的父标签来使用。 
    • 其中choose和when标签也可以一起组合使用。

    综上所述通常有以下两种语法结构:

    比如:

    <!-- choose、when、otherwise -->
    <c:choose>
    <c:when test="${param.score<=100 && param.score>=60 }">
    <c:out value="及格"></c:out>
    </c:when>
    <c:when test="${param.score<60 && param.score>=0 }">
    <c:out value="不及格"></c:out>
    </c:when>
    <c:otherwise>
    <c:out value="请检查你的输入!"></c:out>
    </c:otherwise>
    </c:choose>

    ps:用法类似于switch——case——default。

    比如:

    7、forEach(循环控制标签)

    forEach标签的作用:

    常用用法1-全部遍历:

    例子:

    常用用法2-部分遍历:(begin end)

    index值是从0开始的。

    例子:

    常用用法3-部分遍历中指定步长(step)

    例子:

    <!-- 用法三:部分遍历并带步长 -->
    <c:forEach var="fruit" items="${fruits}" begin="1" end="3" step="2">
    <c:out value="${fruit}"></c:out><br>
    </c:forEach>

    Ps:step默认值:1。

    常用用法4-部分遍历时输出元素的状态(varStatus)

    例子:

    <!-- 用法四:部分遍历并带状态 -->
    <c:forEach var="fruit" items="${fruits}" begin="1" end="3" varStatus="fru">
    <c:out value="${fruit}——四个属性:"></c:out><br>
    <c:out value="index属性:${fru.index}"></c:out><br>
    <c:out value="count属性:${fru.count}"></c:out><br>
    <c:out value="first属性:${fru.first}"></c:out><br>
    <c:out value="last属性:${fru.last}"></c:out><br>
    <c:out value="----------"></c:out><br>
    </c:forEach>

    PS:index从0开始;count从1开始;first是否第一个(boolean);last是否最后一个(boolean)。

    8、forTokens(循环控制标签)

    forTokens标签的用法:

    例子:

    输出:

    注:forTokens还有如下属性,与forEach的属性相同。

    9、import(URL操作标签)

    import标签的用法:

    impor各属性含义:

    例子:

     1 <!-- import标签用法 -->
     2 <!-- 导入网络上的绝对路径 -->
     3 <c:catch var="error0">
     4 <c:import url="http://www.imooc.com"></c:import>
     5 </c:catch>
     6 <c:out value="${error0}"></c:out>
     7 <hr>
     8 <!-- 导入相对路径文件 -->
     9 <c:catch var="error1">
    10 <c:import url="Test.txt" charEncoding="gbk"></c:import>
    11 </c:catch>
    12 <c:out value="${error1}"></c:out>

    Ps:由于可能网络中断导致抛出异常,所以常常把import标签放在catch标签里。

     1 <!-- var及scope用法 -->
     2 <c:catch var="error2">
     3 <c:import url="Test.txt" var="test" scope="session" charEncoding="gbk"></c:import>
     4 </c:catch>
     5 <c:out value="${error2}"></c:out><br>
     6 <c:out value="import标签存储的test字符串变量值:${sessionScope.test}"></c:out>
     7 
     8 <!-- context属性用法 -->
     9 <c:catch var="error3">
    10 <c:import url="/index1.jsp" context="/Test1"></c:import>
    11 </c:catch>
    12 <c:out value="${error3}"></c:out><br>

    Ps1:如果没定义var,则可以直接输出;如果定义了var,则用c:out标签输出。
    Ps2:第一步:改eclipse中tomcat的部署路径,如果是灰掉的,停掉tomcat,然后clean,就可以改为第二项了(如果想在webapps生成,记得在Deploy path选择webapps)。第二步:改conf/context.xml中加上crossContext="true"。如:<Context crossContext="true"></Context>

    注意:

    10、redirect标签(URL操作标签详解)

    redirect标签的用法:

    注意:重定向的话浏览器的url都变为重定向的url,而import只是载入,浏览器url不变。

    例子:

    重定向把参数值都带到URL中去了:

    获取值:

    11、url标签(URL操作标签)

    <!-- url标签用法 -->
    <c:if test="${1<2}">
    <c:set var="partUrl">temp.jsp</c:set>
    </c:if>
    <c:url value="http://localhost:8080/Test/${partUrl}" var="newUrl" scope="session"></c:url>
    <a href="${newUrl}">New URL</a>

    四、JSTL函数的使用

    1、contains函数、startsWith、endsWith

    contains函数表示加入的字符串是否包含字串,返回一个boolean类型的值。

     1 <!-- JSTL函数使用 -->
     2 <c:out value="“Hello World”字符串中是否包含“Hello”?${fn:contains('Hello World','Hello')}"></c:out>
     3 <hr>
     4 <c:out value="“Hello World”字符串中是否包含“ABCD”?${fn:contains('Hello World','ABCD')}"></c:out>
     5 <hr>
     6 <c:out value="“Hello World”字符串中是否包含“hello”(忽略大小写)?${fn:containsIgnoreCase('Hello World','hello')}"></c:out>
     7 <hr>
     8 <c:out value="“Hello”是否在“Hello World”字符串开头?${fn:startsWith('Hello World','Hello')}"></c:out>
     9 <hr>
    10 <c:out value="“world”是否在“Hello World”字符串尾部?${fn:endsWith('Hello World','world')}"></c:out>

    Ps1:配合使用:
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>

    2、escapeXml、indexOf

     1 <!-- 不会输出<book>标签 -->
     2 <book></book>
     3 <hr>
     4 <!-- 可输出标签但会出现转义问题 -->
     5 <c:out value="${fn:escapeXml('<book>书</book>')}"></c:out>
     6 <hr>
     7 <!-- 可输出标签且不会出现转义问题 -->
     8 <c:out value="<book>书</book>"></c:out>
     9 <hr>
    10 <!-- indexOf函数用法 -->
    11 <c:out value="“Hello World”字符串“llo”出现的index值:${fn:indexOf('Hello World','llo')}"></c:out>

  • 相关阅读:
    python自动生成小学四则运算题目
    软件工程第一章心得体会
    Python微信机器人
    利用python进行微信好友分析
    python操作数据库读书笔记
    初学爬虫之访问goole网页与爬取中国大学排名。
    python之预测体育竞技分析
    5、用python写一个自己的网页
    用turtle实现动态汉诺塔
    面向对象与正则表达式的学习(自动更正,和代数运算)
  • 原文地址:https://www.cnblogs.com/Qian123/p/5308951.html
Copyright © 2020-2023  润新知