zoukankan      html  css  js  c++  java
  • Java EE之表达式语言EL(下)

    1.在EL表达式中使用作用域变量

    表达式语言对作用域变量的支持,以及它解析变量的方式都使它变得非常有用。

    1.1 EL表达式的隐式变量

    EL表达式的作用域中定义了11个隐式变量。
    当EL表达式引用了一个变量时,EL求值程序将按照下面的流程解析变量:

    1. 检查该变量是否属于隐式变量。
    2. 如果变量不在11个隐式变量之中,EL求值程序将在页面作用域中找(PageContext.getAttribute("variable")
    3. 如果在页面作用域找不到,就找请求特性HttpServletRequest.getAttribute("variable")
    4. 如果找不到请求特性,就找会话特性HttpSession.getAttribute("variable")
    5. 如果找不到会话特性,就找应用特性ServletContext..getAttribute("variable")
    6. 在求值程序搜索完所有的位置之后,如果它未找到匹配变量名的隐式变量或者特性,它将会报出错误。
    package com.wrox;
    
    import java.util.Hashtable;
    import java.util.Map;
    
    public class User
    {
        private long userId;
    
        private String username;
    
        private String firstName;
    
        private String lastName;
    
        private Map<String, Boolean> permissions = new Hashtable<>();
    
    	//...setter和getter方法
    }
    
    package com.wrox;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.util.Hashtable;
    
    @SuppressWarnings("serial")
    @WebServlet(
            name = "profileServlet",
            urlPatterns = "/profile"
    )
    public class ProfileServlet extends HttpServlet
    {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException
        {
            User user = new User();
            user.setUserId(19384L);
            user.setUsername("Coder314");
            user.setFirstName("John");
            user.setLastName("Smith");
    
            Hashtable<String, Boolean> permissions = new Hashtable<>();
            permissions.put("user", true);
            permissions.put("moderator", true);
            permissions.put("admin", false);
            user.setPermissions(permissions);
    
            request.setAttribute("user", user);
            request.getRequestDispatcher("/WEB-INF/jsp/view/profile.jsp")
                   .forward(request, response);
        }
    }
    

    profile.jsp

    <%--@elvariable id="user" type="com.wrox.User"--%>
    <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
    <!DOCTYPE html>
    <html>
        <head>
            <title>User Profile</title>
        </head>
        <body>
            User ID: ${user.userId}<br />
            Username: ${user.username} (${user.username.length()} characters)<br />
            Full Name: ${fn:escapeXml(user.lastName) += ', '
                += fn:escapeXml(user.firstName)}
            <br /><br />
            <b>Permissions (${fn:length(user.permissions)})</b><br />
            User: ${user.permissions["user"]}<br />
            Moderator: ${user.permissions["moderator"]}<br />
            Administrator: ${user.permissions["admin"]}<br />
        </body>
    </html>
    

    profile.jsp的<%--@elvariable id="user" type="com.wrox.User"--%>告诉IDE在本页的隐式作用域中有一个user变量,它的类型是com.wrox.User
    下面的代码使用fn:escapeXml(...)函数对HTML字符进行转义,还使用了+=字符串连接操作符结合所有的字符串。

            Full Name: ${fn:escapeXml(user.lastName) += ', '
                += fn:escapeXml(user.firstName)}
    

    1.2 使用EL的隐式变量

    • pageContext是PageContext类的一个实例,并且是唯一一个不是Map的隐式EL变量。
    • pageScope包含了所有绑定到PageContext的特性。
    • requestScope包含了所有绑定到ServletRequest的特性。
    • sessionScope包含了所有绑定到当前会话的特性。
    • paramparamValues。param包含了任何多值参数中的第一个值,而paramValues包含了所有参数的所有值。如果你知道请求参数只有一个值的话,param更易于使用。
    • headerheaderValues提供了对请求头的访问。header包含了多值头的第一个值,headerValues包含了所有参数的所有值。如果你知道header只有一个值的话,header更易于使用。
    • initParam包含了该应用程序中ServletContext实例的所有上下文初始化参数。
    • cookie包含了用户浏览器发送的请求中的所有cookie,如果存在名字相同的两个cookie,只显示按顺序出现的第一个。如果不遍历所有的cookie,在EL中就无法访问其他具有相同名字的重复cookie。
    <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
    <%
        application.setAttribute("appAttribute", "foo");
        pageContext.setAttribute("pageAttribute", "bar");
        session.setAttribute("sessionAttribute", "sand");
        request.setAttribute("requestAttribute", "castle");
    %>
    <!DOCTYPE html>
    <html>
        <head>
            <title>Information</title>
        </head>
        <body>
            Remote Address: ${pageContext.request.remoteAddr}<br />
            Request URL: ${pageContext.request.requestURL}<br />
            Session ID: ${pageContext.request.session.id}<br />
            Application Scope: ${applicationScope["appAttribute"]}<br />
            Page Scope: ${pageScope["pageAttribute"]}<br />
            Session Scope: ${sessionScope["sessionAttribute"]}<br />
            Request Scope: ${requestScope["requestAttribute"]}<br />
            User Parameter: ${param["user"]}<br />
            Color Multi-Param: ${fn:join(paramValues["colors"], ', ')}<br />
            Accept Header: ${header["Accept"]}<br />
            Session ID Cookie Value: ${cookie["JSESSIONID"].value}<br />
        </body>
    </html>
    

    上面的Session ID Cookie Value字段值为空,意味着会话才刚刚建立,浏览器尚未发送任何cookie,刷新页面后将会显示出会话ID Cookie值。

    下面的JSP将演示EL表达式解析变量时不同作用域的优先级。

    <%
        pageContext.setAttribute("a", "page");
        request.setAttribute("a", "request");
        session.setAttribute("a", "session");
        application.setAttribute("a", "application");
    
        request.setAttribute("b", "request");
        session.setAttribute("b", "session");
        application.setAttribute("b", "application");
    
        session.setAttribute("c", "session");
        application.setAttribute("c", "application");
    
        application.setAttribute("d", "application");
    %>
    <!DOCTYPE html>
    <html>
        <head>
            <title>Scope Demonstration</title>
        </head>
        <body>
            a = ${a}<br />
            b = ${b}<br />
            c = ${c}<br />
            d = ${d}<br />
        </body>
    </html>
    

    2.使用流API访问集合

    流API的基础是所有Collection中存在的无参stream方法。
    collections.jsp

    <%@ page import="com.wrox.User" %>
    <%@ page import="java.util.ArrayList" %>
    <%
        ArrayList<User> users = new ArrayList<>();
        users.add(new User(19384L, "Coder314", "John", "Smith"));
        users.add(new User(19383L, "geek12", "Joe", "Smith"));
        users.add(new User(19382L, "jack123", "Jack", "Johnson"));
        users.add(new User(19385L, "farmer-dude", "Adam", "Fisher"));
        request.setAttribute("users", users);
    %>
    <!DOCTYPE html>
    <html>
        <head>
            <title>Collections and Streams</title>
        </head>
        <body>
            ${users.stream()
                   .filter(u -> fn:contains(u.username, '1'))
                   .sorted((u1, u2) -> (x = u1.lastName.compareTo(u2.lastName);
                        x == 0 ? u1.firstName.compareTo(u2.firstName) : x))
                   .map(u -> {'username':u.username, 'first':u.firstName,
                        'last':u.lastName})
                   .toList()}
        </body>
    </html>
    

    EL表达式对创建的用户列表进行过滤,只保留了用户名含有数字1的用户;先按姓后按名进行排序;在所有匹配的用户中选择用户名、名字和姓;然后立即执行返回一个List。

    因为我们不鼓励在JSP中使用Java,所以也不鼓励将业务逻辑添加到表示层。

    示例源码链接:https://pan.baidu.com/s/1-Z1hpN3YfVBlvqz-2B_OeA 密码:ppxz

  • 相关阅读:
    【C语言】用"I love you!"打印心形
    android js与控件交互初探。
    android 调用webview控件,为逆向h5app做准备
    git命令
    kdevelp 导入makefile工程
    解决vmvare关闭过慢
    用python.twisted.logfile每天记录日志,并用不记录stdout中的内容
    关于bjam编译自己模块出错的问题
    俄罗斯黑客在美国监狱中获刑4年,到底是什么原因?
    美国的电信巨头T-Mobile今天披露了另一起数据遭黑客泄露事件
  • 原文地址:https://www.cnblogs.com/gzhjj/p/9155883.html
Copyright © 2011-2022 走看看