以下是一些JSP EL基本用法,寫出來做個筆記,也可供大家參考交流。
一、EL表達式
EL在jsp中最基本的功能是取代諸如pageContext、request、session、application的對象的getAttribute()操作。
在jsp用運用EL可以簡化代碼,更加高效。
二、具體語法
Expression Language(EL)最先只能在jstl中用,后來才允許在jsp其他部分使用。
1、用於web層,也就是jsp
2、語法
a) ${expr}
b) 不允許嵌套
c) Bean的getter和 . 及 [] 操作
- . 操作 : 取得attribute的某個getter方法的返回值。
- [] 操作:作用和 . 操作一樣,但允許不規范的命名(比如有空格和點)
3、expr可以是:
a) 文字量
b) Attribute
c) <jsp:bean>定義的bean:實際也是attribute
d) 參數和cookie
e) 可以含有運算符
4、Implicit(隱含) Objects
a) pageContext
b) pageScope
c) requestScope
d) sessionScope
e) applicationScope
f) param
g) paramValues
h) header
i) headerValues
j) cookie
k) initParam
b~e用來限定attribute的范圍,如果一個attribute沒指定范圍,那么有一個默認的由小到大的查找順序。
5、運算
a) 算術運算
- + - * /(或div) %(或mod)
b) 關系運算符
- ==(或 eq)、!=(或 ne)、<(或 lt)、>;(或 gt)、<=(或 le)和 >;=(或 ge)
c) 邏輯運算符
- &&(或 and)、||(或 or)和 !(或 not)
d) 空驗證運算符 empty
e) 條件運算 ?:
三、語法舉例說明
下面通過具體的例子說明如何使用EL表達式,首先我們定義一個User類
public class User { private int id; private String n; private String password; public User() { super(); } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return n; } public void setName(String name) { this.n = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String toString(){ return "id:"+id+" || name:"+n+" || password:"+password; } }
<% String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getLocalPort()+ request.getContextPath() + "/"; //EL無法直接使用java小腳本當中定義的變量 pageContext.setAttribute("bp", basePath); User user = new User(); user.setName("zhang3"); user.setPassword("123"); request.setAttribute("user4test", user); %>
a) ${expr}與算術運算的運用
${expr}它的意思是取出某一范圍中名稱為expr的變量。
1 <body> 2 <!-- 先在pageContext里找 user4test,沒有再找request ... --> 3 ${user4test} 4 5 <% 6 //Object obj=pageContext.getAttribute("user4test"); 7 //String name=((User)obj).getName(); 8 //out.print(name); 9 %> 10 <% 11 //或者在jsp表達式中用: ((User)(pageContext.getAttribute("user4test"))).getName() 12 %> 13 <br /> ${user4test.name}<br /> 14 15 16 <!-- 也可以直接指定scope --> 17 ${requestScope.user4test.name}//這里我們指定用requestScope 18 <br /> 19 <!-- 如果找不到呢? --> 20 這里有一個隱形的el:${notExist}<br/> 21 這里有一個隱形的el(by jsp expression):<%=request.getAttribute("notExist") %> 22 <br /> 23 24 25 <!-- 下面3個是常量 --> 26 ${"我愛中國"} 27 <br /> ${12345} 28 <br /> ${true} 29 <br /> 30 31 32 <!-- 以下是運算符 --> 33 <% 34 pageContext.setAttribute("three", new Integer(3)); 35 %> 36 ${3==4||3==three} 37 <br /> ${user4test.password=="123"} 38 <br /> ${123=="123"} ${123=="234"} 39 <br /> 40 41 3+4="${3+4}" 42 <br /> ${3==three?"正確":"錯誤"} 43 <br /> 44 </body>
結果如下:
1 id:0 || name:zhang3 || password:123 2 zhang3 3 zhang3 4 這里有一個隱形的el: 5 這里有一個隱形的el(by jsp expression):null 6 我愛中國 7 12345 8 true 9 true 10 true 11 true false 12 3+4="7" 13 正確
特別需要我們注意的是當屬性擁有特殊字符時要使用[]:
1 <body> 2 無效的訪問形式:${user.test.name}<br/> 3 4 ${requestScope["user.test"].name}<br/> 5 6 注意:不能寫成{["user.test"].name},因為[]相當於點,不能寫成“.xxxxxx”,第一個點前面沒東西了。<br> 7 8 </body>
結果如下:
1 無效的訪問形式: 2 zhang3 3 注意:不能寫成${["user.test"].name},因為[]相當於點,不能寫成“.xxxxxx”,第一個點前面沒東西了。
b)EL中empty的使用
1 <% 2 pageContext.setAttribute("str1",""); 3 pageContext.setAttribute("str3",null); 4 pageContext.setAttribute("array",new String[]{}); 5 pageContext.setAttribute("array1",new String[]{""}); 6 %>
1 <body> 2 ${empty str1 } 3 <br></br> 4 ${empty str2 } 5 <br></br> 6 ${empty str3 } 7 <br></br> 8 ${empty array } 9 <br></br> 10 ${empty array1 } 11 </body>
我們得到結果如下:
1 true 2 3 true 4 5 true 6 7 true 8 9 false
c)EL中List的使用
<% List<String> list=new ArrayList<String>(); list.add("litem1"); String[] arr=new String[]{"String1"}; Map<String,String> map=new HashMap<>(); map.put("key1", "mitem1"); pageContext.setAttribute("list", list); pageContext.setAttribute("map", map); pageContext.setAttribute("arr", arr); pageContext.setAttribute("k", "key1"); %>
<body> <!-- 用[]運算,k被作為屬性查找 --> ${map[k]}<br/> <!-- 用.運算,k被作為字符串的key,因為map中沒有鍵為“k”的項,所以此處沒有輸出 --> ${map.k}<br/> ${map["key1"]}<br/> <!-- 一般用下面的形式 --> ${map.key1}<br/> ${list[0]}<br/> ${arr[0]}<br/> </body>
得到結果如下:
1 mitem1 2 3 mitem1 4 mitem1 5 litem1 6 String1