JavaWeb——JSP表达式语言(EL)

1、JSP表达式语言(EL)用于在jsp从访问存储在JavaBean中的数据,例如

User ID: ${user.userId}<br />

  这里的${user.userId}就是JSP EL表达式,效果就是:

User ID: 19358

  19358是userId的数据

2、语法

  • 立即执行  

    立即执行EL表达式将在页面渲染的时候,被JSP引擎解析和执行。这就意味着EL表达式将在JSP引擎中发现它,并在继续执行其他页面部分之前执行它,就类似c语言中的宏那样,下面的例子中EL表达式将会立即执行,其中expr是一个EL表达式

${expr}

    美元符号和两个花括号定义了EL表达式的边界,在括号中的所有的内容都会作为EL表达式执行。所以如果我们需要使用美元符号就需要进行转义

  • 延迟执行

    延迟执行EL表达式是统一表达式的一部分主要用于满足JavaServer Faces的需要。下面的例子将是一个延迟执行的EL表达式

#{expr}

3、添加EL表达式

  EL表达式可以直接用在JSP的任何位置,除了少数特殊情况。首先不能用在任何指令中,因为编译JSP时,指令将会被执行,但是EL表达式是在渲染JSP时执行,所以这里的EL表达式是无法正常工作的。

  另外,JSP声明<%!%>、脚本<%%>或者表达式<%=%>中的EL表达式也是无效的。

  除此之外,EL表达式可以添加在任意的位置

  • 简单文本中
User ID: ${expr}
  • 标准的HTML标签中
<input type="text" name="something" value="${expr}"/>
  • JSP标签中
<c:url value ="/something/${expr}/${expr}"/>

4、基础操作符

操作符描述
. 访问一个Bean属性或者一个映射条目
[] 访问一个数组或者链表的元素
( ) 组织一个子表达式以改变优先级
+
- 减或负
*
/ or div
% or mod 取模
== or eq 是否相等
!= or ne 是否不等
< or lt 是否小于
> or gt 是否大于
<= or le 是否小于等于
>= or ge 是否大于等于
&& or and
|| or or
! or not 取反
empty 是否空值

5、对象属性和方法

  EL表达式通过.进行JavaBean中属性的简化语法,假设现在有一个类user,有名为userId的类

${user.userId}

  如果使用这个表达式来访问userId字段,这是行不通的因为这里的.实际寻找的是userId属性而非字段,也就是说将调用的是user.getuserId()类似的JavaBean标准访问方法。

  如果没有这样的标准方法,应该这样进行访问

${user["userId"]}

6、EL函数

  JSP EL允许您在表达式中使用函数。这些函数必须被定义在自定义标签库中。函数的使用语法如下:

${ns:func(param1, param2, ...)}

  其中ns是命名空间,func是函数名,param1、param2...是参数

  比如,有函数fn:length,在JSTL库中定义,可以像下面这样来获取一个字符串的长度:

${fn:length("Get my length")}

7、lambda表达式

  lambda表达式就是一个匿名函数,EL lambda就是用箭头操作符->分割左侧的表达式参数和右侧的表达式,以下是两个有效的EL lambda表达式

${(a -> a + 5) (4)}
${((a,b) -> a + b) (3, 5)}

  还可以这样使用:

${v = (a , b) -> a +b; v(3, 5)}

8、集合

  • map

  现假设有一个map拥有键username和ueseId,那么可以使用中括号访问这两个键的键值

${map["username"]}
${map["userId"]}

  也可以使用.

${map.username}
${map.userId}
  • list

  假设有一个list,它包含了三个值"green"、"red"、"blue",按照0到2d的顺序一存储,那么可以只有访问

${list[0]}
${list[1]}
${list[2]}

  不能使用.

9、试用

  先新建一个类User,每个字段都将拥有相应的set和get方法

public class User {
    private long userId;
    private String username;
    private String firstname;
    private String lastname;
    private Map<String,Boolean> permission = new Hashtable<>();


    public long getUserId() {
        return userId;
    }

    public void setUserId(long userId) {
        this.userId = userId;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getFirstname() {
        return firstname;
    }

    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }

    public String getLastname() {
        return lastname;
    }

    public void setLastname(String lastname) {
        this.lastname = lastname;
    }

    public Map<String, Boolean> getPermission() {
        return permission;
    }

    public void setPermission(Map<String, Boolean> permission) {
        this.permission = permission;
    }
}

  然后是Servlet:

@WebServlet(
        name = "ELServlet",
        urlPatterns = "/EL"
)
public class ELServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        User user = new User();
        user.setUserId(19358L);
        user.setUsername("Username");
        user.setFirstname("Firstname");
        user.setLastname("Lastname");

        Hashtable<String,Boolean> permissions = new Hashtable<>();
        permissions.put("user", true);
        permissions.put("moderator", true);
        permissions.put("admin", false);
        user.setPermission(permissions);

        req.setAttribute("user",user);
        req.getRequestDispatcher("/WEB-INF/jsp/view/EL.jsp")
                .forward(req,resp);
    }
}

  最后是JSP

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>User</title>
</head>
<body>
    User ID: ${user.userId}<br />
    Username: ${user.username}(${user.username.length()} characters)<br/>
    Full Name: ${user.lastname += "," += user.firstname}
    <br/><br/>
    <b>Permissons (${fn:length(user.permission)})</b><br/>
    User: ${user.permission["user"]}<br/>
    Moderator: ${user.permission["moderator"]}<br/>
    Admin: ${user.permission["admin"]}<br/>
</body>
</html>

  需要注意的地方有user.username.length()这里相等于使用的是String的length方法,user.lastname += "," += user.firstname这里也是简单的使用 += 进行字符串的拼接fn:length(user.permission),这里调用fn:length函数输出permission的长度。

  结果:
  

10、使用隐含的EL变量

  JSP EL支持下表列出的隐含对象:

隐含对象描述
pageScope page 作用域
requestScope request 作用域
sessionScope session 作用域
applicationScope application 作用域
param Request 对象的参数,字符串
paramValues Request对象的参数,字符串集合
header HTTP 信息头,字符串
headerValues HTTP 信息头,字符串集合
initParam 上下文初始化参数
cookie Cookie值
pageContext 当前页面的pageContext
原文地址:https://www.cnblogs.com/xxbbtt/p/8462285.html