在說相關內容前,一定要先熟悉jsp運行原理:
http://blog.csdn.net/lmsnju/article/details/4813488
http://hi.baidu.com/mingfang0219/blog/item/a13db6de9b36ee1e6327989f.html
http://blog.sina.com.cn/s/blog_5ce1157b0100wjbv.html
el表達式(運用el表達式直接獲取值時,例如,${msg},不需要為msg提供set get方法;但是當獲取對象的屬性值時,例如,user.name,則必須為name屬性提供set get方法)是jsp相關的概念,是在服務端執行的,服務端執行完成后再傳給客戶端瀏覽器,js是在客戶端瀏覽器執行的,el在js前就已經被執行了。EL、JSTL以及其他各種標簽是在服務端執行好后再通過網絡傳送給客戶端,瀏覽器客戶端收到后才會執行其中的js腳本。也就是說,el表達式生效的時候js代碼還全都是文本,等js生效的時候早就沒了el表達式了,你可以在瀏覽器中查看源代碼,你就會發現el標簽${}全沒了,都轉化為具體的值了。jsp和js不是一個平面上的東西,它們不可能在同一個時刻同時執行,它們沒有任何交叉點。所以標題中“使用”兩個字采用雙引號,並不是js真正地使用el表達式,而是使用el表達式最終轉化的值。
類似的,對於js中“使用”java代碼,與使用el表達式是一個道理:JSP是先進行編譯把java代碼都編譯出來形成一張完整的頁面再發到客戶端,js只是在客戶端執行,等到js執行的時候其實js已經看不到java代碼了。
如何在js代碼(代碼段或者js文件中的代碼)中,獲取el表達式的值或者java代碼的值?可以通過下面的方式獲取:
jsp文件中的js獲取jsp頁面中el表達式的值: var aaa = "${message}"
jsp文件中的js獲取jsp頁面中java代碼的變量值:var aaa = "<%=JAVA變量名 %>"
所以,先在jsp文件中:定義js變量獲取el表達式的值或者java代碼的值:
- <script type="text/javascript">
- var aaa = "${user.name}"; //獲取el表達式的值,此時aaa="jack"
- var nnn = "<%=Constants.getValue()%>"; //獲取java代碼的值,此時nnn="3"
- </script>
然后在其他js代碼段中或者js文件中,就可以直接訪問aaa跟nnn了。
你可能已經注意到了:上面的el表達式跟java代碼都加了引號,這樣做,不管值是什么類型,都會轉為字符串。如果el表達式跟java代碼不加引號,會怎么樣呢?看下面:
- <script type="text/javascript">
- var aaa = ${user.name}; //在js執行的時候代碼為var aaa = jack; 此時會把jack看做一個變量處理,如果此時碰巧js全局有jack變量,那就會把jack變量的值賦給aaa,否則報undefined錯
- var nnn = <%=Constants.getValue()%>; //在js執行的時候代碼為var nnn = 3;此時typeof(nnn)為number類型
- </script>
所以如果值是字符串類型的,最好加上引號;如果是數字類型的,可以加(會轉為字符串),也可以不加(number類型)。參考:http://hi.baidu.com/sun321000s/blog/item/8551cc8eb6c3c18fa5c27255.html
總結:
在js文件中不能直接使用el表達式以及java代碼(瀏覽器是識別不了jsp中el等標簽的:返回給客戶端的結果是JSP文件執行的結果,不包含任何JSP語法)。但是el表達式、java代碼、js腳本、jstl標簽等都可以在jsp文件中使用,所以要想在js代碼中使用el表達式的值或者是java代碼的值,可以通過jsp文件這樣一個橋梁,達到目的!
js寫在jsp文件里,jsp能用的標簽(el表達式、jstl標簽、java代碼等),js就能“用”;js單獨寫成一個文件,啥標簽都不能“用”,都沒效。不過一般不建議js使用亂七八糟的jsp標簽。
附:
JSTL核心標簽庫的使用:http://www.cnblogs.com/lihuiyy/archive/2012/02/24/2366806.html
EL表達式:http://www.cnblogs.com/Fskjb/archive/2009/07/05/1517192.html