javaWeb之JSTL和EL表达式及区别

  • Post author:
  • Post category:java




javaWeb之JSTL和EL表达式

原生的jsp中嵌套java代码的写法,使得整个jsp页面看着比较混乱,牵扯到有逻辑判断的时候,大多数情况都需要进行拼接,拼接是比较麻烦的且容易出现错误,所以就有了jstl标签库和el表达式。



el表达式


el表达式

:通过一种特定的书写格式,能够简化小脚本中的代码量

<%
    Object obj = session.getAttribute("namekey");
    String name = (String)obj;
    out.println("name="+name);

    Object empObj = session.getAttribute("empkey");
    Emp emp = (Emp)empObj;
    String ename = emp.getEname();
    String sex = emp.getSex();
    out.println(ename+"--"+sex);
%>

<hr>
name:${namekey }
<!-- 该语法底层其实还是通过调用getter的方法来实现 -->
ename:${empkey.ename },
sex:${empkey.sex }

EL 存取变量数据的方法很简单,例如:${username}。它的意思是取出某一范围中名称为username的变量。

因为我们并没有指定哪一个范围的username,所以它的默认值会先从Page 范围找,假如找不到,再依序到Request、Session、Application范围。

pageContext–>request–>session–>application

假如途中找到username,就直接回传,不再继续找下去,

例如:${sessionScope.username}是取出Session范围的username 变量。这种写法是不是比之前JSP 的写法:

String username =(String) session.getAttribute(“username”);容易、简洁许多

但是假如全部的范围都没有找到时,就回传null,当然EL表达式还会做出优化,页面上显示空白,而不是打印输出NULL。

指定作用域获取数据:

  • ​ ${pageScope.键名} 指明获取pageContext作用域中的数据
  • ​ ${requestScope.键名} 指明获取request作用域中的数据
  • ​ ${sessionScope.键名} 指明获取session作用域中的数据
  • ​ ${applicationScope.键名} 指明获取application作用域中的数据


el表达式中的运算符

关系运算符 说明
== 或 eq 判断是否相等
gt 或 > 大于
< 或 lt 小于
!= 或 ne 不等于
<= 或 le 小于等于
>= 或 ge 大于等于
empty 判断是否为null
not empty 不为null
${ A ? B : C}
条件运算符


如果需要在支持表达式语言的页面中正常输出“



”符号,则在“






























”符号前加转义字符“\”,否则系统以为“$”是表达式语言的特殊标记。


缺点:

el表达式是不能做逻辑运算的,如果需要做逻辑运算,那就需要使用jstl标签库



JSTL标签库

为了简化jsp的代码编写。替换<%%>这种写法。一般与EL表达式配合

流程:

1、导入jar包

需要导入两个jar包:jstl.jar(标签库的jar)、standard(标签库的语言规范jar).jar

2、引入标签库

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

JSTL常用标签:

  1. <c:out> 用于在JSP中显示数据,就像<%= … >

    <%=request.getAttribute("str") %>--${str}--<c:out value="${str}"
     default="我是out标签"></c:out>
     <br />
    

    属性

    描述

    是否必要

    默认值
    value 要输出的内容
    default 输出的默认值 主体中的内容
    escapeXml 是否忽略XML特殊字符 true
  2. <c:set> </c:set> 用于保存数据

    声明了一个对象name,对象的值是zhangsan,存储到了page(默认)。指定是session

    <c:set var =“name” value=“zhangsan” scope=“session”></c:set>

    取出:${sessionScope.name}


    属性

    描述

    是否必要

    默认值
    value 要存储的值 主体的内容
    target 要修改的属性所属的对象
    property 要修改的属性
    var 存储信息的变量
    scope var属性的作用域 Page

    如果指定了target属性,那么property属性也需要被指定。

  3. <c:if></c:if>

    1).判断test里面的表达式是否满足,如果满足,就执行c:if标签中的输出。c:if 没有else

    <c:set var=“age” value=“18”></c:set>

    <c:if test=”${age > 25 }”>

    年龄大于25岁

    </c:if>

    2).定义一个变量名flag,去接收前面表达式的值。然后存在session域中

    <c:if test =”${age > 25}” var = “flag” scope=“session”>

    年龄大于25岁

    </c:if>


    属性

    描述

    是否必要

    默认值
    test 条件
    var 用于存储条件结果的变量
    scope var属性的作用域 page

  4. <c:forEach></c:forEach>

    基础迭代标签,接受多种集合类型

    <%
    		String[] arr = {"Joke","Jack","Haha","heihei"};
    		//将数组存储到域中
    		pageContext.setAttribute("arr", arr);
    		
    		List<String> list = new ArrayList();
    		list.add("name");
    		list.add("age");
    		list.add("sex");
    		pageContext.setAttribute("list", list);
    		
    		Map<String,Object> map = new HashMap();
    		map.put("name","haha");
    		map.put("age",20);
    		pageContext.setAttribute("map", map);
    	%>
    	<!-- 
    		items:指的是要遍历的对象
    		begin:起始下标
    		end:结束下标
    		step:阶梯,每次间隔几个数 1:i++ 2:i+2 默认是1
    		var:每次遍历的对象 arr[i]
    		varStatus:其中存储的是下标 
    	 -->
    	<c:forEach items="${arr }" step="1" var="str" varStatus="status">
    		${str },${status.index }
    	</c:forEach>
    	<hr>
    	
    	<c:forEach items="${list }" var="key" varStatus="status">
    		${key },${status.index }
    	</c:forEach>
    	
    	<hr>
    	<c:forEach items="${map }" var="user" varStatus="status">
    		${user.key },${user.value },${status.index }
    	</c:forEach>
    	
    	<hr>
    	<c:forEach begin="0" end="9" var="index">
    		${index }
    	</c:forEach>
    

    属性

    描述

    是否必要

    默认值
    items 要被循环的信息
    begin 开始的元素(0=第一个元素,1=第二个元素) 0
    end 最后一个元素(0=第一个元素,1=第二个元素) Last element
    step 每一次迭代的步长 1
    var 代表当前条目的变量名称
    varStatus 代表循环状态的变量名称
  5. <c:remove>

    移除

    <%-- <%
    	pageContext.removeAttribute("hello",4);
    //request.removeAttribute("hello");
    //session.removeAttribute("hello");
     %>  --%>
    <c:remove var="hello" scope="request"/>
    ${hello}
     <br />
    

    属性

    描述

    是否必要

    默认值
    var 要移除的变量名称
    scope 变量所属的作用域 所有作用域



JSTL和EL区别

JSTL(JSP Standard Tag Library,JSP标准标签库)是一个bai不断完善的开放源代码的duJSP标签库,是由apache的jakarta小组来维护的。zhiJSTL只能运行在支持JSP1.2和Servlet2.3规范的容器上dao,如tomcat 4.x。在JSP 2.0中也是作为标准支持的。

JSTL(JavaServerPages Standard Tag Library)JSP标准标签库

JSTL标准标签库包括核心标签库和SQL标签库,核心标签库常用的是if和forEach

EL即Expression Language(表达式语言)

EL的语法:${ EL exprission }

${ bean.name } 或 ${ bean[‘name’] }

说白了,EL是用来显示数据的,功能跟<%=表达式%> 一样,EL是不需要引入什么东西的



版权声明:本文为wetgravel原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。