zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    SQL Server 2012 自动增长列,值跳跃问题(自增增加1000)
    根据城市表生成json数据
    LeetCode_257. Binary Tree Paths
    LeetCode_242. Valid Anagram
    LeetCode_237. Delete Node in a Linked List
    LeetCode_235. Lowest Common Ancestor of a Binary Search Tree
    LeetCode_234. Palindrome Linked List
    LeetCode_232. Implement Queue using Stacks
    LeetCode_231. Power of Two
    LeetCode_225. Implement Stack using Queues
  • 原文地址:https://www.cnblogs.com/xxbbtt/p/8462285.html
Copyright © 2011-2022 走看看