EL運算式,
1、EL是JSP內建的運算式語言。
- jsp2.0開始,不讓再使用Java指令碼,而是使用EL運算式和動態標籤來替代Java指令碼
- EL替代的是<%=....%>,也就是說,EL只能做輸出。
2、EL運算式來讀取四大域
- ${xxx},全域尋找名為xxx 的屬性,如果不存在,輸出Null 字元串,而不是null。
- ${pageScope.xxx}、${requestScope.xxx}、${sessionScope.xxx}、${applicationScope.xxx},指定域擷取屬性。
3、JavaBean導航
1 <%@ page contentType="text/html;charset=UTF-8" language="java" %> 2 <%@ page import="domain.Employee,domain.Address" %> 3 <html> 4 <head> 5 <title>Title</title> 6 </head> 7 <body> 8 <% 9 Address address = new Address();10 address.setCity("深圳");11 address.setStreet("南山");12 13 Employee emp = new Employee();14 emp.setName("張三");15 emp.setSalary(12312);16 emp.setAddress(address);17 18 request.setAttribute("emp",emp);19 %>20 <h3>使用el擷取request域的emp</h3>21 ${requestScope.emp.address.street}22 <!-- request.getAttribute("emp").getAddress().getStreet--><br/>23 ${emp.hehe}24 </body>25 </html>
1 package domain; 2 public class Employee { 3 private String name; 4 private double salary; 5 private Address address; 6 7 public String getName() { return name; } 8 public void setName(String name) { this.name = name; } 9 public double getSalary() { return salary; }10 public void setSalary(double salary) { this.salary = salary; }11 public Address getAddress() { return address; }12 public void setAddress(Address address) { this.address = address; }13 @Override14 public String toString() {15 return "Employee{" +16 "name='" + name + '\'' +17 ", salary=" + salary +18 ", address=" + address +19 '}';20 }21 public String getHehe() { return "呵呵"; }22 }
1 package domain; 2 3 public class Address { 4 private String city; 5 private String street; 6 7 public String getCity() { return city; } 8 public void setCity(String city) { this.city = city; } 9 public String getStreet() { return street; }10 public void setStreet(String street) { this.street = street; }11 @Override12 public String toString() {13 return "Address{" +14 "city='" + city + '\'' +15 ", street='" + street + '\'' +16 '}';17 }18 }
4、EL可以輸出的東西都11個內建對象中:其中10個是Map,不是map的是PageContext類型,一個頂9個。
<body> ${header['User-Agent']}<br/> </body>
- haeaderValues:對應要求標頭,它是一個Map,其中key表示頭名稱,value是多個頭值,適用於多值要求標頭。
- initParam:擷取<context-param>內的參數
<context-param> <param-name>xxx</param-name> <param-value>XXX</param-value></context-param> <context-param> <param-name>yyy</param-name> <param-value>YYY</param-value></context-param>
<body>
${initParam.xxx}
</body>
- cookie:Map<String,Cookie>類型,其中key是cookie的name,value是cookie對象,${cookie.username.value}
<body>${cookie.JSESSIONID}<br/>${cookie.JSESSIONID.name}<br/>${cookie.JSESSIONID.value}<br/></body>
- pageContext:它是PageContext類型。
1 <body> 2 <!-- 擷取項目名,無則為"/" --> 3 ${pageContext.request.contextPath} 4 <hr/> 5 <a href="${pageContext.request.contextPath}/el/a.jsp">點擊這裡</a> 6 <form action="${pageContext.request.contextPath}/cookie/a.jsp" method="post"> 7 <input type="submit" value="xxx"> 8 </form> 9 <hr/>10 ${pageContext.session.id}11 </body>
| EL運算式 |
說明 |
描述 |
| ${pageContext.request.queryString} |
pageContext.getRequest().getQueryString(); |
取得請求的參數字串 |
| ${pageContext.request.requestURL} |
pageContext.getRequest().getRequestURL(); |
取得請求的URL,但不包括請求之參數字串 |
| ${pageContext.request.contextPath} |
pageContext.getRequest().getContextPath(); |
服務的web application 的名稱 |
| ${pageContext.request.method} |
pageContext.getRequest().getMethod(); |
取得HTTP 的方法(GET、POST) |
| ${pageContext.request.protocol} |
pageContext.getRequest().getProtocol(); |
取得使用的協議(HTTP/1.1、HTTP/1.0) |
| ${pageContext.request.remoteUser} |
pageContext.getRequest().getRemoteUser(); |
取得使用者名稱稱 |
| ${pageContext.request.remoteAddr } |
pageContext.getRequest().getRemoteAddr(); |
取得使用者的IP 位址 |
| ${pageContext.session.new} |
pageContext.getSession().isNew(); |
判斷session 是否為新的 |
| ${pageContext.session.id} |
pageContext.getSession().getId(); |
取得session 的ID |
| ${pageContext.servletContext.serverInfo} |
pageContext.getServletContext().getServerInfo(); |
取得主機端的服務資訊 |
5、EL函數庫(由JSTL提供的)
<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
${fn:contains("abc","a")}<!-- true -->
| 函數 |
描述 |
| boolean contains(String input,String substring) |
測試輸入的字串是否包含指定的子串 |
| boolean containsIgnoreCase(String input,String substring) |
測試輸入的字串是否包含指定的子串,大小寫不敏感 |
| int indexOf(String input,String substring) |
返回指定字串在輸入字串中出現的位置 |
| String toLowerCase(String input) |
將字串中的字元轉為小寫 |
| String toUpperCase(String input) |
將字串中的字元轉為大寫 |
| boolean startsWith(String input,String substring) |
測試輸入字串是否以指定的首碼開始 |
| boolean endsWith(String input,String substring) |
測試輸入的字串是否以指定的尾碼結尾 |
| String substring(String input,int beginIndex,int endIndex) |
返回字串的子集 |
| String substringAfter(String input,String substring) |
返回字串在指定子串之後的子集 |
| String substringBefore(String input,String substring) |
返回字串在指定子串之前的子集 |
| String escapeXml(String input) |
跳過可以作為XML標記的字元("<"、">"、"&"、" ' "、“ " ”),即進行轉義 |
| String trim(String input) |
移除首尾的空白符 |
| String replace(String input,String substringBefore,String substringAfter) |
將輸入字串中指定的位置替換為指定的字串然後返回 |
| String[] split(String input,String delimiters) |
將字串用指定的分隔字元分隔然後組成一個子字串數組並返回 |
| int length(Object obj) |
返回字串、數組、各種集合的長度 |
| String join(String array[] ,String separator) |
將數組中的元素合成一個字串然後輸出 |
6、自訂函數庫
①寫一個java類,類中可以定義0~N個方法,但必須是static,而且有傳回值的。
②在WEB-INF目錄下建立一個tld檔案
<function> <name>fun</name> <function-class>fn.MyFunction</function-class> <function-signature>java.lang.String fun()</function-signature></function>
③在jsp頁面中匯入標籤庫
<%@ taglib prefix="it" uri="/WEB-INF/tlds/itcast.tld"%>
④在jsp頁面中使用自訂的函數:${it:fun()}