天天看點

(Java)EL表達式及“記住登入使用者名”案例

1 EL表達式的基本概述

EL(Express Lanuage)表達式可以嵌入在jsp頁面内部,減少jsp腳本的編寫,EL 出現的目的是要替代jsp頁面中輸出腳本<%= 資料 %>的編寫。

2 EL表達式的格式和作用

EL表達式的格式:

${EL表達式内容}
           

EL表達式的作用:

  1. 從域對象中查找指定的資料。
  2. EL内置對象的使用
  3. 執行運算符

3 EL表達式的基本使用(從域中取出資料)

  • EL從四個域中獲得某個值:

    ${key}

    • 作用範圍從小到大是依次從pageContext域,request域,session域,application域中 擷取屬性,在某個域中擷取後将不在向後尋找
    • 其中,若隻想獲得pageContext域中的值:

      ${pageScope.key}

    • 其中,若隻想獲得request域中的值:

      ${requestScope.key}

    • 其中,若隻想獲得session域中的值:

      ${sessionScope.key}

    • 其中,若隻想獲得application域中的值:

      ${applicatioScope.key}

3.1 通過EL表達式,獲得普通資料

  • 格式:
${key}
           
  • 這樣 EL從四個域中,按從小到大的順序查找key,找到則輸出,不再繼續尋找。具體看下面例子。

代碼示範:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>擷取域容器中的資料</title>
</head>
<body>
    <%
        // 1 将資料儲存到域容器中
        pageContext.setAttribute("city", "北京1"); // page
        pageContext.setAttribute("city", "北京2", PageContext.REQUEST_SCOPE); // request
        pageContext.setAttribute("city", "北京3", PageContext.SESSION_SCOPE); // session
        pageContext.setAttribute("city", "北京4", PageContext.APPLICATION_SCOPE); // servletContext

        // 2 删除指定域資料
        /*
        pageContext.removeAttribute("city", PageContext.PAGE_SCOPE); // page
        pageContext.removeAttribute("city", PageContext.REQUEST_SCOPE); // request
        pageContext.removeAttribute("city", PageContext.SESSION_SCOPE); // session
        pageContext.removeAttribute("city", PageContext.APPLICATION_SCOPE); // servletContext
         */
        pageContext.removeAttribute("city"); // 删除所有域中的資料
    %>

    <h1>java</h1>
        <h3>擷取資料</h3>
        <%
            out.print(pageContext.getAttribute("city")!=null?pageContext.getAttribute("city"):""); // page
            out.print(pageContext.getAttribute("city", PageContext.REQUEST_SCOPE)); // request
            out.print(pageContext.getAttribute("city", PageContext.SESSION_SCOPE)); // session
            out.print(pageContext.getAttribute("city", PageContext.APPLICATION_SCOPE)); // servletContext
        %>

        <h3>智能擷取資料</h3>

        <%
            /*
            pageContext.findAttribute(key) 根據key從四個域容器中依次擷取資料, 如果擷取到了,取值結束; 如果都沒有擷取到, 傳回null
             */
            out.print(pageContext.findAttribute("city"));
        %>

    <h1>EL</h1>
        <h3>擷取資料</h3>
        ${pageScope.city}
        ${requestScope.city}
        ${sessionScope.city}
        ${applicationScope.city}

    <h3>智能擷取資料</h3>  <%--最常用的就是這個--%>
        ${city} 
</body>
</html>
           

3.2 EL獲得javaBean對象的值

格式:

${對象.成員變量}
           

假設User是一個javaBean對象:

public class User {
    private String username;
    private String password;
    private String nickname;
    //省略構造方法、get、set方法
}
           

代碼示範:

<%@ page import="cn.itcast.pojo.User" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%
        //  EL獲得javaBean對象的值
        User user = new User();
        user.setUsername("zhangsan");
        user.setPassword("abc");
		// 放置在request域中,因為EL表達式隻能擷取到域中資料
        request.setAttribute("user", user);  
    %>
	
	<%--最一般java語句,一般不采用--%>
    <h1>java</h1>
    username = <%=((User)pageContext.findAttribute("user")).getUsername()%> <br/>
    password = <%=((User)pageContext.findAttribute("user")).getPassword()%> <br/>
    nickname = <%=((User)pageContext.findAttribute("user")).getNickname()%>

    <hr/>

	<%--EL語句擷取,最常用,也最簡單--%>
    <h1>EL</h1>
        username === ${user.username} <br/>
        password === ${user.password} <br/>
        nickname === ${user.nickname} <br/>
</body>
</html>

           

3.3 EL獲得

List<String>

的值

格式:

代碼示範

<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %><%--
    EL表達式作用一(從域中取出資料): EL獲得 List<String> 的值

    格式: ${ List集合對象[索引] }
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%--1.建立 List<String>集合, 存到Request域中 --%>
    <%
        List<String> list = new ArrayList<String>();
        list.add("熱巴");
        list.add("娜紮");
        request.setAttribute("list",list);
    %>

    <%--2.通過EL表達式, 擷取List<String>集合中的資料--%>
    <%--jsp方式擷取,不推薦使用--%>
    <%
        List<String> names = (List<String>) request.getAttribute("list");
        out.print( names.get(0) +" === "+ names.get(1) );
    %>
    <%--EL方式擷取--%>
    ${list[0]} == ${list[1]}

</body>
</html>

           

[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-eEgMw0t8-1606008306083)(day08_jsp&filter&listener.assets/1568520799607.png)]

3.4 EL獲得

List<User>

的值

格式:

${List集合對象[索引].成員變量}
           

代碼示範

<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="com.itheima.pojo.User" %><%--
    EL表達式作用一(從域中取出資料): EL獲得 List<User> 的值

    格式: ${ List集合對象[索引].成員變量 }
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%--1.建立 List<User>集合, 存到Request域中 --%>
    <%
        List<User> list = new ArrayList<User>();
        list.add(new User("熱巴","123456"));
        list.add(new User("娜紮","abcdef"));
        request.setAttribute("list",list);
    %>

    <%--2.通過EL表達式, 擷取 List<User>集合中的資料--%>
    <%--jsp方式擷取--%>
    <%
        List<User> users = (List<User>) request.getAttribute("list");
        out.print( users.get(0).getUsername() +"=="+ users.get(0).getPassword() );
        out.print( users.get(1).getUsername() +"=="+ users.get(1).getPassword() );
    %>
    <br/>
    <%--EL方式擷取--%>
    ${list[0].username} == ${list[0].password}
    ${list[1].username} == ${list[1].password}

</body>
</html>
           

輸出:

(Java)EL表達式及“記住登入使用者名”案例

3.5 EL獲得Map<String,User>的值

格式:

${Map集合對象.key.成員變量}
或
${Map集合對象['key'].成員變量}
           

代碼示範

<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="com.itheima.pojo.User" %>
<%@ page import="java.util.Map" %><%--
    EL表達式作用一(從域中取出資料): EL獲得 Map<String, User> 的值

    格式:
        ${Map集合對象.key.成員變量 }
        或
        ${Map集合對象['key'].成員變量}
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%--1.建立 Map<String, User>集合, 存到Request域中 --%>
    <%
        Map<String, User> userMap = new HashMap<String, User>();
        userMap.put("user1", new User("熱巴","123456"));
        userMap.put("user2", new User("娜紮","abcdef"));
        request.setAttribute("userMap",userMap);
    %>

    <%--2.通過EL表達式, 擷取 Map<String, User>集合中的資料--%>
    <%--jsp方式擷取,不推薦--%>
    <%
        Map<String, User> map = (Map<String, User>) request.getAttribute("userMap");
        out.print( map.get("user1").getUsername() +"=="+ map.get("user1").getPassword());
        out.print( map.get("user2").getUsername() +"=="+ map.get("user2").getPassword());
    %>
    <br/>
    <%--EL方式擷取,一般采用第一種方式--%>
    ${userMap.user1.username} == ${userMap.user1.password}
    ${userMap.user2.username} == ${userMap.user2.password}
    <br/>
    ${userMap['user1'].username} == ${userMap['user1'].password}
    ${userMap['user2'].username} == ${userMap['user2'].password}

</body>
</html>

           
(Java)EL表達式及“記住登入使用者名”案例

4 EL的内置對象 pageContext

  • pageContext

    : WEB開發中的頁面的上下文對象.

作用:可以用來擷取JSP中四個域中的資料(pageScope, requestScope, sessionScope, applicationScope)

  • 例如,在Servlet中,想獲得web應用的名稱:

    request.getContextPath();

  • 那麼,在jsp頁面上,想獲得web應用的名稱:

    ${pageContext.request.contextPath}

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>擷取WEB應用項目名稱</title>
</head>
<body>
    <h3>擷取WEB應用項目名稱</h3>
    <%--JSP方式擷取--%>
    <%= request.getContextPath()%>
    <%--EL方式擷取--%>
    ${pageContext.request.contextPath}
</body>
</html>

           

5 EL執行運算符(了解)

  1. 算數運算符 + , - , * , / , %
  2. 邏輯運算符 && , || , !
  3. 比較運算符 > , < , >= , <= , == , !=
  4. Null運算符 empty
  5. 三元運算符

代碼示範:

<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>EL執行運算符</title>
</head>
<body>
    ${3+4} <br>
    ${3-4} <br>
    ${true&&true} <br>
    ${false&& true} <br>
    ${3>4} <br>
    ${3<4 || 5>4} <br>

    <%--向域中存資料, 用于示範 empty--%>
    <%
        String str = null;
        request.setAttribute("str", str);
        request.setAttribute("array", new String[1] );
        request.setAttribute("list", new ArrayList<String>());
    %>
    ${empty str} <br>
    ${empty array} <br>
    ${empty list} <br>

    ${str == null?"資料為空":str} <br>

</body>
</html>

           

輸出:

(Java)EL表達式及“記住登入使用者名”案例

6 案例 記錄上一次登入所使用的使用者名

(Java)EL表達式及“記住登入使用者名”案例
  1. 問題描述

    在登入界面,如果輸入使用者名和密碼後,勾選了記住使用者名,點選登入後,下次打開登入頁面使用者名會自動填入。

  2. 步驟分析:

    ① 擷取送出的使用者名密碼

    ② 擷取是否 “記住使用者名”

    ③ 判斷使用者名和密碼是否和資料庫中的比對:若比對,重定向到首頁;若不比對,轉發回登入頁面,提示使用者名或者密碼錯誤; 同時,隻要勾選了記住使用者名,就擷取cookie中的username值.顯示在頁面上

  3. 實作方法:

    ① 登入表單的送出位址是Servlet

    ② 在Servlet中,擷取到使用者名和密碼後和資料庫中資料對比,成功或失敗跳轉到相應頁面

    ③ 判斷提取的表單中是否勾選了記住使用者名按鈕,若是,将使用者名存放到Cookie中,在登入頁面擷取并顯示。

  4. 将使用者名放到Cookie中的合理性:

    如果放置在伺服器中,當伺服器更新或維修時就無法擷取到資料。

  • 先看登入界面

    login.jsp

    代碼:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登入</title>
</head>
<body>
<%--注意這裡,擷取送出路徑的方式--%>
<form action="${pageContext.request.contextPath}/login" method="post">
    <table>
        <tr>
            <td>使用者名</td>
            <%--注意這裡-擷取輸入值的方式-%>
            <td><input type="text" name="username" value="${cookie.user.value}"/></td>
        </tr>
        <tr>
            <td>密碼</td>
            <td><input type="password" name="password"></td>
        </tr>
        <tr>
            <td></td>
            <td><input type="checkbox" name="rem" value="remUsername"> 記住使用者名</td>
        </tr>
        <tr>
            <td></td>
            <td><input type="submit" value="送出"></td>
        </tr>
    </table>
</form>
</body>
</html>

           
  • 下面看一下處理的Servlet代碼
package servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 處理記住使用者名的操作
 *      1. 使用者名和密碼的驗證
 *      2.記錄使用者名
 */
@WebServlet(urlPatterns = "/login")
public class LoginServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1.擷取使用者名和密碼
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        // 2.判斷
        if (username.equals("tom") && password.equals("1234")){
            //登入成功
            response.getWriter().write("login success");

        }else {
            // 登入失敗
            request.setAttribute("message","登入失敗!使用者名或密碼錯誤,請重新輸入");
            // 轉發到登入頁面
            request.getRequestDispatcher("/login.jsp").forward(request,response);
        }

        // 擷取表單中是否勾選了記住使用者名,如果勾選,将使用者名存放到cookie中
        String rem = request.getParameter("rem");
        if (rem != null){
            // 勾選了記住使用者名
            Cookie cookie = new Cookie("user",username);
            cookie.setMaxAge(60*10*24*10); //記住10天
            cookie.setPath(request.getContextPath());
            response.addCookie(cookie);
        }

    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}