JSP-EL表达式,EL内置对象的使用,EL取值,JSTL的使用(三)

一、EL表达式(Expression Language)
1、目的:为了使JSP写起来更加简单。表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法,让Jsp的代码更加简化。
2、语法:由于EL可以简化JSP页面的书写,因此,在JSP的学习中,掌握EL是相当重要的。要使用EL表达式,首先要学习它的语法。EL表达式的语法非常简单,都是以“${”符号开始,以“}”符号结束的,具体格式如下:

${表达式}

二、EL的内置对象:
在这里插入图片描述如下示例(获得指定作用域的数据):

<%--初始化数据--%>
<%
	pageContext.setAttribute("name", "pValue");
	request.setAttribute("name", "rValue");
	session.setAttribute("name", "sValue");
	application.setAttribute("name", "aValue");
%>
<%--使用JSP脚本获得--%>
<%=pageContext.getAttribute("name") %> <!-- 如果没找到 返回null -->
<%=request.getAttribute("name") %>
<%=session.getAttribute("name") %>
<%=application.getAttribute("name") %>

<%--获得指定作用域的数据--%>
${ pageScope.name } <!-- 返回的是"" -->
${ requestScope.name }
${ sessionScope.name }
${ applicationScope.name }

<%--依次获得数据--%>
${ name } 	<%-- 底层使用 pageContext.findAttribute("name") ,依次从page、request、session、application获得数据,如果都没有返回null --%>

如下示例(请求参数):

//请求路径:/day18/a_el.jsp?username=jack&hobby=xxx&hobby=yyy
<%--
	param.xxx  		对应  request.getParameter("xxx");
	paramValue.xxx 	对应  request.getParameterValues("xxx");
 --%>
${param.username} <br/>
${param.hobby}<br/>			<%--获得第一个参数--%>
${paramValues.hobby} <br/>	<%--获得一组数据,使用数组 --%>
${paramValues.hobby[1]} <br/> <%--如果是数组,可以使用下标获得 --%>

如下示例(请求头):

<%-- 
	header.xxx 			对应 request.getHeader("xxx");
	headerValues.xxx 	对应 request.getHeaders("xxx");
--%>
${header.accept} <br/>
\${header.accept-Encoding} <br/> <%--非法的,有异常,“-”被解析成减号。使用"/"进行单个el表达式转义 --%>
${header['accept-Encoding']} <br/>
${headerValues['accept-Encoding'][0]} <br/>

如下示例(pageContext):

<%-- 
	pageContext 对应 pageContext对象
--%>

jsp:  <%= ((HttpServletRequest)pageContext.getRequest()).getContextPath() %> <br/>
el : ${pageContext.request.contextPath} <br/>

如下示例(全局初始化参数):

<%-- 
	web.xml配置
		<context-param>
			<param-name>person</param-name>
			<param-value>白跃</param-value>
		</context-param>
	initParam 对应 servletContext.getInitParameter("person"); 
--%>
${initParam.person}  

如下示例(cookie):

<%-- 
	cookie 没有对应api。底层使用request.getCookies()获得所有cookie,然后遍历并存放到Map中(Map<name,obj>)
--%>
${cookie} <br/> 		<%--使用Map存所有cookie , Map<名称,对象> --%>
${cookie.company} 		<%--map.key 获得对应value --%>
${cookie.company.name} 	<%--通过javabean属性获得属性,获得cookie的名称,对应方法getName()--%>
${cookie.company.value} <%--获得cookie的值值,对应方法getValue() --%>

注:
EL表达式在获取Map的值或Bean的属性值是,可以使用“点”的方法,也可以使用“下标”的方法。

${initParam.a}与${initParam['a']}

但是,如果Map的键或Bean的属性名中包含下划线或横杠时(携带特殊字符),那么就必须使用“下标”方法,例如:

${initParam['a_a']}

三、EL取值
如下示例

//自定义数据,必须存放在作用域
<% 
	String str = "传智播客";
%>
${str}	<%--无法获得,str不在域中 --%>

//获得字符串
<%
	String s = "黑马程序员";
	//将输出存放到作用域
	pageContext.setAttribute("sss", s);
%>
${sss} <br/>
${pageScope.sss} <br/>

//获得数组
<% 
	String[] arr = {"A","B","C"};

	pageContext.setAttribute("arr", arr,PageContext.REQUEST_SCOPE);
%>
${arr} <br/>
${arr[1]} <br/>

//获得List数据
<% 
	//模拟数据
	List<String> list = new ArrayList<String>();
	list.add("zhangsan");
	list.add("lisi");
	list.add("wangwu");
	pageContext.setAttribute("list", list);	
%>
${list}	<br/>  <%-- 输出格式:[ , , ] --%>
${list[2]} <br/>

//获得Map<String,String>数据
<%
	//模拟数据
	Map<String,String> map = new HashMap<String,String>();
	map.put("li", "小李");
	map.put("guo", "小郭");
	map.put("wang", "老王");
	pageContext.setAttribute("map", map);
%>

${map} <br/>	 	<%-- 输出结果: { k=v ,...} --%>
${map.li} <br/>		<%-- 通过key获得数据--%>

//获得Map<String,JavaBean>数据
<%
	Map<String,User> map2 = new HashMap<String,User>();
	map2.put("u1", new User("u001","jack",18));
	map2.put("u2", new User("u002","rose",21));
	map2.put("3", new User("u003","tom",25));
	pageContext.setAttribute("map2", map2);
%>

${map2} <br/>
${map2.u2} <br/>		<%--通过key获得数据 --%>
${map2.u2.userName} 	<%--通过javabean 属性获得数据 --%>
${map2['3'].userName} 	<%--可以通过字符串'3'获得数据,注意:Map.key类型为Integer,将不能获得数据 --%>

四、EL运算符
EL常用运算符及使用规则如下三张图:
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

五、JSTL
1、JSTP介绍:从JSP1.1规范开始,JSP就支持使用自定义标签,使用自定义标签大大降低了JSP页面的复杂度,同时增强了代码的重用性。为此,许多Web应用厂商都定制了自身应用的标签库,然而同一功能的标签由不同的Web应用厂商制定可能是不同的,这就导致市面上出现了很多功能相同的标签,令网页制作者无从选择,为了解决这个问题,Sun公司制定了一套标准标签库(JavaServer Pages Standard Tag Library),简称JSTL。
JSTL虽然被称为标准标签库,而实际上这个标签库是由5个不同功能的标签库共同组成的。在JSTL1.1规范中,为这5个标签库分别指定了不同的URI以及建议使用的前缀。
2、JSTL的使用
1)导入JSTL的两个依赖jar包
jstl.jar
standard.jar
2)在JSP页面头部导入导入JSTL标签库。例如导入核心库core的标签,如下所示:

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

引入后即可使用core的标签。

3、常用核心库标签
1)if标签
如果要在JSP页面中进行条件判断,就需要使用Core标签库提供的<c:if>标签,该标签专门用于完成JSP页面中的条件判断,它有两种语法格式,具体如下:
语法1:没有标签体的情况,将结果存放到指定的作用域(不常用)

<c:if test="testCondition" var="result" 
[scope="{page|request|session|application}"]/>

语法2:有标签体的情况,在标签体中指定要输出的内容

<c:if test="testCondition" >
	body content
</c:if>

在上述语法格式中,可以看到<c:if>标签有三个属性,接下来将针对这三个属性进行讲解,具体如下:

  • test属性用于设置逻辑表达式;
  • var属性用于指定逻辑表达式中变量的名字;
  • scope属性用于指定var变量的作用范围,默认值为page。如果属性test的计算结果为true,那么标签体将被执行,否则标签体不会被执行。

2)foreach标签
Core标签库提供了一个<c:forEach>标签,该标签专门用于迭代集合对象中的元素,如Set、List、Map、数组等,并且能重复执行标签体中的内容,它有两种语法格式,具体如下:
语法1:迭代包含多个对象的集合

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

在上述语法格式中,可以看到<c:forEach>标签有多个属性。接下来针对这些属性进行讲解,具体如下:

  • var属性用于指将当前迭代到的元素保存到page域中的名称;
  • items属性用于指定将要迭代的集合对象;
  • varStatus用于指定当前迭代状态信息的对象保存到page域中的名称;
    count:表示元素在集合中的序号,从1开始计数;
    index:表示当前元素在集合中的索引,从0开始计数;
    first:表示当前是否为集合中的第一个元素;
    last:表示当前是否为集合中的最后一个元素;
  • begin属性用于指定从集合中第几个元素开始进行迭代,begin的索引值从0开始,如果没有指定items属性,就从begin指定的值开始迭代,直到迭代结束为止;
  • step属性用于指定迭代的步长,即迭代因子的增量。

使用举例:

<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8" import="java.util.*"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head></head>
<body style="text-align: center;">
	<%
		List userList = new ArrayList();
		userList.add("Tom");
		userList.add("Make");
		userList.add("Lina");
	%>
	<table border="1">
		<tr>
			<td>序号</td>
			<td>索引</td>
			<td>是否为第一个元素</td>
			<td>是否为最后一个元素</td>
			<td>元素的值</td>
		</tr>
		<c:forEach var="name" items="<%=userList%>" varStatus="status">
			<tr>
				<td>${status.count}</td>
				<td>${status.index}</td>
				<td>${status.first}</td>
				<td>${status.last}</td>
				<td>${name}</td>
			</tr>
		</c:forEach>
	</table>
</body>
</html>

喜欢的朋友欢迎一键三连。我们一起学习,进步~~

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

stalin_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值