JSP基础——EL表达式,JSTL标签库

本文深入探讨了EL表达式的语法、运算符及作用域,同时详细讲解了JSTL标签库的核心标签、流程控制标签和其他常用标签,以及JSTL函数的使用方法。

EL表达式

EL表达式,简称EL,是Java中的一种特殊的通用编程语言,借鉴于JavaScript和XPath。主要作用是在Java Web应用程序嵌入到网页(如JSP)中,用以访问页面的上下文以及不同作用域中的对象 ,取得对象属性的值,或执行简单的运算或判断操作。EL在得到某个数据时,会自动进行数据类型的转换。

语法

${ }

{ }中可以是变量,常量,变量和常量以及运算符组合形成的式子。

运算符

算数运算符

  • +
  • -
  • *
  • /
  • %

EL表达式支持常见的算数运算符。
示例:

${1+1}
${2-1}
${1*2}
${10/2}
${10%3}

运行结果:

2 1 2 5.0 1 

关系运算符

  • >
  • >=
  • <
  • <=
  • ==
  • !=

示例:

${2>1} ${1<2} 
${2>=2} ${1<=2} 
${1==1} ${1!=2}

运行结果:

true true true true true true

逻辑运算符

  • &&
  • ||
  • !

示例:

${2>1 && 1!=2}
${2>1 || 1<2}
${!(1>2)}

运行结果:

true true true

三目运算符

  • a?b:c

示例:

<%int a = 1;int b =2;%>
${a>b?"大":"小"}

运行结果:

非空运算符empty

常见的有以下几种情况:

  • empty 对象:判断对象是否为空,对象为空
  • empty 字符串:判断字符串是否为空(即字符串的长度是否大于0)
  • empty list列表 :判断列表长度是否大于0,如果大于0结果为false等于0,结果true

示例:

<%@ page import="java.util.*"%>
	<%
		request.setAttribute("i", null);
		request.setAttribute("s", "");
		List<String> list = new ArrayList<String>();
		list.add("Hello world!");
		request.setAttribute("list", list);
	%>
	${empty i } 
	${empty s } 
	${empty list }

运行结果:

true true false

[]与.运算符

EL 提供.[]两种运算符来存取数据。
当要存取的属性名称中包含一些特殊字符,如.或?等并非字母或数字的符号,就一定要使用 []
例如:
${user.My-Name}应当改为${user["My-Name"] }
如果要动态取值时,就可以用[]来做,而.无法做到动态取值。例如:
${sessionScope.user[data]}中data 是一个变量。

EL四大作用域对象

Servlet三大作用域对象:

  • HttpServletRequest
  • HttpSession
  • ServletContext

JSP四大作用域对象:

  • pageContext
  • request
  • session
  • application

JSP四大作用域对象在EL中的表示:

JSPEL作用范围
pageContextpageScope当前页面有效
requestrequestScope一次请求有效
sessionsessionScope一次会话有效
applicationapplicationScope整个应用运行期间有效

el表达式获取作用域对象中的值语法: ${作用域.变量名 或者(对象名.属性名)}
实例:

	<% 
		pageContext.setAttribute("name", "page");
		request.setAttribute("name", "request");
		session.setAttribute("name", "session");
		application.setAttribute("name", "app");
	%>
	
	${pageScope.name}
	${requestScope.name}
	${sessionScope.name}
	${applicationScope.name}

运行结果:

page request session app

如果不指定作用域直接用变量名取值,比如${name},那么获取数据的顺序是:
pageContext——request——session——application。如果四个作用域对象都没有相应的数据,那么就返回null,而EL会自动将null处理成字符串,所以页面会显示空白。

  • 示例:
	// 打乱上面存值的顺序
	<% 
		session.setAttribute("name", "session");
		application.setAttribute("name", "app");
		pageContext.setAttribute("name", "page");
		request.setAttribute("name", "request");
	%>
	// 不指定直接作用域,直接用变量名取值
	${name}
  • 运行结果:
page

JSTL标签库

JSP标准标签库(JSTL)(JSP Standard Tag Library)是一个JSP标签集合,它封装了JSP应用的通用核心功能。
JSTL支持通用的、结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签。
使用JSTL标签库需要引入两个jar包:standard.jar 和 jstl.jar 文件拷贝到 /WEB-INF/lib/ 下。

核心标签

核心标签是最常用的JSTL标签,引入核心标签的语法是:

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

通用标签

引入核心标签后,我们先来看最简单的存值标签,取值标签,删值标签。
语法:

<c:set>
<c:out>
<c:remove>

示例:存值与取值

	<!-- 存值标签 -->
	<!-- 没有设置scope默认数据是保存在page里面  -->
	<!-- scope存储范围:page request session application -->
	<!-- var表示存储信息的变量;value表示要存储的值;scope表示var属性的作用域-->
	<c:set var="username0" value="wangwu"></c:set>
	<c:set var="username" value="zhangsan" scope="page"></c:set>
	<c:set var="username" value="lisi" scope="session"></c:set>
	<c:set var="username" value="zhaoliu" scope="request"></c:set>
	<c:set var="username" value="tianqi" scope="application"></c:set>
	<!-- 取值标签 -->
	<!-- 用EL表达式取 -->
	<!-- 不指定scope默认从pageContext----》request---》session--》application取第一个匹配到的数据 -->
	<c:out value="${username}"></c:out>
	<c:out value="${pageScope.username}"></c:out>
	<c:out value="${sessionScope.username}"></c:out>
	<c:out value="${requestScope.username}"></c:out>
	<c:out value="${applicationScope.username}"></c:out>

运行结果:

zhangsan zhangsan lisi zhaoliu tianqi

删值标签:

	<c:remove var="username" scope="page" />
	<c:out value="${pageScope.username}" />
	<!--pageScope中的username已经被删除,浏览器上什么都不会显示-->
	<!-- 不指定scope,会默认删除所有的数据 -->
	<c:remove var="username" />
	<c:out value="${username}" />
	<!--删除所有作用域范围内的username,浏览器页面什么都不显示-->

流程控制标签

  1. 判断标签
<c:if>
  • 判断标签的属性
属性描述是否必要默认值
test条件
var用于存储条件结果的变量
scopevar属性的作用域page

示例:

	<c:set var="sex" value="1" scope="page"></c:set>
	<!-- 判断sex,值为1就是男,值为0就是女 -->
	<c:if test="${sex==0}"></c:if>
	<c:if test="${sex==1}"></c:if>

运行结果:

  1. 分支标签

这三个标签通常配合使用:

 <c:choose>
 <c:when>
 <c:otherwise>

<c:choose>标签与Java switch语句的功能一样,用于在众多选项中做出选择。
switch语句中有case,而<c:choose>标签中对应有<c:when>,switch语句中有default,而<c:choose>标签中有<c:otherwise>

  • 语法格式:
<c:choose>
    <c:when test="<boolean>">
        ...
    </c:when>
    <c:when test="<boolean>">
        ...
    </c:when>
    ...
    ...
    <c:otherwise>
        ...
    </c:otherwise>
</c:choose>
  • 示例:
	<c:set var="score" value="75" scope="page"></c:set>
	<c:choose>
		<c:when test="${score<60}">没有及格</c:when>
		<c:when test="${70>score&&score>=60}">一般</c:when>
		<c:when test="${80>score&&score>=70}">良好</c:when>
		<c:otherwise>优秀</c:otherwise>
	</c:choose>
  • 运行结果:
良好
  1. 循环标签

<c:forEach>,<c:forTokens> 标签封装了Java中的for,while,do-while循环。相比而言,<c:forEach>标签是更加通用的标签,因为它迭代一个集合中的对象。<c:forTokens>标签通过指定分隔符将字符串分隔为一个数组然后迭代它们。

  • forEach 语法格式
<c:forEach
    items="<object>"
    begin="<int>"
    end="<int>"
    step="<int>"
    var="<string>"
    varStatus="<string>">

    ...
  • forTokens 语法格式
<c:forTokens
    items="<string>"
    delims="<string>"
    begin="<int>"
    end="<int>"
    step="<int>"
    var="<string>"
    varStatus="<string>">
  • 属性

<c:forEach>标签有如下属性:

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

<c:forTokens>标签与<c:forEach>标签有相似的属性,不过<c:forTokens>还有另一个属性:

属性描述是否必要默认值
delims分隔符
  • 属性值举例:
<c:foreach  items="${sessionScope.userList}"  var="userItem"  
begin="1"  end="10"  step="3"  varStatus="userStatus"> XXX </c:foreach>

解读: 对 session 对象存储的 userList 集合对象进行遍历,每次访问的项暂时存储在 userItem 变量中,从索引 1 开始至索引 10 进行访问,但不是依次访问,每隔 3 个元素访问一次。每次访问项的状态相关值由 userStatus 对象暂存。

  • varStatus解读

<c:foreach>varStatus属性暂存项的相关状态属性,可由 EL 表达式引用。

${userStatus.index} 此项的索引,从0开始 
${userStatus.count} 此项的计数序号,从1开始 
${userStatus.first} 此项是否是第一项,布尔值 
${userStatus.last} 此项是否是最后一项,布尔值 
${userStatus.begin} 此次迭代的起始索引,对应<c:foreach>中begin属性值 
${userStatus.end} 此次迭代的终止索引,对应<c:foreach>中end属性值 
${userStatus.step} 此次迭代的跳跃步伐,对应<c:foreach>中step属性值
  • 示例一:forEach输出数字1-10:
<c:forEach var="i" begin="1" end="10">
		<br/>${i}
</c:forEach>
  • 示例二:forEach迭代集合列表:
<%@ page import="java.util.*" %>
	<% 	
		List<String> list = new ArrayList<String>();
		list.add("hello");
		list.add("world!");
		pageContext.setAttribute("mylist", list);
	%>
	<c:forEach var="s" items="${mylist}" > 
	 	${s}
	</c:forEach>
  • 示例三:forEach打印九九乘法表
<c:forEach var="i" begin="1" end="9">
	<c:forEach var="j" begin="1" end="${i}">
		<span>${j}*${i}=${j*i}</span>
	</c:forEach>
	<br/>
</c:forEach>

效果展示:
在这里插入图片描述

  • 示例四:打印九九乘法表,奇数行为红色,偶数行为绿色。

这里我们需要用到这个属性varStatus(代表循环状态的变量名称)。

<c:forEach var="i" begin="1" end="9" varStatus="row">
	<c:forEach var="j" begin="1" end="${i}">
		<span 
			<c:if test="${row.index%2==0}">style="color:red;"</c:if>
			<c:if test="${row.index%2!=0}">style="color:green;"</c:if>
		>${j}*${i}=${j*i}</span>
	</c:forEach>	
	<br/>	
</c:forEach>

效果展示:
在这里插入图片描述

  • 示例五:forTokens通过指定分隔符将字符串分隔为一个数组然后迭代它们
<c:forTokens items="java;c;c++;python;php" delims=";" var="name">
		${name}
</c:forTokens>

运行结果:

java c c++ python php

其他

  • <c:redirect> 重定向至一个新的URL

示例:

<c:redirect url="new.jsp" context="默认是当前应用程序,你也可以自己指定"/>
  • <c:url>

该标签将URL格式化为一个字符串,然后存储在一个变量中。这个标签在需要的时候会自动重写URL。var属性用于存储格式化后的URL。<c:url>标签只是用于调用response.encodeURL()方法的一种可选的方法。它真正的优势在于提供了合适的URL编码,包括<c:param>中指定的参数。

  • <c:param> 用来给包含或重定向的页面传递参数

示例:

 	<h1>&lt;c:param&gt; 实例</h1>
    <c:url var="myURL" value="main.jsp">
        <c:param name="name" value="Runoob"/>
        <c:param name="url" value="www.runoob.com"/>
    </c:url>
    <a href="/<c:out value='${myURL}'/>">
 使用 &lt;c:param&gt; 为指定URL发送两个参数。</a>
  • <c:catch>用来处理产生错误的异常状况,并且将错误信息储存起来

示例:

<c:catch var ="catchException">
   <% int x = 5/0;%>
</c:catch>

<c:if test = "${catchException != null}">
   <p>异常为 : ${catchException} <br/>
   发生了异常: ${catchException.message}</p>
</c:if>

运行结果:

异常为 : java.lang.ArithmeticException: / by zero 
发生了异常: / by zero

格式化标签

JSTL格式化标签用来格式化并输出文本、日期、时间、数字。引用格式化标签库的语法如下:

<%@ taglib	uri="http://java.sun.com/jsp/jstl/fmt"	prefix="fmt" %>
标签描述
<fmt:formatNumber>使用指定的格式或精度格式化数字
<fmt:parseNumber>解析一个代表着数字,货币或百分比的字符串
<fmt:formatDate>使用指定的风格或模式格式化日期和时间
<fmt:parseDate>解析一个代表着日期或时间的字符串
<fmt:bundle>绑定资源
<fmt:setLocale>指定地区
<fmt:setBundle>绑定资源
<fmt:timeZone>指定时区
<fmt:setTimeZone>指定时区
<fmt:message>显示资源配置文件信息
<fmt:requestEncoding>设置request的字符编码

示例一:格式化日期

	<%@ taglib	uri="http://java.sun.com/jsp/jstl/fmt"	prefix="fmt" %>
	<c:set var="now" value="<%=new java.util.Date()%>"/>
	<fmt:formatDate pattern="yyyy-MM-dd" value="${now}" />

SQL标签

JSTL SQL标签库提供了与关系型数据库(Oracle,MySQL,SQL Server等等)进行交互的标签。引用SQL标签库的语法如下:

<%@ taglib uri="http://java.sun.com/jsp/jstl/sql"	prefix="sql"  %>
标签描述
<sql:setDataSource>指定数据源
<sql:query>运行SQL查询语句
<sql:update>运行SQL更新语句
<sql:param>将SQL语句中的参数设为指定值
<sql:dateParam>将SQL语句中的日期参数设为指定的java.util.Date 对象值
<sql:transaction>在共享数据库连接中提供嵌套的数据库行为元素,将所有语句以一个事务的形式来运行

示例:

<sql:setDataSource var="mydb" driver="com.mysql.jdbc.Driver"
     url="jdbc:mysql://localhost/TEST"
     user="root"  password="12345"/>

<sql:query dataSource="${mydb}" var="result">
SELECT * from Employees;
</sql:query>

JSTL函数

JSTL包含一系列标准函数,大部分是通用的字符串处理函数。引用JSTL函数库的语法如下:

<%@ taglib	 uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
函数描述
fn:contains()测试输入的字符串是否包含指定的子串
fn:containsIgnoreCase()测试输入的字符串是否包含指定的子串,大小写不敏感
fn:endsWith()测试输入的字符串是否以指定的后缀结尾
fn:escapeXml()跳过可以作为XML标记的字符
fn:indexOf()返回指定字符串在输入字符串中出现的位置
fn:join()将数组中的元素合成一个字符串然后输出
fn:length()返回字符串长度
fn:replace()将输入字符串中指定的位置替换为指定的字符串然后返回
fn:split()将字符串用指定的分隔符分隔然后组成一个子字符串数组并返回
fn:startsWith()测试输入字符串是否以指定的前缀开始
fn:substring()返回字符串的子集
fn:substringAfter()返回字符串在指定子串之后的子集
fn:substringBefore()返回字符串在指定子串之前的子集
fn:toLowerCase()将字符串中的字符转为小写
fn:toUpperCase()将字符串中的字符转为大写
fn:trim()移除首位的空白符
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值