EL表达式

EL表达式:

EL表达式,全称是Expression Language。意为表达式语言。它是Servlet规范中的一部分,是JSP2.0规范加入的内容。其作用是用于在JSP页面中获取数据,从而让我们的JSP脱离java代码块和JSP表达式。

EL注意事项:
  • 没有空指针异常
  • 没有索引越界异常
  • 没有字符串凭拼接效果
  • EL表达式除了能在四大域中获取数据,同时它可以访问其他隐式对象,并且访问对象有返回值的方法
基本语法:

EL表达式的语法格式: ${表达式内容}

Java代码块 JSP表达式 EL表达式
<%

String message = (String)request.getAttribute("message");
out.write(message);
%>
<%=request.getAttribute("message")%> ${message}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--向域对象添加数据--%>
<% request.setAttribute("username", "itzhuzhu");%>

<%--三种方式获取数据--%>
Java代码块获取 <%out.println(request.getAttribute("username"));%><br>

JSP表达式获取 <%=request.getAttribute("username")%><br>

EL表达式:${username}
</body>
</html>

通过上面我们可以看出,都可以从请求域中获取数据,但是EL表达式写起来是最简单的方式。这也是以后我们在实际开发中,当使用JSP作为视图时,绝大多数都会采用的方式。

EL获取数据类型:
%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    
    <title>Title</title>
</head>
<body>
<%--获取基本数据类型--%>
<% pageContext.setAttribute("num", 23);%>
基本数据类型:${num}<br>

<%--获取自定义对象类型--%>
<%
    Student2 student = new Student2("itzhuzhu", 23);
    pageContext.setAttribute("student", student);
%>
自定义对象:${student}<br>
${student.username}
${student.age}

<%--获取数组类型--%>
<%
    String[] arr = {"呵呵", "哈哈", "呵呵"};
    pageContext.setAttribute("arr", arr);
%>
数组:${arr}<br>


<%--获取集合--%>
<%
    ArrayList<String> list = new ArrayList<>();
    list.add("a");
    list.add("b");
    list.add("c");
%>
List集合:${list}<br>
${list[0]}<br>

<%
    HashMap<String, Student2> hashMap = new HashMap<>();
    hashMap.put("a", new Student2("韩信", 11));
    hashMap.put("a", new Student2("李白", 12));
    pageContext.setAttribute("hashMap", hashMap);
%>%

Map集合:${hashMap}<br>


<%--获取四大域对象中的数据--%>

<%
    pageContext.setAttribute("username", "itzhuzhu");
    request.setAttribute("username", "itzhuzhu");
    session.setAttribute("username", "itzhuzhu");
    application.setAttribute("username", "itzhuzhu");
%>
</body>
</html>
EL运算符:

其他的和java一样

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    String s = null;
    String s2 = "";
    int[] arr = {};
%>
${empty s}<br>
${empty s2}<br>
${empty arr}<br>

三元运算符
<%
    pageContext.setAttribute("gender", "girl");
%>

<input type="radio" name="gender" value="boy"${gender == "boy"? "checked":""}><input type="radio" name="gender" value="girl"${gender == "girl"? "checked":""}>></body>
</html>
隐式对象介绍:

EL表达式提供的隐式对象,可以不声明直接来使用,它和JSP的隐式对象不是一回事:

EL中的隐式对象 类型 对应JSP隐式对象 备注
PageContext Javax.serlvet.jsp.PageContext PageContext 完全一样
ApplicationScope Java.util.Map 没有 应用层范围
SessionScope Java.util.Map 没有 会话范围
RequestScope Java.util.Map 没有 请求范围
PageScope Java.util.Map 没有 页面层范围
Header Java.util.Map 没有 请求消息头key,值是value(一个)
HeaderValues Java.util.Map 没有 请求消息头key,值是数组(一个头多个值)
Param Java.util.Map 没有 请求参数key,值是value(一个)
ParamValues Java.util.Map 没有 请求参数key,值是数组(一个名称多个值)
InitParam Java.util.Map 没有 全局参数,key是参数名称,value是参数值
Cookie Java.util.Map 没有 Key是cookie的名称,value是cookie对象

JSTL:

JSTL的全称是:JSP Standard Tag Libary。它是JSP中标准的标签库。它是由Apache实现的。

作用:

给开发人员提供通用的标签库,取代JSP页面上的代码,提高代码可读性,降低维护性

JSTL的组成:
组成 作用 说明
Core 核心标签库。 通用逻辑处理
Fmt 国际化有关。 需要不同地域显示不同语言时使用
Functions EL函数 EL表达式可以使用的方法
SQL 操作数据库。 不用
XML 操作XML。 不用
使用要求:

要想使用JSTL标签库,需要添加jar包。

核心标签库

标签名称 功能分类 分类 作用
流程控制 核心标签库 用于判断
,, 流程控制 核心标签库 用于多个条件判断
迭代操作 核心标签库 用于循环遍历

演示:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%--导入jstl标签库 --%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>JSTL的常用标签</title>
  </head>
  <body>
    <%-- c:if  c:choose   c:when c:otherwise --%>
    <% pageContext.setAttribute("score","F"); %>
    <c:if test="${pageScope.score eq 'A' }">
    	优秀
    </c:if>
    <c:if	test="${pageScope.score eq 'C' }">
    	一般
    </c:if>
    <hr/>
    <c:choose>
    	<c:when test="${pageScope.score eq 'A' }">
    		AAA
    	</c:when>
    	<c:when test="${pageScope.score eq 'B' }">BBB
    	</c:when>
    	<c:when test="${pageScope.score eq 'C' }">CCC
    	</c:when>
    	<c:when test="${pageScope.score eq 'D' }">DDD
    	</c:when>
    	<c:otherwise>其他</c:otherwise>
    </c:choose>
    
    <%-- c:forEach 它是用来遍历集合的
    	 属性:
    	 	items:要遍历的集合,它可以是EL表达式取出来的
    	 	var:把当前遍历的元素放入指定的page域中。 var的取值就是key,当前遍历的元素就是value
    	 		注意:它不能支持EL表达式,只能是字符串常量
    	 	begin:开始遍历的索引
    	 	end:结束遍历的索引
    	 	step:步长。i+=step
    	 	varStatus:它是一个计数器对象。里面有两个属性,一个是用于记录索引。一个是用于计数。
    	 			   索引是从0开始。计数是从1开始
    --%>
    <hr/>
    <% List<String> list = new ArrayList<String>();
       list.add("AAA");
       list.add("BBB");
       list.add("CCC");
       list.add("DDD");
       list.add("EEE");
       list.add("FFF");
       list.add("GGG");
       list.add("HHH");
       list.add("III");
       list.add("JJJ");
       list.add("KKK");
       list.add("LLL");
       pageContext.setAttribute("list",list);
     %>
	<c:forEach items="${list}" var="s" begin="1" end="7" step="2">
    	${s}<br/>
    </c:forEach>
    <hr/>
    <c:forEach begin="1" end="9" var="num">
    	<a href="#">${num}</a>
    </c:forEach>
    <hr/>
    <table>
    	<tr>
    		<td>索引</td>
    		<td>序号</td>
    		<td>信息</td>
    	</tr>
    <c:forEach items="${list}" var="s" varStatus="vs">
    	<tr>
    		<td>${vs.index}</td>
    		<td>${vs.count}</td>
    		<td>${s}</td>
    	</tr>
    </c:forEach>
    </table>
  </body>
</html>

JSTL Functions标签库

在JSTL Functions标签库中提供了一组常用的EL函数,主要用于处理字符串,在JSP中可以直接使用这些函数。在JSP文件中使用Functions标签库,要先通过taglib指令引入该标签库:

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

Functions标签库中常用的16个函数的用法,这些函数的名字及作用与java.lang.String类中的相应方法很相似。例如:fn:indexOf函数与类String类的indexOf()方法的作用相似,fn:substring函数与String类的substring()方法的作用相似。

fn:contains函数:
fn:contains函数用于判断在源字符串中是否包含目标字符串,其语法为:
	fn:contains(String source,String target) -------boolean;
以上source参数指定源字符串,target参数指定目标字符串,返回类型为boolean。
例如对于以下EL表达式:
	${fn:contains(“Tomcat”,”cat”)}

${fn:contains(“Tomcat”,”CAT”)}
第一个EL表达式的值为true,第二个EL表达式的值为false。

fn:containsIgnoreCase函数:
fn:containsIgnoreCase函数用于判断在源字符串中是否包含目标字符串,并且在判断时忽略大小写,其语法为:
fn: containsIgnoreCase (String source,String target) -------boolean;
以上source参数指定源字符串,target参数指定目标字符串,返回类型为boolean。
例如对于以下EL表达式:
	${fn: containsIgnoreCase (“Tomcat”,”CAT”)}

${fn: containsIgnoreCase (“Tomcat”,”Mike”)}
第一个EL表达式的值为true,第二个EL表达式的值为false。

fn:startsWith函数:
fn:startsWith函数用于判断源字符串是否以指定的目标字符串开头,其语法为:
	fn:startsWith(String source,String target) ----boolean
以上source参数指定源字符串,target参数指定目标字符串,返回类型为boolean。
例如对于以下EL表达式:
	${fn: startsWith (“Tomcat”,”Tom”)}
	${fn: startsWith (“Tomcat”,”cat”)}
第一个EL表达式的值为true,第二个EL表达式的值为false。
fn:endsWith函数:

fn: endsWith函数用于判断源字符串是否以指定的目标字符串结尾,其语法为:
fn: endsWith (String source,String target) ----boolean
以上source参数指定源字符串,target参数指定目标字符串,返回类型为boolean。
例如对于以下EL表达式:
${fn: endsWith (“Tomcat”,”cat”)}
${fn: endsWith (“Tomcat”,”Tom”)}
第一个EL表达式的值为true,第二个EL表达式的值为false。

fn:indexOf函数:
fn:indexOf函数用于在源字符串中查找目标字符串,并返回源字符串中最先与目标字符串匹配的第一个字符的索引,如果在源字符串中不包含目标字符串,就返回-1,源字符串中的第一个字符的索引为0。 fn:indexOf函数的语法为:
	fn: indexOf (String source,String target) ----int
以上source参数指定源字符串,target参数指定目标字符串,返回类型为int。
例如对于以下EL表达式:
	1	${fn: indexOf (“Tomcat”,”cat”)}
2 ${fn: indexOf (“2211221”,”21”)}
3 ${fn: indexOf (“Tomcat”,”Mike”)}
其输出结果为: 1 3 2 1 3 -1
fn:replace函数:
fn:replace函数用于把源字符串中的一部分替换为另外的字符串,并返回替换后的字符串。fn:replace函数的语法为:
	fn: replace (String source,String before,String after) ----String
以上source参数指定源字符串,before参数指定源字符串中被替换的子字符串,after参数指定用于替换的子字符串,返回类型为String。
例如对于以下EL表达式:
	1	${ fn: replace(“TomcAt”,”cAt”,”cat”)}
2 ${ fn: replace(“2008/1/9”,”/”,”-”)}
其输出结果为: 1 Tomcat 2 2008-1-9
fn:substring函数:
fn:substring函数用于获取源字符串中的特定子字符串,它的语法为:
	fn:substring(String source,int beginIndex,int endIndex) ------String
以上source参数指定源字符串,beginIndex参数表示子字符串中的第一个字符在源字符串中的索引,endIndex参数表示子字符串的最后一个字符在源字符串中的索引加1,返回类型为String,源字符串中的第一个字符的索引为0。
例如对于以下EL表达式:
	1	${ fn: substring (“Tomcat”,0,3)}
2 ${ fn: substring (“Tomcat”,3,6)}
其输出结果为: 1 Tom 2 cat
fn:substringBefore函数:
fn:substringBefore函数用于获取源字符串中指定子字符串之前的子字符串,其语法为:
	fn:substringBefore(String source,String target) ----String
以上source参数指定源字符串,target参数指定子字符串,返回类型为String。如果在源字符串中不包含特定子字符串,就返回空字符串。
例如对于以下EL表达式:
	1	${ fn: substringBefore (“Tomcat”,”cat”)}
2 ${ fn: substringBefore (“mydata.txt”,”.txt”)}
其输出结果为: 1 Tom 2 mydata
fn:substringAfter函数:
fn: substringAfter函数用于获取源字符串中指定子字符串之后的子字符串,其语法为:
	fn: substringAfter (String source,String target) ----String
以上source参数指定源字符串,target参数指定子字符串,返回类型为String。如果在源字符串中不包含特定子字符串,就返回空字符串。
例如对于以下EL表达式:
	1	${ fn: substringAfter (“Tomcat”,”Tom”)}
2 ${ fn: substringAfter (“mydata.txt”,” mydata.”)}
其输出结果为: 1 cat 2 txt
fn:split函数:
fn:split函数用于将源字符串拆分为一个字符串数组,其语法为:
	fn: split (String source,String delimiter) ----String[]
以上source参数指定源字符串,delimiter参数指定用于拆分源字符串的分隔符,返回类型为String[]。如果在源字符串中不包含delimiter参数指定的分隔符,或者delimiter参数为null,那么在返回的字符串数组中只有一个元素,为源字符串。
例如对于以下EL表达式:
	
	
		${token}

其输出结果为:
www
mywebsite
org
再例如对于以下代码:

${strs[0]}
其输出结果为:
www.mywebsite.org

fn:join函数:
fn:join函数用于将源字符串数组中的所有字符串连接为一个字符串,其语法为:
	fn:join(String source[],String separator) ----String
以上source参数指定源字符串数组,separator参数指定用于连接源字符串数组中的各个字符串的分隔符,返回类型为String。
例如对于以下代码:
	<%
	String strs[] = {“www”,”mywebsite”,”org”};

%>
” var=”strs”/>
${fn:join(strs,”.”)}
其输出结果为:
www. mywebsite. org

fn:toLowerCase函数:
fn:toLowerCase函数用于将源字符串中的所有字符改为小写,其语法为:
	fn:toLowerCase(String source)  -----String
以上source参数指定源字符串,返回类型为String。
例如对于以下EL表达式:
	fn:toLowerCase(“TomCat”)
其输出结果为:
	tomcat
fn:toUpperCase函数:
fn: toUpperCase函数用于将源字符串中的所有字符改为大写,其语法为:
	fn: toUpperCase (String source)  -----String
以上source参数指定源字符串,返回类型为String。
例如对于以下EL表达式:
	fn: toUpperCase (“TomCat”)
其输出结果为:
	TOMCAT
fn:trim函数:
fn:trim函数用于将源字符串中的开头和末尾的空格删除,其语法为:
	fn:trim(String source) ----String
以上source参数指定源字符串,返回类型为String。
例如对于以下EL表达式:
	fn:trim(“   Tomcat   ”)
以上EL表达式的值为“Tomcat”。
fn:escapeXml函数:
fn:escapeXml函数用于将源字符串中的字符“<”、“>”、“””和“&”等转换为转义字符,本书第1章的1.2节(HTML简介)介绍了转义字符的概念。fn:escapeXml函数的行为与标签的escapeXml属性为true时的转换行为相同,fn:escapeXml函数的语法为:
fn:escapeXml(String source) ----String
以上source参数指定源字符串,返回类型为String。
例程18-1的out.jsp演示了fn:escapeXml函数的用法。

例程18-1 out.jsp
<%@ page language=“java” contentType=“text/html; charset=UTF-8” pageEncoding=“UTF-8”%>
<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c”%>
<%@ taglib uri=“http://java.sun.com/jsp/jstl/functions” prefix=“fn”%>

out 1.${fn:escapeXml(" 表示粗体字") }
2.
3.${" 表示粗体字"}
对于out.jsp中的以下代码:
	1.${fn:escapeXml("表示粗体字") }

2.表示粗体字” escapeXml=“true”>

3.${“表示粗体字”}

其输出结果为:
1.表示粗体字

2.表示粗体字

3.表示粗体字

fn:length函数:
fn:length函数用于返回字符串中的字符的个数,或者集合和数组的元素的个数,其语法为:
	fn:length(source) ---- int
以上source参数可以为字符串、集合或者数组,返回类型为int。
例程18-2的length.jsp演示了fn:length函数的用法。

例程18-2 length.jsp
<%@ page language=“java” contentType=“text/html; charset=UTF-8”
pageEncoding=“UTF-8”%>
<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c”%>
<%@ taglib uri=“http://java.sun.com/jsp/jstl/functions” prefix=“fn”%>
<%@page import=“java.util.ArrayList”%>

length <% int[] array = {1,2,3,4}; ArrayList list = new ArrayList(); list.add("one"); list.add("two"); list.add("three"); %> 数组长度:${fn:length(array)}
集合长度:${fn:length(list)}
字符串长度:${fn:length("Tomcat")}

你可能感兴趣的:(JavaEE,javaee,EL表达式,隐式对象,JSTL)