第四十五篇(EL和JSTL)

EL和JSTL

1. 掌握EL表达式优化JSP页面显示

1.1 EL的概述
<%
	Object obj = request.getAttribute("categoryList");
	// 想使用集合
	if(obj != null){
    	List<Category> categoryList = (List<Category>)obj;
	}
%>
// ${categoryList}   |  ${requestScope.categoryList}   
// ${not empty categoryList}

<%
	// 取出来信息
	User user = (User)session.getAttribute("loginUser");
	// 假设不为空:取用户的数据
	user.getUserName();
	user.getUserPassword();
%>
// ${loginUser}
// ${loginUser.userName}
// ${loginUser.userPassword}

EL(Expression Language):它是JSP中专门用于从四大作用域中取数据的一种表达式语言。
四大作用域:

  • page:存储的数据只能在当前JSP页面使用。
  • request:存储的数据只能在同一次请求中有效(请求转发可以保证请求不会重新发起)。
  • session:存储的数据只能在同一个会话中有效(只要浏览器不会完全关闭,都属于一个会话,其他它利用的cookie技术)。
  • application:存储的数据可以在整个应用中都有效(服务器开启则可以使用,关闭则自动销毁)。
1.2 EL的基本语法

从作用域中取出变量数据。

${作用域中的变量名}
例如:request.setAttribute("username","张三");
取数据:${username}
// EL在取数据时,如果查找不到,则默认不显示,不像之前的getAttribute()系列返回null

// 其实最完整的语法应该如下: 从作用域中取数据 应该添加上作用域的前缀
${pageScope.键名}
${requestScope.键名}
${sessionScope.键名}
${applicationScope.键名}

// 当采用上方的简写形式时,它会默认从page -> request -> session -> application依次查找数据(范围小 ->  范围大)
1.3 EL操作各类型数据
  • EL操作数组
    例如:${nameArr[索引]}

  • EL操作对象
    可以使用.来获取对象的属性,也可以使用[],它们实质上调用的还是getter方法

    用户名:${loginUser.username}<br/>
    用户类型:${loginUser.userType}<br/>
    
    用户名:${loginUser["username"]}
    
  • EL操作集合
    List 类似于数组
    Map 类似于对象操作

1.4 EL操作运算符

EL内支持各种运算符,算术运算符、关系运算符、逻辑运算符合三元运算符。

另外它还有一个特别的关键字:empty用于判断一个字符串(null、空字符串)、集合(null、空集合)等内容是否为空。
判断不为空:not empty

1.5 EL隐式对象
  • pageScope

  • requestScope

  • sessionScope

  • applicationScope

  • pageContext:用于获取其他的作用域对象

  • param: 等价于request.getParameter(name)

  • paramValues:等价于request.getParameterValues(name)

  • header:获取请求头信息

  • headerValues:获取多个请求头信息

  • initParams:获取web.xml中配置的初始化参数信息

  • cookie:获取cookie信息

2. 掌握JSTL优化JSP页面显示

JSTL:(Java Server Pages Standard Tag Library)

<%

for(){

}

%>

它需要结合EL表达式来使用!用于在JSP页面进行一些数据处理操作。 选择结构、循环结构…

JSTL默认没有集成在Java EE中,想使用必须先下载并导入。

使用步骤:

  1. 下载jstl 1.2并导入工程

  2. 通过tablib声明引入到JSP页面

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

2.1 JSTL输出

<c:out></c:out>

<!-- 
    out标签是用来向页面输出内容 它通常输出的是EL表达式的内容
        value:表达式
        default:默认值
        escapeXml:默认为true表示 忽略XML(不解析)
        如果改为false则重新解析
-->
<%
// request.setAttribute("uname", "张三");
%>
<%-- <c:out value="${uname}"></c:out> --%>
<%-- <c:out value="${uname}" default="未知用户"></c:out> --%>
<c:out value="<a href=''>点我跳转百度</a>" escapeXml="false"></c:out>
2.2 JSTL设置
<!-- 
		set标签可以用于向作用域中存储数据
			var:键名
			value:值/也可以写EL
			scope:作用域名
	 -->
	<%
		// request.setAttribute("uname", "张三");
		User user = new User();
		user.setUsername("李四");
		request.setAttribute("loginUser",user);
	%>
	${uname}<br/>
	<%-- <c:set var="uname" value="张三" scope="request"></c:set> --%>
	<!-- 
		target:EL表达式  对象
		property:给某个对象的某个属性赋值
		value:要赋的值
	 -->
	<c:set target="${loginUser}" property="userType" value="1" ></c:set>
	用户名:${loginUser.username}<br/>
	用户类型:${loginUser.userType}
2.3 JSTL移除
<c:remove var="uname" scope="page"/>  从指定作用域移除内容
2.4 条件语句-选择结构
<c:if test=""></c:if>
<c:choose>
	<c:when test=""></c:when>
	<c:otherwise></c:otherwise>
</c:choose>
<c:set var="userType" value="2"></c:set>
	当前登录用户类型为:
	<%-- <c:if test="${userType == 1}">经理</c:if>
	<c:if test="${userType == 0}">普通员工</c:if> --%>
	
	<!-- 类似于多重if , 不要在此标签内写注释等其他标签 -->
	<c:choose>
		<c:when test="${userType == 1}">经理</c:when>
		<c:when test="${userType == 2}">老板</c:when>
		<c:otherwise>普通员工</c:otherwise>
	</c:choose>
2.5 循环语句-循环结构
<c:forEach items="" var="" varStatus="" begin="" end="" step=""></c:forEach>
<%
		User user1 = new User("张三",2);
		User user2 = new User("李四",0);
		User user3 = new User("王五",1);
		List<User> userList = Arrays.asList(user1,user2,user3);
		
		request.setAttribute("userList", userList);
	%>
	
	<!-- 
	
		items:要遍历的集合(EL来获取)
		var:遍历出来的每一个元素
		varStatus:遍历出来的元素的状态信息(对象信息)
			index:索引
			count:当前是遍历的第几个(循环次数)
	 -->
	<%-- <c:forEach items="${userList}" var="user" varStatus="status">
		${status.count} --> ${user.username}<br/>
	</c:forEach> --%>
	
	
	<!-- 
		begin:从...第几个开始
		end:到第几个结束
		step:步进(间隔/步长)
	 -->
	<%-- <c:forEach begin="1" end="10" step="2"  var="num">
		${num}<br/>
	</c:forEach> --%>
	
	
	<!-- 遍历map集合 -->
	<%
		Map<String,Object> map = new HashMap<>();
		map.put("username","张三");
		map.put("abc","李四");
		map.put("123","王五");
		request.setAttribute("map", map);
	%>
	<c:forEach items="${map}" var="entry">
		${entry.key} --> ${entry.value}<br/>
	</c:forEach>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值