前提:如果Tomcat服務器不能使用EL表達式
(1)升級成tomcat6
(2)在JSP中加入<%@ page isELIgnored="false" %>
引例:當我們用戶登陸成功的時候,seesion就成功建立起來,我們就能這樣寫一個歡迎界面:
歡迎你!<%=((User)session.getAttribute("user")).getUsername()%>
然而!不覺得這樣寫java代碼太多了嗎?所以可以引用EL表達式:
歡迎你!${user.username} 也可以寫成${user[“username”]}
達到簡化代碼的效果。在這裏user.username自動對應的是user.getUsername()。
所以EL表達式也不是萬能的,在這也能看出EL表達式的缺點:想要取到的屬性值,必須要有相應的get方法!
EL中的隱含對象,即默認取值的對象,例如下面的與範圍有關的隱含對象。
示例:${ username }
表示:取出某一範圍中名稱爲username的屬性變量。
解釋:首先在page中找,即${ username }實際上是${pageScope.username},如果當前page中沒有這個屬性,那麼就越到下一級request,此時${ username }實際上是${requestScope.username}...以此類推。注意:上述取得是“屬性”,而非“參數”。隱含對象只能用來取得範圍屬性值,即JSP中的getAttribute(String name),例如response是不能使用EL表達式的,因爲他沒有getAttribute()——得到屬性的方法。取參數是在request中取的(request也能取屬性)。所以我們可以使用
${param.count + 20}
代替下面的代碼,實現request中保存的某個int類型參數做加法,操作request中的參數
String str_count = request.getParameter("count");
int count = Integer.parseInt(str_count);
count = count + 20;
提到EL表達式中的運算,我首先放個demo:
1.${17 / 5} <br>
2.${17 mod 3} <br>
<%
int i=1;
String num="34";
request.setAttribute("i",num);
%>
3.${i+num} <br>
4.${i} <br>
5.${num} <br>
6.${i+1} <br>
7.${0/20}<br>
8.${20/0}<br>
9.${0/0}<br>
輸出是:
1.3.4
2.2
3.344.34
5.
6.35
7.0.0
8.Infinity
9.NaN
其中2的mod代表取餘,我們也可以直接用%代替mod,mod等價於%,是%的別名。相應的/的別名是div
3就令人費解了,怎麼得到的是34,不是134呢?
我們先看4——${i},這個和前面的${username}一樣,代表取屬性,默認先取的page中的屬性i,如果沒有又去找request中的....我們看到當前page中是沒有這個屬性的,往request中找,有,並且這個屬性變量i的值是34,所以${i}就輸出了34。
同理5中的${num},既不存在於page,也不存在於request中,session,aplication中也沒有,所以取到的是空值(這就是el的好處之一:遇到空值不會報異常也不會變成null值)
所以回過頭看3,${i+num},就是4,5的相加。注意:EL表達式中的“+”不做字符串的拼接。算術符中做的是運算操作。
如果問我們:判斷password1==password2用EL怎麼做:
${param.password1} = = ${param.password2} (錯,這個直接輸出兩者相等,而沒有進行關係比較)
${ ${param.password1 }==${ param.password2 } } (錯,EL表達式就是爲了簡化代碼設計的,不需要相互嵌套完成操作)
${ param.password1 = = param.password2 } (對)
最後再說一下保留字,所謂保留字的意思是指變量在命名時,應該避開的名字,以免程序編譯時發生錯誤