EL表达式和JSTL标签详解

EL表达式和JSTL标签详解

1 EL概述

1 什么是EL
EL(Expression Language)是一门表达式语言,它对应<%=…%>。我们知道在JSP中,表达式会被输出,所以EL表达式也会被输出。
EL表达式的格式: … , 例 如 : {…},例如: {1+2}。
在使用EL表达式时,要求page指令的isELIgnored属性为false。这样JSP在编译成.java时,才不会忽略EL表达式。
如果你希望某个EL表达式被JSP编译器忽略,那么可以在EL表达式之前添加“\”,例如:${1+2}。
3 EL操作操作对象的方式

 操作变量和常量: n a m e 、 {name}、 name{8};
 操作List和数组: l i s t [ 0 ] 、 {list[0]}、 list[0]{arr[0]};
 操作bean的属性: p e r s o n . n a m e 、 {person.name}、 person.name{person[‘name’]},对应person.getName()方法;
 操作Map的值: m a p . k e y 、 {map.key}、 map.key{map[‘key’]},对应map.get(key)。

4 EL运算符
运算符 说明 范例 结果
**

  •   					加	 						${17+5}														22
    
  •   					减							${17-5}														12
    
  •   					乘							${17*5}														85
    

/或div 除 17 / 5 或 {17/5}或 17/5{17 div 5} 3
%或mod 取余 KaTeX parse error: Expected '}', got 'EOF' at end of input: {17%5}或{17 mod 5} 2
==或eq 等于 5 = = 5 或 {5==5}或 5==5{5 eq 5} true
!=或ne 不等于 5 ! = 5 或 {5!=5}或 5!=5{5 ne 5} false
<或lt 小于 3 &lt; 5 或 {3&lt;5}或 3<5{3 lt 5} true

或gt 大于 3 &gt; 5 或 {3&gt;5}或 3>5{3 gt 5} false
<=或le 小于等于 3 &lt; = 5 或 {3&lt;=5}或 3<=5{3 le 5} true
=或ge 大于等于 3 &gt; = 5 或 {3&gt;=5}或 3>=5{3 ge 5} false
&&或and 并且 KaTeX parse error: Expected '}', got '&' at position 6: {true&̲&false}或{true and false} false
!或not 非 ! t r u e 或 {!true}或 !true{not true} false
||或or 或者 t r u e ∣ ∣ f a l s e 或 {true||false}或 truefalse{true or false} true
empty 是否为空 ${empty “”},可以判断字符串、数组、
集合的长度是否为0,为0返回true。
empty还可以与not或!一起使用。
${not empty “”} true**

5 EL内置对象
在EL表达式中,无需创建就可以使用的对象称之为EL隐藏(隐含、内置)对象。在EL中一共有11个隐藏对象,它们都与Map相似。其中10是Map,一个是 PageContext

1 参数隐藏对象
这些隐藏对象都是Map类型!
 param:param是Map<String,String>类型!param对象可以用来获取参数,与request.getParameter()方法相同。

注意,在使用EL获取参数时,如果参数不存在,返回的是空字符串,而不是null。这一点与使用request.getParameter()方法是不同的。

** paramValues:paramValues是Map<String, String[]>类型,当一个参数名,对应多个参数值时可以使用它。

 header:header是Map<String,String>类型,用来获取请求头。

 headerValues:headerValues是Map<String,String[]>类型。当一个请求头名称,对应多个值时,使用该对象,这里就不在赘述。
 initParam:initParam是Map<String,String>类型。它对应web.xml文件中的参数。

 cookie:cookie是Map<String,Cookie>类型,其中key是Cookie的名字,而值是Cookie对象本身。**

2 域隐藏对象
使用EL表达式最为常用的就是获取域对象中保存的数据。例如: p a g e S c o p e . x x x , 表 示 获 取 在 p a g e C o n t e x t 保 存 的 数 据 。 当 然 {pageScope.xxx},表示获取在pageContext保存的数据。当然 pageScope.xxxpageContext{pageScope[‘xxx’]}是相同的!
 pageScope:pageScope是Map<String,Object>类型,${pageScope.xxx}的功能相等与pageContext.getAttribute(“xxx”)。两者的区别在于,前者在数据不存在时返回空字符串,而后者返回null。

 requestScope:requestScope是Map<String, Object>类型,装载了request对象中的所有数据;
 sessionScope:sessionScope是Map<String, Object>类型,装载了session对象中的所有数据;
 applicationScope:applicationScope是Map<String, Object>类型,装载了application对象中的所有数据;

当EL中给出的不是隐藏对象时,表示在四个域中查找数据。例如:KaTeX parse error: Unexpected character: '' at position 10: {a},表示 **̲ 在{pageScope.a}中查找,如果找到就返回;
 在KaTeX parse error: Unexpected character: '' at position 28: …e}中查找,如果找到就返回; ̲ 在{sessionScope}中查找,如果找到就返回;
 在${applicationScope}中查找,如果找到就返回,找不到就返回空字符串。**

3 页面上下文隐藏对象

	pageContext:pageContext是PageContext类型!可以使用pageContext对象调用getXXX()方法,例如pageContext.getRequest,可以${pageContext.request}。

Expression 说明

${pageContext.request.queryString}	pageContext.getRequest().getQueryString();
${pageContext.request.requestURL}	pageContext.getRequest().getRequestURL();
${pageContext.request.contextPath}	pageContext.getRequest().getContextPath();
${pageContext.request.method}	pageContext.getRequest().getMethod();
${pageContext.request.protocol}	pageContext.getRequest().getProtocol();
${pageContext.request.remoteUser}	pageContext.getRequest().getRemoteUser();
${pageContext.request.remoteAddr}	pageContext.getRequest().getRemoteAddr();
${pageContext.session.new}	pageContext.getSession().isNew();
${pageContext.session.id}	pageContext.getSession().getId();
${pageContext.servletContext.serverInfo}	pageContext.getServletContext().getServerInfo();

1 JSTL概述

1 什么是JSTL
JSP 标准标记库(JSP Standard Tag Library,JSTL)是一个实现 Web 应用程序中常见的通用功能的定制标记库集,这些功能包括迭代和条件判断、数据管理格式化、XML 操作以及数据库访问。既然是第三方的东西,那么就需要导包。但是如果你使用的是MyEclipse,那么MyEclipse会帮你导包的。
2 导入标签库
导入标签库需要使用taglib指令!

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

这东西不用去背,可以把光标放到uri属性位置上,使用Alt+/来查看uri列表,找到其中包含jstl,并且包含core的就是了。

2 JSTL核心库

1 out和set(重点)
 out
<c:out value=”aaa”/> 输出aaa字符串常量
<c:out value=” a a a ” / &gt; 与 {aaa}”/&gt; 与 aaa/>{aaa}相同
<c:out value=” a a a ” d e f a u l t = ” x x x ” / &gt; 当 {aaa}” default=”xxx”/&gt; 当 aaadefault=xxx/>{aaa}不存在时,输出xxx字符串
<%
request.setAttribute(“a”,“”);
%>
<c:out value="${a }" default=“xxx” escapeXml=“false” /> 当escapeXml为false,不会转换“<”、“>”。这可能会受到JavaScript攻击。

set:set标签的var、value、scope是一组,而target、property、value是一组。
<c:set var=”a” value=”hello”/> 在pageContext中添加name为a,value为hello的数据。
<c:set var=”a” value=”hello” scope=”session”/> 在session中添加name为a,value为hello的数据。
<jsp:useBean id=“user” class=“com.rl.domain.User”/>
<c:set target=" u s e r &quot; p r o p e r t y = &quot; u s e r n a m e &quot; v a l u e = &quot; r e n l i a n g &quot; / &gt; &lt; c : s e t t a r g e t = &quot; {user }&quot; property=&quot;username&quot; value=&quot;renliang&quot;/&gt; &lt;c:set target=&quot; user"property="username"value="renliang"/><c:settarget="{user }" property=“password” value=“123456”/>
<c:out value="${user }" /> 给user的username属性赋值renliang,给user的password属性赋值123456。

2 if和choose(重点)
  if标签的test属性必须是一个boolean类型的值,如果test的值为true,那么执行if标签的内容,否则不执行。

<c:set var="a" value="hello"/>
<c:if test="${not empty a }">
	<c:out value="${a }"/>
</c:if>

choose标签对应Java中的if/else if/else结构
when标签的test为true时,会执行这个when的内容。
当所有when标签的test都为false时,才会执行otherwise标签的内容

<c:set var="score" value="${param.score }"/>
<c:choose>
	<c:when test="${score > 100 || score < 0}">错误的分数:${score }</c:when>
	<c:when test="${score >= 90 }">A级</c:when>
	<c:when test="${score >= 80 }">B级</c:when>
	<c:when test="${score >= 70 }">C级</c:when>
	<c:when test="${score >= 60 }">D级</c:when>
	<c:otherwise>E级</c:otherwise>
</c:choose>

3 forEach(重点)

forEach当前就是循环标签了,下面例子中设置域变量i,初始值为1,结束值为100。即i的值从1遍历到100,包含100。

<c:set var="sum" value="0" />
<c:forEach var="i" begin="1" end="10">
	<c:set var="sum" value="${sum + i}" />
</c:forEach>
<c:out value="sum = ${sum }"/>
<c:set var="sum" value="0" />
<c:forEach var="i" begin="1" end="10" step="2">
	<c:set var="sum" value="${sum + i}" />
</c:forEach>
<c:out value="sum = ${sum }"/>

还可以使用forEach来遍历数据或集合,遍历数组:

<%
String[] names = {"zhangSan", "liSi", "wangWu", "zhaoLiu"};
pageContext.setAttribute("ns", names);
%>
<c:forEach var="item" items="${ns }">
	<c:out value="name: ${item }"/><br/>
</c:forEach>

遍历List

<%
	List<String> names = new ArrayList<String>();
	names.add("zhangSan");
	names.add("liSi");
	names.add("wangWu");
	names.add("zhaoLiu");
	pageContext.setAttribute("ns", names);
%>
<c:forEach var="item" items="${ns }">
	<c:out value="name: ${item }"/><br/>
</c:forEach>

遍历Map

<%
	Map<String,String> stu = new LinkedHashMap<String,String>();
	stu.put("number", "N_1001");
	stu.put("name", "zhangSan");
	stu.put("age", "23");
	stu.put("sex", "male");
	pageContext.setAttribute("stu", stu);
%>
<c:forEach var="item" items="${stu }">
	<c:out value="${item.key }: ${item.value }"/><br/>
</c:forEach>

forEach标签还有一个属性:varStatus,这个属性用来指定接收“循环状态”的变量名,例如:<forEach varStatus=”vs” …/>,这时就可以使用vs这个变量来获取循环的状态了。
current当前这次迭代的(集合中的)项
index当前这次迭代从 0 开始的迭代索引
count当前这次迭代从 1 开始的迭代计数
first用来表明当前这轮迭代是否为第一次迭代的标志
last用来表明当前这轮迭代是否为最后一次迭代的标志

<c:forEach var="item" items="${ns }" varStatus="vs">
	<c:if test="${vs.first }">第一行:</c:if>
	<c:if test="${vs.last }">最后一行:</c:if>
	<c:out value="第${vs.count }行: "/>
	<c:out value="[${vs.index }]: "/>
	<c:out value="name: ${vs.current }"/><br/>
</c:forEach>

3 格式化标签库
导入标签库需要使用taglib指令!
<%@ taglib prefix=“fmt” uri=“http://java.sun.com/jsp/jstl/format” %>

数字:<fmt:formatNumber value=“1234567890” type=“number”/>

定制数字格式时,0表示一位数字,# 表示一位数字前导零和末尾零不展示
数值:<fmt:formatNumber value=“1234567890” type=“number” pattern="#,#00.0#" />

货币:<fmt:formatNumber value=“35000” type=“currency” />

百分比:<fmt:formatNumber value=“0.317” type=“percent” />

时间类型格式化
<jsp:useBean id=“now” class=“java.util.Date”></jsp:useBean>
<fmt:formatDate value=" n o w &quot; t y p e = &quot; d a t e &quot; / &gt; &lt; b r / &gt; &lt; f m t : f o r m a t D a t e v a l u e = &quot; {now}&quot; type=&quot;date&quot; /&gt;&lt;br/&gt; &lt;fmt:formatDate value=&quot; now"type="date"/><br/><fmt:formatDatevalue="{now}" type=“both” dateStyle=“long” timeStyle=“long” />

<fmt:formatDate value="${now}" type=“both” pattern=“yyyy.MM.dd HH:mm:ss” />

将字符串转化到正确的数字:
忽略第一个不符合数字条件的字符和其之后的所有字符,如果字符串不是以数字开头则报错
<fmt:parseNumber type=“number” >123.02a</fmt:parseNumber>

<fmt:parseNumber type=“number” pattern="#,#00.0#">123</fmt:parseNumber>

<fmt:parseNumber type=“number” pattern="#,#00.0#">123.00a1</fmt:parseNumber>

<fmt:parseNumber type=“number” pattern="#,#00.0#">3saaa</fmt:parseNumber>

4 EL函数库

1 什么EL函数库
  EL函数库是由第三方对EL的扩展,我们现在学习的EL函数库是由JSTL添加的。下面我们会学习JSTL标签库。
EL函数库就是定义一些有返回值的静态方法。然后通过EL语言来调用它们!当然,不只是JSTL可以定义EL函数库,我们也可以自定义EL函数库。
  EL函数库中包含了很多对字符串的操作方法,以及对集合对象的操作。例如:${fn:length(“abc”)}会输出3,即字符串的长度。

2 导入函数库
  因为是第三方的东西,所以需要导入。导入需要使用taglib指令!
<%@ taglib prefix=“fn” uri=“http://java.sun.com/jsp/jstl/functions” %>

3 EL函数库介绍

	String toUpperCase(String input):
	String toLowerCase(String input):
	int indexOf(String input, String substring):
	boolean contains(String input, String substring):
	boolean containsIgnoreCase(String input, String substring):
	boolean startsWith(String input, String substring):
	boolean endsWith(String input, String substring):
	String substring(String input, int beginIndex, int endIndex):
	String substringAfter(String input, String substring):
	substringBefore(String input, String substring):
	String escapeXml(String input):
	String trim(String input):
	String replace(String input, String substringBefore, String substringAfter):
	String[] split(String input, String delimiters):
	int length(Object obj):
	String join(String array[], String separator):

<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
…
String[] strs = {"a", "b","c"};
List list = new ArrayList();
list.add("a");
pageContext.setAttribute("arr", strs);
pageContext.setAttribute("list", list);
%>
${fn:length(arr) }<br/><!--3-->
${fn:length(list) }<br/><!--1-->
${fn:toLowerCase("Hello") }<br/> <!-- hello -->
${fn:toUpperCase("Hello") }<br/> <!-- HELLO -->
${fn:contains("abc", "a")}<br/><!-- true -->
${fn:containsIgnoreCase("abc", "Ab")}<br/><!-- true -->
${fn:contains(arr, "a")}<br/><!-- true -->
${fn:containsIgnoreCase(list, "A")}<br/><!-- true -->
${fn:endsWith("Hello.java", ".java")}<br/><!-- true -->
${fn:startsWith("Hello.java", "Hell")}<br/><!-- true -->
${fn:indexOf("Hello-World", "-")}<br/><!-- 5 -->
${fn:join(arr, ";")}<br/><!-- a;b;c -->
${fn:replace("Hello-World", "-", "+")}<br/><!-- Hello+World -->
${fn:join(fn:split("a;b;c;", ";"), "-")}<br/><!-- a-b-c -->

${fn:substring("0123456789", 6, 9)}<br/><!-- 678 -->
${fn:substring("0123456789", 5, -1)}<br/><!-- 56789 -->
${fn:substringAfter("Hello-World", "-")}<br/><!-- World -->
${fn:substringBefore("Hello-World", "-")}<br/><!-- Hello -->
${fn:trim("     a b c     ")}<br/><!-- a b c -->
${fn:escapeXml("<html></html>")}<br/> <!-- <html></html> -->
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值