07EL和JSTL

1. EL

  • EL(Expression Language,表达式语言):简化JSP开发中的对象引用,从而规范页面代码,增强程序的可读性和可维护性

1.1 EL的语法格式

${表达式}
  • 注意:如果在JSP页面中要显示字符串""${",必须在前面加上符号"\"或者写成"${${}"

  • 案例:

    <!--在servlet中设置属性name-->
    request.serAttribute("name", "why");
    
    <!--在jsp中的两种获取方式-->
    <%=request.getAttribute("name")%>
    ${name}<!--使用EL表达式-->
    
    
  • EL表达式特点

    • EL可以与JS语句结合使用
    • 可以自动进行类型转换(通过EL获取两个字符串数值的和,可以直接使用+进行连接)
    • 不仅可以访问一般变量,还可以访问JavaBean中的属性、嵌套属性和集合对象
    • 在EL中,可执行算术、逻辑、关系和条件运算等
    • 可获取pageContext对象,进而获取其他内置对象
    • 除法运算时,如果除数为0,返回无穷大(Infinity),不返回错误
    • 可以访问JSP的作用域

1.2 EL中的标识符

  • 不能以数字开头
  • 不能是EL中的关键字
  • 不能是EL中的隐式对象
  • 不能包含单引号、双引号、减号、正斜线等特殊字符

1.3 EL中的关键字

and		eq		gt		true		instanceof
or		ne		le		false		empty
not		lt		ge		null		div		mod

1.4 EL中的变量

  • EL中的变量是一个基本的存储单元,不用事先定义就可以直接使用

    ${password}
    <!--password就是一个变量,通过表达式就可以访问变量password的值-->
    

1.5 EL中的常量

  • 布尔常量:true和false

  • 整型常量:pow(-2, 63) ~ pow(2, 63) - 1之间

  • 浮点型常量:4.9E-324 ~ 1.8E308之间

  • 字符串常量:字符串本身包含的单引号或双引号和反斜杠都需要用"\"进行转义

  • Null常量:表示变量引用的对象为空,它只有一个值,用null表示

1.6 EL访问数据

  • 点运算符(.)

    ${user.name}
    <!--访问user对象中的name属性-->
    
  • 中括号运算符([])

    ${user["name"]}
    
  • 应用情况

    • 二者某种情况下可以互换,例如:${user.name}等价于${user["name"]}
    • 中括号还可以访问List集合或数组中指定索引的某个元素;例如:${users[0]}
    • 二者可以相互结合使用,例如:${users[0].name}

1.7 EL中的运算符

  • 算术运算符

    算术运算符说明算术表达式
    +${3 + 4}
    -${3 - 4}
    *${3 * 4}
    / 或 div${10 / 2} 或 ${10 div 2}
    % 或 mod取模(取余)${10 % 4} 或 ${10 mod 4}
    • 除法运算时,商为小数
    • +不能连接两个字符串,如果连接两个不可以转换为数值型的字符串,抛出异常,否则自动转换为数值型,然后进行加法
  • 比较运算符

    比较运算符说明算术表达式
    == 或 eq等于${1 == 2} 或 ${1 eq 2}
    != 或 ne不等于${1 != 2} 或 ${1 ne 2}
    < 或 lt小于${1 < 2} 或 ${1 lt 2}
    > 或 gt大于${1 > 2} 或 ${1 gt 2}
    <= 或 le小于等于${1 <= 2} 或 ${1 le 2}
    >= 或 ge大于等于${1 >= 2} 或 ${1 ge 2}
    • 为了避免页面产生标签冲突,后面四种采用第二种表示方式
    • 如果运算符后面是数字,则在运算符和数字之间至少要有一个空格
  • 逻辑表达式

    逻辑运算符说明算术表达式
    && 或 and逻辑与${true && false} 或 ${true and false}
    || 或 or逻辑或${true || false} 或 ${true or false}
    ! 或 not逻辑非${! true} 或 ${not true}
  • empty运算符

    • 判断对象是否为空,该运算符是前缀运算符,用于确定对象或变量是否为null或空
    ${empty expression}
    
    • null:表示足够变量没有指明任何对象
    • 空:这个变量所属的对象内容为空
  • 条件运算符

    ${A ? B : C}
    
  • EL中运算符的优先级

    优先级运算符
    1[] .
    2()
    3-(unary) not ! empty
    4* / div % mod
    5+ -(binary)
    6< > <= >= lt gt le ge
    7== != eq ne
    8&& and
    9|| or
    10?:

2. EL隐式对象

隐式对象名称描述
pageContext对应于JSP页面中的pageContext对象
pageScope代表page域中用于保存属性的Map对象
requestScope代表request域中用于保存属性的Map对象
seesionScope代表seesion域中用于保存属性的Map对象
applicationScope代表application域中用于保存属性的Map对象
param一个保存了所有请求参数的Map对象
paramValues一个保存了所有请求参数的Map对象,对于某个请求参数,返回的是一个String类型的数组
header一个保存了所有HTTP请求头字段的Map对象
headerValues一个保存了所有HTTP请求头字段的Map对象,返回String类型数组
cookie获取使用者的Cookie值,Cookie的类型是Map
initParam一个保存了所有Web应用初始化参数的Map对象

2.1 pageContext对象

  • 用法:
${pageContext.response.characterEncoding}
<!--获取response对象中的characterEncoding属性-->
  • 不要将EL中的隐式对象和JSP中的隐式对象混淆,只有pageContext对象是它们共有的,其他隐式对象则毫不相关

2.2 Web域相关对象

  • 4个隐式对象只能用于获取指定范围内的属性值,而不能获取其他相关信息
<body>
	<% pageContext.setAttribute("username", "why");%>
	<% request.setAttribute("bookName", "java web");%>
	<% session.setAttribute("username", "it");%>
	<% application.setAttribute("bookName", "java");%>

	\${pageScope.username}的值为: ${pageScope.username} <br/>
	\${requestScope.bookName}的值为: ${requestScope.bookName} <br/>
	\${sessionScope.bookName}的值为: ${sessionScope.username} <br/>
	\${applicationScope.bookName}的值为: ${applicationScope.bookName} <br/>
</body>
  • 使用EL获取某个域对象中属性时,也可以不指定查找域,而直接引用域中的属性名称,他会按照page、request、session、application的顺序依次查找

2.3 访问环境信息的隐式对象

  • param对象用于获取请求参数的某个值,它是Map类型,与request.getParameter()方法相同,使用EL获取时,如果参数不存在,返回空字符串

    ${param.name}
    
    • 如果一个请求参数有多个值,使用param获取时,只返回第一个值
  • 如果一个请求参数有多个值,可以使用paramValues对象获取请求参数的所有值,返回请求参数所有值所组成的数组

    ${paramValues.name[i]}
    

2.4 Cookie对象

  • 用法示例

    Cookie对象的信息:${cookie.userName}
    Cookie对象的名称:${cookie.userName.name} 
    Cookie对象的值:${cookie.userName.value}
    
    

2.5 initParam对象

  • initParam对象用于获取Web应用初始化参数的值

  • maven导jar包

    <dependency>
    	<groupId>jstl</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>
    <dependency>
        <groupId>taglibs</groupId>
        <artifactId>standard</artifactId>
        <version>1.1.2</version>
    </dependency>
    
    
  • 用法:

    <!--在web.xml中初始化参数author-->
    <context-param>
    	<param-name>author</param-name>
        <param-value>hao</param-value>
    </context-param>
    
    ${initParam.author}
    

3. JSTL(标准标签库)

  • 核心标签库:用于完成JSP页面的常用功能,包括JSTL的表达式标签、URL标签、流程控制标签

    指令格式:

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    
  • 格式标签库:国际化/格式化标签库包含实现Web应用程序的国际化标签和格式化标签。例如:设置JSP页面的本地信息、时区等

    指令格式:

    <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
    
  • SQL标签库:访问和操作数据库的标签,这套标签不经常使用

    指令格式:

    <%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
    
  • XML标签库:对XML文档中的数据进行操作的标签,例如:解析xml文件,输出xml文档中的内容等

    指令格式:

    <%@ taglib prefix="xml" uri="http://java.sun.com/jsp/jstl/xml" %>
    
  • 函数标签库:提供了一套自定义EL函数,包含JSP网页制作经常需要用到的字符串操作

    指令格式:

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

4. JSTL中的Core标签库

4.1 表达式标签

4.1.1 <c:out>标签

  • 将一段文本内容或表达式的结果输出到客户端,如果输出的文本内容包含需要进行转义的字符,<c:out>标签会默认它们进行HTML编码转换后再输出
<!--没有标签体的情况-->
<c:out value="value" [default="defaultValue"] [escapeXml="{true|false}"]/>

<!--有标签体的情况-->
<c:out value="value" [escapeXml="{true|false}"]>
	defaultValue
</c:out>

<!--
	value:指定输出的文本内容
	default:当value为null时所输出的默认值,该属性是可选的(中括号中的属性都是可选的),没有指定默认值,则默认输出空字符串
	escapeXml:是否将>、<等特殊字符进行HTML编码转换后再输出,默认值为true
-->

4.1.2 <c:remove>移除标签

  • 移除指定的JSP范围内的变量
<c:remove var="name" [scope="范围"]/>
<!--
	var:指定要移除的变量名
	scope:指定变量的有效范围,可选择:page\request\session\application,默认值为page;
		如果没有指定变量的有效范围,将在4个域中查找要移除的变量并删除
-->

4.2 流程控制标签

4.2.1 <c:if>标签

<!--没有标签体的情况-->
<c:if test="testCondition" var="result" [scope="{page|request|session|application}"]/>

<!--有标签体的情况-->
<c:if test="testCondition" var="result" [scope="{page|request|session|application}"]>
	body content
</c:if>

<!--
	test:设置逻辑表达式
	var:指定逻辑表达式中变量的名字
	scope:指定var变量的作用范围,默认值为page
-->

4.2.2 <c:choose><c:when><c:otherwise>标签

<!--
	<c:choose>没有属性
	在它的标签体中只能嵌套一个或多个<c:when>、0个或1个<c:otherwise>
	并且同一个<c:choose>中,<c:when>必须在<c:otherwise>前面
-->
<c:choose>
	<!--只有一个test属性,为布尔类型,支持动态值,可以是一个条件表达式-->
    <c:when test="testCondition">
    	Body content
    </c:when>
    <!--没有属性,必须作为最后分支出现,所有<c:when>的test不成立时,才执行-->
	<c:otherwise>
    	conditional block
    </c:otherwise>
</c:choose>

4.3 循环标签

<!--迭代包含多个对象的集合-->
<c:forEach [var="varName"] items="collection" [varStatus="varStatusName"] 
           [begin="begin"] [end="end"] [step="step"]>
	body content
</c:forEach>

<!--迭代指定范围内的集合-->
<c:forEach [var="varName"] items="collection" [varStatus="varStatusName"] 
           begin="begin" end="end" [step="step"]>
	body content
</c:forEach>

<!--
	var:将当前迭代到的元素保存到page域中的名称
	items:指定将要迭代的集合对象
	varStatus:指定将当前迭代状态信息的对象保存到page域中的名称
	begin:指定从集合中第几个元素开始迭代
	end:指定迭代到集合中哪个位置结束
	step:指定迭代的步长,即迭代因子的增量
-->
<!--
	varStatus属性用于设置一个javax.servlet.jsp.jstl.core.LoopTagStatus类型的变量
	这个变量包含了从集合中取出元素的状态信息
	使用<c:forEach>标签的varStatus属性可以获取一下信息:
		count:表示元素在集合中的序号,从1开始计数
		index:表示当前元素在集合中的索引,从0开始计数
		first:表示当前元素是否为集合中的第一个元素
		last:表示当前元素是否为集合中的最后一个元素
-->

4.4 URL相关标签

<!--使用value属性指定参数的值-->
<c:param name="name" value="value"></c:param>
    
<!--在标签体中指定参数的值-->
<c:param name="name">
	parameter value
</c:param>
<!--
	name:参数的名称
	value:参数的值,当使用<c:param>标签为一个URL地址附加参数时,它会自动对参数值进行URL编码
	例如:"中国" => "%e4%b8%ad%e5%9b%bd"后再附加到URL地址后面
-->

<!--没有标签实体的情况-->
<c:url value="value" [context="context"] [var="varName"] [scope="{page|request|session|application}"]>
</c:url>

<!--有标签实体的情况-->
<c:url value="value" [context="context"] [var="varName"] [scope="{page|request|session|application}"]>
    <c:param>标签
</c:url>
    
<!--
	value:指定构造的URL
	context:指定导入同一个服务器下其他Web应用的名称
	var:指定将构造的URL地址保存到域对象的属性名称
	scope:将构造好的URL保存到域对象中
-->
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CL3

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值