El表达式&JSTL标签库

2022-03-24 15:22:57 浏览数 (1)

El表达式&JSTL标签库

代码语言:javascript复制
El表达式的全称是:Expression Language 是表达式语言

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

页面中开启el表达式支持

代码语言:javascript复制
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" isELIgnored="false" %>


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

输出

代码语言:javascript复制
表达式脚本输出key的值是:伊丽莎白 El表达式输出key的值是:伊丽莎白

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

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

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

代码语言:javascript复制
<%
  	request.setAttribute("key","request");
    pageContext.setAttribute("key","pageContext");
    session.setAttribute("key","session");
    application.setAttribute("key","application");
%>
<br/>
El取出的值是:${key}

输出:

代码语言:javascript复制
El取出的值是:pageContext

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

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

生成一个book用于测试

代码语言:javascript复制
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页面

代码语言:javascript复制
<%
    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]}

输出:

代码语言:javascript复制
输出book:Book{name='《钢铁是怎样炼成的》', phones=[1078, 1234, 8786], category=[励志类, 故事类], map={k1=v1, k2=v2, k3=v3}}
输出map:{k1=v1, k2=v2, k3=v3} 输出map中特定的值:v3 输出list:故事类

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

EL关系运算

代码语言:javascript复制
${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/>

输出

代码语言:javascript复制
true或true
false或false
false或false
true或true
false或false
true或true

EL逻辑运算

代码语言:javascript复制
${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/>

输出

代码语言:javascript复制
true或true
true或true
false 或 false

EL算数运算

代码语言:javascript复制
${ 10   2 }<br/>
${ 10 - 2 }<br/>
${ 10 * 2 }<br/>
${ 10 / 2 }或${ 10 div 2 }<br/>
${ 10 % 2 }或${ 10 mod 2 }<br/>

输出

代码语言:javascript复制
12
8
20
5.0或5.0
0或0

empty运算

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

以下几种情况为空:

1.值为null值时候,为空

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

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

4.list集合元素个数为零

5.map集合元素个数为零

代码语言:javascript复制
<%
    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域

使用

代码语言:javascript复制
<%
    pageContext.setAttribute("key","pageContext");
    request.setAttribute("key","request");
    session.setAttribute("key","session");
    application.setAttribute("key","application");
%>
${pageScope.key}
${requestScope.key}
${sessionScope.key}
${applicationScope.key}

输出

代码语言:javascript复制
pageContext request session application

pageContext对象的使用

代码语言:javascript复制
1.协议

2.服务器ip

3.服务器端口

4.获取工程路径

5.获取请求方法

6.获取客户端ip地址;

7.获取会话的id编号;
代码语言:javascript复制
<%--获取请求的协议--%>
 <%=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/>

输出

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

EL中其他对象的使用

代码语言:javascript复制
 ${param}<br/>
          ${paramValues.name[0]}<br/>
          ${header}<br/>
          ${headerValues}<br/>
          ${cookie}<br/>
          ${initParam}<br/>

输出

代码语言:javascript复制
{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依赖

代码语言:javascript复制
<dependency>
  <groupId>javax.servlet.jsp.jstl</groupId>
  <artifactId>jstl-api</artifactId>
  <version>1.2</version>
</dependency>

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

代码语言:javascript复制
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

Core核心库的使用

1、<c:set/>

代码语言:javascript复制
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/>
代码语言:javascript复制
  输出:
    域对象保存数据之前:
    域对象保存数据之后:王五

2、<C:if/>

代码语言:javascript复制
<c:if test=${10==10}>
	<h1>条件满足<h1>
</c:if>
满足 条件显示内容

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

代码语言:javascript复制
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>${status.current}</td>
            <td>${status.index}</td>
            <td>${status.count}</td>
            <td>${status.first}</td>
            <td>${status.last}</td>
            <br/>
        </tr>
    </c:forEach>
输出
key为:k1 value为:v1 k1=v1 0 1 true false
key为:k2 value为:v2 k2=v2 1 2 false false
key为:k3 value为:v3 k3=v3 2 3 false true

0 人点赞