EL(表達式語言)
1、EL概述
EL是JSP内置的表達式語言!
* jsp2.0開始,不讓再使用java腳本,而是使用el表達式和動态标簽來替代java腳本!
* EL替代的是<%= ... %>,也就是說,EL隻能做輸出!
1.1、EL的作用
JSP2.0要把html和css分離、要把html和javascript分離、要把Java腳本替換成标簽。标簽的好處是非Java人員都可以使用。
JSP2.0 – 純标簽頁面,即:不包含<% … %>、<%! … %>,以及<%= … %>
1.2、EL的格式
格式:${…}
例如:${1 + 2}
1.3、關閉EL
如果希望整個JSP忽略EL表達式,需要在page指令中指定isELIgnored=”true”。
如果希望忽略某個EL表達式,可以在EL表達式之前添加“\”,例如:\${1 + 2}。
1.4、EL運算符
運算符 | 說明 | 範例 | 結果 |
+ | 加 | ${17+5} | 22 |
- | 減 | ${17-5} | 12 |
* | 乘 | ${17*5} | 85 |
/或div | 除 | ${17/5}或${17 div 5} | 3 |
%或mod | 取餘 | ${17%5}或${17 mod 5} | 2 |
==或eq | 等于 | ${5==5}或${5 eq 5} | true |
!=或ne | 不等于 | ${5!=5}或${5 ne 5} | false |
<或lt | 小于 | ${3<5}或${3 lt 5} | true |
>或gt | 大于 | ${3>5}或${3 gt 5} | false |
<=或le | 小于等于 | ${3<=5}或${3 le 5} | true |
>=或ge | 大于等于 | ${3>=5}或${3 ge 5} | false |
&&或and | 并且 | ${true&&false}或${true and false} | false |
!或not | 非 | ${!true}或${not true} | false |
||或or | 或者 | ${true||false}或${true or false} | true |
empty | 是否為空 | ${empty “”},可以判斷字元串、資料、集合的長度是否為0,為0傳回true。empty還可以與not或!一起使用。${not empty “”} | true |
1.5、EL不顯示null
當EL表達式的值為null時,會在頁面上顯示空白,即什麼都不顯示。
2、EL表達式格式
先來了解一下EL表達式的格式!現在還不能示範它,因為需要學習了EL11個内置對象後才友善顯示它。
* 操作List和數組:${list[0]}、${arr[0]};
* 操作bean的屬性:${person.name}、${person[‘name’]},對應person.getName()方法;
* 操作Map的值:${map.key}、${map[‘key’]},對應map.get(key)。
如果在域中儲存的是JavaBean對象,那麼可以使用EL來通路JavaBean屬性。因為EL隻做讀取操作,
是以JavaBean一定要提供get方法,而set方法沒有要求。
3、EL内置對象
EL一共11個内置對象,無需建立即可以使用。這11個内置對象中有10個是Map類型的,最後一個是pageContext對象。
* pageScope
* requestScope
* sessionScope
* applicationScope
* param;
* paramValues;
* header;
* headerValues;
* initParam;
* cookie;
* pageContext;
3.1、域相關内置對象(重點)
域内置對象一共有四個:
* pageScope:${pageScope.name} 等同于 pageContext.getAttribute("name");
* requestScope:${requestScope.name} 等同于 request.getAttribute("name");
* sessionScoep: ${sessionScope.name} 等同于 session.getAttribute("name");
* applicationScope:${applicationScope.name} 等同于 application.getAttribute("name");
EL表達式來讀取四大域
* ${xxx},全域查找名為xxx的屬性,如果不存在,輸出空字元串,而不是null。
* ${pageScope.xxx}、${requestScope.xxx}、${sessionScope.xxx}、${applicationScope.xxx},指定域擷取屬性!
全域查找:${xxx}表示依次在pageScope、requesScopet、sessionScope、appliationScope四個域中查找名字為person的屬性。
3.2、param 和 paramValues:請求參數相關内置對象
* param:Map<String,String>類型,param對象可以用來擷取參數,與request.getParameter()方法相同。
注意,在使用EL擷取參數時,如果參數不存在,傳回的是空字元串,而不是null。這一點與使用request.getParameter()方法是不同的。
${param.username }
* paramValues:paramValues是Map<String, String[]>類型,當一個參數名,對應多個參數值時可以使用它。
${paramValues.hobby[0] }
${paramValues.hobby[1] }
3.3、header 和 headerValues :請求頭相關内置對象
* header: Map<String,String>類型,用來擷取請求頭。
${header['User-Agent']}
* headerValues:headerValues是Map<String,String[]>類型。當一個請求頭名稱,對應多個值時,使用該對象,這裡就不在贅述。
3.4、initParam:應用初始化參數相關内置對象
* initParam:initParam是Map<String,String>類型。它對應web.xml檔案中的<context-param>參數。
<context-param>
<param-name>yyy</param-name>
<param-value>YYY</param-value>
</context-param>
${initParam.yyy}
3.5、Cookie相關内置對象
* cookie:cookie是Map<String,Cookie>類型,其中key是Cookie的名字,而值是Cookie對象本身。
${cookie.JSESSIONID.value }、${cookie.JSESSIONID.name }
3.6、pageContext對象
pageContext:pageContext是PageContext類型!可以使用pageContext對象調用getXXX()方法,
${pageContext.request.contextPath}常用的動态獲得項目路徑,如:/day12_1
例如方法 pageContext.getRequest() 等同于 ${pageContext.request}。也就是讀取JavaBean屬性!!!
EL表達式 | 說明 |
${pageContext.request.queryString} | pageContext.getRequest().getQueryString(); |
${pageContext.request.requestURL} | pageContext.getRequest().getRequestURL(); |
${pageContext.request.contextPath} | pageContext.getRequest().getContextPath(); |
${pageContext.request.method} | pageContext.getRequest().getMethod(); |
${pageContext.request.protocol} | pageContext.getRequest().getProtocol(); |
${pageContext.request.remoteUser} | pageContext.getRequest().getRemoteUser(); |
${pageContext.request.remoteAddr} | pageContext.getRequest().getRemoteAddr(); |
${pageContext.session.new} | pageContext.getSession().isNew(); |
${pageContext.session.id} | pageContext.getSession().getId(); |
${pageContext.servletContext.serverInfo} | pageContext.getServletContext().getServerInfo(); |
例:
AServlet:
Address address = new Address();
address.setCity("北京");
address.setStreet("西三旗");
Employee emp = new Employee();
emp.setName("李小四");
emp.setSalary(123456);
emp.setAddress(address);
request.setAttribute("emp", emp);
request.getRequestDispatcher("/day12_1/a.jsp").forward(request,response);
------------------------------------------
頁面擷取:
<h3>使用el擷取request域的emp</h3>
${requestScope.emp.address.street }
<!-- 等同于内置對象獲得 request.getAttribute("emp").getAddress().getStreet() --><br/>