El表达式&JSTL标签库

Posted 暴躁的程序猿啊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了El表达式&JSTL标签库相关的知识,希望对你有一定的参考价值。

El表达式&JSTL标签库

El表达式的全称是:Expression Language 是表达式语言

作用:EL表达式主要是替代Jsp页面中的表达式脚本在Jsp页面中进行数据的输出;

页面中开启el表达式支持

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" isELIgnored="false" %>


<body>
    <%
        request.setAttribute("name","伊丽莎白");
    %>
    表达式脚本输出key的值是:<%=request.getAttribute("name")%>
    El表达式输出key的值是:$name
</body>

输出

表达式脚本输出key的值是:伊丽莎白 El表达式输出key的值是:伊丽莎白

El表达式的格式:$表达式

EL表达式在输出null的时候,输出的是空串。Jsp表达式脚本输出null值的时候输出null字符串;

EL表达式搜索域数据的顺序

<%
  	request.setAttribute("key","request");
    pageContext.setAttribute("key","pageContext");
    session.setAttribute("key","session");
    application.setAttribute("key","application");
%>
<br/>
El取出的值是:$key

输出:

El取出的值是:pageContext

当四个域中都有相同key数据的时候,El表达式会按照四个域的从小到大顺序去进行搜索,找到就输出;

El表达式输出Bean的普通属性,数组属性,List集合属性,map集合属性

生成一个book用于测试

public class Book 
    private String name;
    private String[] phones;
    private List<String> category;
    private Map<String,Object> map;

    public Book() 
    

    public Book(String name, String[] phones, List<String> category, Map<String, Object> map) 
        this.name = name;
        this.phones = phones;
        this.category = category;
        this.map = map;
    

    public String getName() 
        return name;
    

    public void setName(String name) 
        this.name = name;
    

    public String[] getPhones() 
        return phones;
    

    public void setPhones(String[] phones) 
        this.phones = phones;
    

    public List<String> getCategory() 
        return category;
    

    public void setCategory(List<String> category) 
        this.category = category;
    

    public Map<String, Object> getMap() 
        return map;
    

    public void setMap(Map<String, Object> map) 
        this.map = map;
    

    @Override
    public String toString() 
        return "Book" +
                "name='" + name + '\\'' +
                ", phones=" + Arrays.toString(phones) +
                ", category=" + category +
                ", map=" + map +
                '';
    

jsp页面

<%
    Book book = new Book();
    book.setName("《钢铁是怎样炼成的》");
    book.setPhones(new String[]"1078","1234","8786");
    ArrayList<String> list = new ArrayList<>();
    list.add("励志类");
    list.add("故事类");
    book.setCategory(list);
    Map<String, Object> map = new HashMap<>();
    map.put("k1","v1");
    map.put("k2","v2");
    map.put("k3","v3");
    book.setMap(map);
    pageContext.setAttribute("book",book);
%>
	输出book:$book<br/>
    输出map:$book.map
    输出map中特定的值:$book.map.k3
    输出list:$book.category[1]

输出:

输出book:Bookname='《钢铁是怎样炼成的》', phones=[1078, 1234, 8786], category=[励志类, 故事类], map=k1=v1, k2=v2, k3=v3
输出map:k1=v1, k2=v2, k3=v3 输出map中特定的值:v3 输出list:故事类

EL表达式------运算

EL关系运算

$5 == 5或$5 eq 5 <br/>
$5 != 5或$5 ne 5 <br/>
$5 <  5或$5 lt 5 <br/>
$5 <= 5或$5 le 5 <br/>
$5 >  5或$5 gt 5 <br/>
$5 >= 5或$5 ge 5 <br/>

输出

true或true
false或false
false或false
true或true
false或false
true或true

EL逻辑运算

$5 >= 5 && 5==5或$5 >=5 and 5==5 <br/>
$5 >= 5 || 5==5或$5 >=5 or 5==5 <br/>
$ !(5==5)  或 $not (5==5) <br/>

输出

true或true
true或true
false 或 false

EL算数运算

$ 10 + 2 <br/>
$ 10 - 2 <br/>
$ 10 * 2 <br/>
$ 10 / 2 或$ 10 div 2 <br/>
$ 10 % 2 或$ 10 mod 2 <br/>

输出

12
8
20
5.0或5.0
0或0

empty运算

可以判断一个数据是否为空,如果为空,则不输出true,不为空输出false;

以下几种情况为空:

1.值为null值时候,为空

2.值为空串的时候,为空

3.值是Object数组类型,长度为零的时候

4.list集合元素个数为零

5.map集合元素个数为零

<%
    request.setAttribute("emptyTest",null);
    request.setAttribute("emptyStr","");
    request.setAttribute("emptyArr", new Object[]);
    ArrayList<Integer> integers = new ArrayList<>();
    request.setAttribute("emptyList",integers);
    HashMap<String,String> hashMap = new HashMap<>();
    request.setAttribute("emptyMap",hashMap);
%>


true
true
true
true
true

三元运算

表达式1?表达式2:表达式3

如果表达式值为真返回表达式2的值 否则返回表达式三的值

"."运算和[]中括号运算符

.运算可以输出bean对象中某个属性的值

[]中括号运算,可以输出有序集合中某个元素的值。

并且[]括号运算,还可以输出map集合中key里含有特殊字符的key的值;

11个EL隐含对象

11个隐含对象是EL表达式中自己定义的们可以直接使用。

EL获取特定域中的属性

pageScope----------------pageContext域

requestScope------------request域

sessionScope------------session域

applicationScope------ application域

使用

<%
    pageContext.setAttribute("key","pageContext");
    request.setAttribute("key","request");
    session.setAttribute("key","session");
    application.setAttribute("key","application");
%>
$pageScope.key
$requestScope.key
$sessionScope.key
$applicationScope.key

输出

pageContext request session application

pageContext对象的使用

1.协议

2.服务器ip

3.服务器端口

4.获取工程路径

5.获取请求方法

6.获取客户端ip地址;

7.获取会话的id编号;
<%--获取请求的协议--%>
 <%=request.getScheme()%>
 <%=request.getServerName()%>
 <%=session.getId()%>
  协议:$pageContext.request.scheme<br/>
  服务器ip:$pageContext.request.serverName<br/>
  服务器端口:$pageContext.request.serverPort<br/>
  工程路径:$pageContext.request.contextPath<br/>
  请求方法:$pageContext.request.requestURI<br/>
  客户端ip地址:$pageContext.request.remoteHost<br/>
  获取会话的id编号:$pageContext.session.id<br/>

输出

http localhost C68311AFB304EF1E1CBFEBB626C2CF52 协议:http
服务器ip:localhost
服务器端口:8080
工程路径:
请求方法:/expression.jsp
客户端ip地址:0:0:0:0:0:0:0:1
获取会话的id编号:C68311AFB304EF1E1CBFEBB626C2CF52

EL中其他对象的使用

 $param<br/>
          $paramValues.name[0]<br/>
          $header<br/>
          $headerValues<br/>
          $cookie<br/>
          $initParam<br/>

输出

pass=123, name=zhangsan
zhangsan
sec-fetch-mode=navigate, sec-fetch-site=cross-site, accept-language=zh-CN,zh;q=0.9, cookie=JSESSIONID=5E9DCDC37E5BA99758765648246, sec-fetch-user=?1, (Khtml, like Gecko) 1 SLBChan/3, sec-fetch-dest=document
sec-fetch-mode=[Ljava.lang.String;@3bb706e4, sec-fetch-site=[Ljava.lang.String;@a68f86b, accept-language=[Ljava.lang.String;@74edb052, cookie=[Ljava.lang.String;@3ed0f533, sec-fetch-user=[Ljava.lang.String;@3d53442b, accept=[Ljava.lang.String;@7035584a, host=[Ljava.lang.String;@6943193e, upgrade-insecure-requests=[Ljava.lang.String;@50030048, connection=[Ljava.lang.String;@7756647f, cache-control=[Ljava.lang.String;@2d7b95d7, accept-encoding=[Ljava.lang.String;@5c80e3af, user-agent=[Ljava.lang.String;@14c9b937, sec-fetch-dest=[Ljava.lang.String;@5078424d
JSESSIONID=javax.servlet.http.Cookie@21dcb0b8

JSTL

JSTL标签库全称是指JSP Standard Tag Library Jsp标准标签库。是一个不断完善的开放源代码的JSP标签库。

EL表达式主要是为了替换Jsp中的表达式脚本,而标签库则是为了替换代码脚本,这样使得整个Jsp页面变得更加简洁;

在Jsp标签库中使用taglib指令引入标签库
JSTL标签库使用步骤:

1.先导入maven依赖

<dependency>
  <groupId>javax.servlet.jsp.jstl</groupId>
  <artifactId>jstl-api</artifactId>
  <version>1.2</version>
</dependency>

2.使用用taglib指令引入标签库

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

Core核心库的使用

1、<c:set/>

set标签可以往域中保存数据
页面头设置:<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page language="java" import="java.util.*" isELIgnored="false" pageEncoding="UTF-8" %>


 	域对象保存数据之前:$requestScope.name<br/>
    <c:set scope="request" var="name" value="王五"></c:set>
    域对象保存数据之后:$requestScope.name<br/>
  输出:
    域对象保存数据之前:
    域对象保存数据之后:王五

2、<C:if/>

<c:if test=$10==10>
	<h1>条件满足<h1>
</c:if>
满足 条件显示内容

3.<c:choose><c:when><c:otherwise>
作用:多路判断。跟switch … case …default 非常接近

choose标签开始选择判断
when标签表示每一种判断情况  匹配一种输出不再往下进行
	test表示当前这种判断情况的值
otherwise表示剩下的情况
例子:
<c:set scope="request" var="num" value="45"></c:set>
    <c:choose>
        <c:when test="$requestScope.nums>50">
            <h3>大于50</h3>
        </c:when>
        <c:when test="$requestScope.num<50">
            <h3>小于50</h3>
        </c:when>
        <c:when test="$requestScope.num==50">
            <h3>等于于50</h3>
        </c:when>
        <c:otherwise>
            <h3>其他数值</h3>
        </c:otherwise>
    </c:choose>
 输出:
	 小于50	
 注意事项:1.标签里不能使用html注释,要使用Jsp注释
 		  2.when标签里的父标签一定要是choose标签
3.<c:forEach>标签
作用:遍历输出使用
	begin属性设置开始索引
	end属性设置结束的索引
	var属性表示遍历的变量
例子:遍历输出1-5
	<c:forEach begin="0" end="5" var="i">
        $ i 
    </c:forEach>
输出
0 1 2 3 4 5
   遍历Object数组
    <%
        request.setAttribute("arr",new String[]"111","222","333");
    %>
    <c:forEach items="$requestScope.arr" var="item">
        <%--items 表示要遍历的数据源   var 表示当前遍历到的数据--%>
        $item
    </c:forEach>
   遍历Map集合
    <%
        HashMap<String, Object> map = new HashMap<>();
        map.put("k1","v1");
        map.put("k2","v2");
        map.put("k3","v3");
        request.setAttribute("map",map);
    %>
    <c:forEach items="$requestScope.map" var="entry">
        key为:$entry.key<br/>
        value为:$entry.value<br/>
    </c:forEach>
  输出
    value为:v1
    key为:k2
    value为:v2
    key为:k3
    value为:v3	
forEach属性   step:步长   varStatus:表示当前遍历到的数据的状态    
   
   
 status实现了下面的接口 拥有以下方法  
   
 public interface LoopTagStatus 
	//获取当前遍历到的数据
	Object getCurrent();
	//获取遍历的索引
    int getIndex();
	//表示遍历的个数
    int getCount();
	//表示当前遍历的是第一条或最后一条
    boolean isFirst();
    boolean isLast();
	//获取对应的属性值
    Integer getBegin();

    Integer getEnd();

    Integer getStep();

 测试
    <c:forEach items="$requestScope.map" var="entry" varStatus="status">
        <tr>
            <td>key为:$entry.key</td>
            <td>value为:$entry.value</td>
            <td>$以上是关于El表达式&JSTL标签库的主要内容,如果未能解决你的问题,请参考以下文章

09-EL 表达式 & JSTL 标签库

EL表达式 与 JSTL标准标签库

javaweb part6---jstl以及el表达式

JSP常用标签——JSTL标签和EL表达式

Ognl 和 EL 和jstl区别

EL表达式JSTL标签库