jsp EL表達式詳解
一、EL表達式介紹
- Expression Language表達式語言
- 是一種在JSP頁面獲取數(shù)據(jù)的簡單方式(只能獲取數(shù)據(jù),不能設置數(shù)據(jù))
- 在JSP2.0開始引入概念
語法格式
在JSP頁面的任何靜態(tài)部分均可通過:${expression}來獲取到指定表達式的值
二、EL獲取數(shù)據(jù)(從四大域中獲取屬性)
EL只能從四大域中獲取屬性
1、如果沒有使用EL的內(nèi)置對象,則查找數(shù)據(jù)順序是依次按照由小到大范圍從四大域中查找指定名稱的屬性值
二、EL獲取數(shù)據(jù)(從四大域中獲取屬性)
EL只能從四大域中獲取屬性
1、如果沒有使用EL的內(nèi)置對象,則查找數(shù)據(jù)順序是依次按照由小到大范圍從四大域中查找指定名稱的屬性值
- pageContext<request<session<application <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <% pageContext.setAttribute("name", "linjie"); request.setAttribute("name", "lucy"); session.setAttribute("name", "king"); application.setAttribute("name", "bilibili"); %> name=${name } </body> </html>
可以看出沒有使用EL內(nèi)置對象時查找順序是由小到大,所以最先顯示的是pageContext域中的
2、使用EL內(nèi)置對象,從指定域中獲取數(shù)據(jù),提高了查找效率
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <% pageContext.setAttribute("name", "linjie"); request.setAttribute("name", "lucy"); session.setAttribute("name", "king"); application.setAttribute("name", "bilibili"); %> name=${applicationScope.name } </body> </html>
可以看出,使用applicationScope即可指定application域中的name輸出,當然其他域也是類似,下文會說這四大域屬性相關的內(nèi)置對象
三、EL中的內(nèi)置對象
EL有11個內(nèi)置對象,這里主要講域屬性相關的4個和其他4個
EL的11個內(nèi)置對象,除了pageContext以外,其他10個內(nèi)置對象的類型都是java.util.Map類型
1、域屬性相關(4個)
- pageScope:從page范圍域屬性空間中查找指定的key
- requestScope:從request范圍域屬性空間中查找指定的key
- sessionScope:從session范圍域屬性空間中查找指定的key
- applicationScope:從application范圍域屬性空間中查找指定的key
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <% pageContext.setAttribute("name", "linjie"); request.setAttribute("name", "lucy"); session.setAttribute("name", "king"); application.setAttribute("name", "bilibili"); %> name=${applicationScope.name }<br> name=${pageScope.name }<br> name=${sessionScope.name }<br> name=${requestScope.name }<br> </body> </html>
2、其他重要內(nèi)置對象(4個)
1、pageContext
該pageContext與JSP內(nèi)置對象pageContext是同一個對象。通過該對象,可以獲取到request、response、session、servletContext、servletConfig等對象注意:這些對象在EL里不是內(nèi)置對象,這些對象只能通過pageContext獲取
在EL中直接${pageContext.request}即可獲取request對象,其底層調(diào)用的是pageContext.getRequest()方法。同理,也可以通過類似方法獲取其他對象
重點:其中最常用的:${pageContext.request.contextPath }
,代表web應用下的根,可以看出下面action中的路徑可讀性更強了
Regster.java
package linjie.com; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Regster extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.getWriter().append("Served at: ").append(request.getContextPath()); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <%-- ${pageContext.request.contextPath }代表web應用的根 --%> <form action="${pageContext.request.contextPath }/regster" method="POST"> xxx<input type="text" name="name"/><br> yyy<input type="text" name="age"/><br> <input type="submit" value="點擊"> </form> </body> </html>
2、param(獲取請求中的指定參數(shù))
其底層實際調(diào)用request.getParameter()
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <%-- ${pageContext.request.contextPath }代表web應用的根 --%> <form action="${pageContext.request.contextPath }/show.jsp" method="POST"> xxx<input type="text" name="name"/><br> yyy<input type="text" name="age"/><br> <input type="submit" value="點擊"> </form> </body> </html>
show.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> name=${param.name }<br> age=${param.age }<br> </body> </html>
客戶瀏覽器訪問結果
3、paramValues
獲取請求中的指定參數(shù)的所以值,其底層實際調(diào)用request.getParameterValues()
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <%-- ${pageContext.request.contextPath }代表web應用的根 --%> <form action="${pageContext.request.contextPath }/show.jsp" method="POST"> xxx<input type="text" name="name"/><br> yyy<input type="text" name="age"/><br> 愛好: <input type="checkbox" name="hobby" value="sleep">睡覺 <input type="checkbox" name="hobby" value="play">玩 <input type="checkbox" name="hobby" value="eat">吃 <input type="submit" value="點擊"> </form> </body> </html>
show.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> name=${param.name }<br> age=${param.age }<br> hobby[0]=${paramValues.hobby[0] }<br> hobby[1]=${paramValues.hobby[1] }<br> </body> </html>
客戶瀏覽器顯示結果
4、initParam
獲取初始化參數(shù),其底層調(diào)用的是ServletContext.getInitParameter()
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>07eltttt</display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <!--初始化參數(shù) --> <context-param> <param-name>name</param-name> <param-value>林杰</param-value> </context-param> <servlet> <display-name>Regster</display-name> <servlet-name>Regster</servlet-name> <servlet-class>linjie.com.Regster</servlet-class> </servlet> <servlet-mapping> <servlet-name>Regster</servlet-name> <url-pattern>/regster</url-pattern> </servlet-mapping> </web-app>
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> name=${initParam.name } </body> </html>
客戶瀏覽器顯示結果
四、EL訪問Bean的屬性
1、什么是java Bean
JavaBean是公共Java類,但是為了編輯工具識別
需要滿足至少三個條件
- 有一個public默認構造器(例如無參構造器)
- 屬性使用public 的get,set方法訪問,也就是說設置成private同時get,set方法與屬性名的大小也需要對應。例如屬性name,get方法就要寫成,public String getName(){},N大寫。
- 需要序列化。這個是框架,工具跨平臺反映狀態(tài)必須的
2、EL訪問Bean屬性
EL可以通過${key.屬性}的方式獲取到指定值,其底層實際調(diào)用的是該對象的相應屬性的get方法
Demo.java
package linjie.com; /* *Bean */ public class Demo { private String name; private int age; public Demo(String name,int age){ this.name=name; this.age=age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return super.toString(); } }
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" import="linjie.com.Demo" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <% Demo test=new Demo("linjie",12); request.setAttribute("ELttt", test); %> name=${requestScope.ELttt.name }<br> age=${requestScope.ELttt.age }<br> <!-- 若訪問為null的對象的屬性,EL是不會拋出空指針異常的,只是不顯示而已 --> names=${requestScope.ELtttxx.name }<br> </body> </html>
客戶瀏覽器顯示結果
五、EL訪問數(shù)組中的數(shù)據(jù)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <% String[] names={"xlj","lucy","king"}; pageContext.setAttribute("names", names); %> name[1]=${names[1] }<br> <!-- 若訪問的數(shù)組元素下標超出了數(shù)組下標上限,EL不會拋出越界異常,只是不顯示 --> names[5]=${names[5] }<br> </body> </html>
下面是訪問類的數(shù)組
Stu.java
package linjie.com; /* *Bean */ public class Stu { private String sname; private String address; public Stu() { super(); } public Stu(String sname, String address) { super(); this.sname = sname; this.address = address; } public String getSname() { return sname; } public void setSname(String sname) { this.sname = sname; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return super.toString(); } }
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" import="linjie.com.*" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <% Stu[] stus=new Stu[3]; stus[0]=new Stu("xlj","A"); stus[1]=new Stu("lucy","B"); stus[2]=new Stu("kingA","C"); pageContext.setAttribute("stus",stus); %> stus[1].Sname=${stus[1].sname } </body> </html>
客戶瀏覽器顯示結果
六、EL獲取list中數(shù)據(jù)
<%@page import="java.util.*"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <% List<String> names=new ArrayList<String>(); names.add("xlj"); names.add("lucy"); pageContext.setAttribute("names", names); %> <!-- 因為List底層是數(shù)組,所以可以這樣寫 --> names[1]=${names[1] }<br> </body> </html>
客戶瀏覽器顯示結果
注意:
EL可以通過索引訪問List,但無法訪問Set。因為Set中沒有索引概念
七、EL訪問Map
<%@page import="java.util.*"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <% Map<String,Object> map=new HashMap<String,Object>(); map.put("age", 20); map.put("name", "xlj"); pageContext.setAttribute("map", map); %> name=${map.name }<br> age=${map.age }<br> </body> </html>
客戶瀏覽器顯示結果
八、EL中的運算符(empty)
1、先說說幾個常用運算符
- 算術運算符:+、-、*、/、%(不支持++、–)
- 關系運算符:==、!=、>、>=、<、<=
- 邏輯運算符:!、&&、||、not、and、or
- 條件運算符:?:
- 取值運算符:[]、點號
2、empty運算符
用法為${empty 變量},結果為布爾值
<%@page import="java.util.*"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <% String name1=null; String name2=""; List<String> name3=new ArrayList<String>(); pageContext.setAttribute("name1", name1); pageContext.setAttribute("name2", name2); pageContext.setAttribute("name3", name3); %> empty對于沒有定義的變量,運算結果為true: empty namex=${empty namex }<br> empty對于null的引用,運算結果為true: empty name1=${empty name1 }<br> empty對于為空串的String引用,運算結果為true: empty name2=${empty name2 }<br> empty對于沒有元素的數(shù)組或集合,運算結果為true: empty name3=${empty name3 }<br> </body> </html>
客戶瀏覽器顯示結果
九、自定義EL函數(shù)
因為EL本身不具有處理字符串能力,所以可以自定義EL函數(shù)
- 定義函數(shù)(新建MyEL.java類)
- 注冊:先找到jsp2-example-taglib.tld,將頭部以及注冊函數(shù)復制到自己創(chuàng)建的.tld文件中(.tld放在WEB-INF下)
- 在index.jsp中使用,使用時需要<%@ taglib uri=”http://tomcat.apache.org/jsp2-example-taglib” prefix=”MyEL” %>
1、定義函數(shù)MyEL.java
package linjie.com; //自定義函數(shù) //該類及其函數(shù),需要在擴展名為.tld的xml文件中注冊 //tld:tag library definition(標簽庫定義) //xml文件是需要約束的,即需要配置文件頭部。這個頭部約束可以從一下文件中進行復制 //在Tomcat安裝目錄下:webapps\examples\WEB-INF\jsp2 //文件為:jsp2-example-taglib.tld //這個.tld的xml文件,需要定義在當前web項目的WEB-INF目錄下,在此目錄下創(chuàng)建以.tld結尾的xml文件 //將jsp2-example-taglib.tld中頭部復制到創(chuàng)建的xml文件中 //再將函數(shù)注冊,還是在jsp2-example-taglib.tld底部中復制 public class MyEL { private static MyEL instance; public static MyEL getInstance() { if(instance==null) { instance=new MyEL(); } return instance; } //字符串小寫變大寫 public static String LowerToUpper(String str) { return str.toUpperCase(); } }
2、將jsp2-example-taglib.tld中頭部部分以及底部的注冊函數(shù)部分復制到自己創(chuàng)建的tld(在WEB-INF下)文件中
MyEL.tld
<?xml version="1.0" encoding="UTF-8"?> <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0"> <!-- 定義標簽庫信息 --> <description>A tag library exercising SimpleTag handlers.</description> <tlib-version>1.0</tlib-version> <short-name>MyEL</short-name><!-- 標簽庫名稱,一般定義成和文件名一樣 --> <uri>http://tomcat.apache.org/jsp2-example-taglib</uri> <!-- 注冊函數(shù) --> <function> <name>MyLowerToUpper</name> <function-class>linjie.com.MyEL</function-class><!-- 方法得類 --> <function-signature>java.lang.String LowerToUpper( java.lang.String )</function-signature><!-- 方法簽名 :需要返回值以及方法名、參數(shù)--> </function> </taglib>
3、在index.jsp中使用,使用時需要<%@ taglib uri=”http://tomcat.apache.org/jsp2-example-taglib” prefix=”MyEL” %>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://tomcat.apache.org/jsp2-example-taglib" prefix="MyEL" %><!-- tld中的uri和short-name --> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <!-- 這個方法名是在tld注冊時的name --> ${MyEL:MyLowerToUpper("sasas") }<br> <!-- EL函數(shù)只能處理四大域中的屬性值及String常量 --> <% String name="xlj"; pageContext.setAttribute("name", name); %> ${MyEL:MyLowerToUpper(name) }<br> </body> </html>
客戶瀏覽器顯示結果
十、EL總結
- EL表達式不能出現(xiàn)在Java代碼塊、表達式塊等JSP動態(tài)代碼部分
- EL只能從四大域屬性空間中獲取數(shù)據(jù)(pageContext、request、session、application)
- EL不會拋出空指針異常,只會不顯示
- EL不會拋出數(shù)組越界異常,只會不顯示
- EL不具有對字符串進行處理的能力(可以使用JSTL的EL或者自定義EL函數(shù))
到此這篇關于jsp EL表達式詳解的文章就介紹到這了,更多相關jsp EL表達式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
jsp通過自定義標簽庫實現(xiàn)數(shù)據(jù)列表顯示的方法
這篇文章主要介紹了jsp通過自定義標簽庫實現(xiàn)數(shù)據(jù)列表顯示的方法,較為詳細的分析了jsp自定義標簽的定義、功能實現(xiàn)與使用技巧,并附帶了完整的實例代碼供讀者下載參考,需要的朋友可以參考下2015-10-10JSP 中Spring的Resource類讀寫中文Properties實例代碼
這篇文章主要介紹了JSP 中Spring的Resource類讀寫中文Properties實例代碼的相關資料,需要的朋友可以參考下2017-03-03struts2中action實現(xiàn)ModelDriven后無法返回json的解決方法
struts2中action實現(xiàn)ModelDriven后無法返回json的解決方法,需要的朋友可以參考一下2013-03-03springMVC使用jsp:include嵌入頁面的兩種方法(推薦)
下面小編就為大家?guī)硪黄猻pringMVC使用jsp:include嵌入頁面的兩種方法(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-06-06javascript通過url向jsp頁面?zhèn)鬟f中文參數(shù)導致亂碼解決方案
javascript通過url向jsp頁面?zhèn)鬟f中文參數(shù)亂碼,一直都是從事jsp開發(fā)者比較煩心的是,于是本文介紹了一些解決方法,感興趣的朋友可以了解下2013-01-01jsp 使用request為頁面添加靜態(tài)數(shù)據(jù)的實例
下面小編就為大家分享一篇jsp 使用request為頁面添加靜態(tài)數(shù)據(jù)的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-12-12