1 EL表達式的基本概述
EL(Express Lanuage)表達式可以嵌入在jsp頁面内部,減少jsp腳本的編寫,EL 出現的目的是要替代jsp頁面中輸出腳本<%= 資料 %>的編寫。
2 EL表達式的格式和作用
EL表達式的格式:
${EL表達式内容}
EL表達式的作用:
- 從域對象中查找指定的資料。
- EL内置對象的使用
- 執行運算符
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>
的值
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<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>
輸出:

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>
4 EL的内置對象 pageContext
-
: WEB開發中的頁面的上下文對象.pageContext
作用:可以用來擷取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執行運算符(了解)
- 算數運算符 + , - , * , / , %
- 邏輯運算符 && , || , !
- 比較運算符 > , < , >= , <= , == , !=
- Null運算符 empty
- 三元運算符
代碼示範:
<%@ 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>
輸出:
6 案例 記錄上一次登入所使用的使用者名
-
問題描述
在登入界面,如果輸入使用者名和密碼後,勾選了記住使用者名,點選登入後,下次打開登入頁面使用者名會自動填入。
-
步驟分析:
① 擷取送出的使用者名密碼
② 擷取是否 “記住使用者名”
③ 判斷使用者名和密碼是否和資料庫中的比對:若比對,重定向到首頁;若不比對,轉發回登入頁面,提示使用者名或者密碼錯誤; 同時,隻要勾選了記住使用者名,就擷取cookie中的username值.顯示在頁面上
-
實作方法:
① 登入表單的送出位址是Servlet
② 在Servlet中,擷取到使用者名和密碼後和資料庫中資料對比,成功或失敗跳轉到相應頁面
③ 判斷提取的表單中是否勾選了記住使用者名按鈕,若是,将使用者名存放到Cookie中,在登入頁面擷取并顯示。
-
将使用者名放到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);
}
}