(新手帖)Action、jsp、js的關係
阿新 • • 發佈:2019-02-11
4年前第一次用struts2的時候,有一個疑問,為什麼在js裡無法直接取到Action裡的值,而在jsp裡可以
現在基本知道拉,總結一下:
Action是在服務端(servlet容器裡)執行的,執行之後生成jsp,並寫入響應返回給客戶端(一般是瀏覽器)
通常情況下,Action和jsp可以視為一個整體,Action是jsp的前置,jsp可以從ValueStack裡取到Action中定義的欄位。二者共同處理HTTP請求。
本質上來說,大體上可以認為是這個流程:Action進行邏輯處理之後,把一些值放到Request的Attribute裡(或者是SessionAttribute,總之都沒有脫離servlet規範的範疇),然後jsp從裡面取出來,最後jsp經過servlet容器的編譯,生成響應返回客戶端
但是javascript的執行環境完全不同。客戶端得到的最終的html裡,附帶了javascript的連結,瀏覽器重新發起請求,獲取到javascript之後,在本地執行,這時候與此前針對Action發起的請求已經沒有關係了。這時候一般來說,javascript只能基於html取值,也可以選擇重新發起ajax請求
所以實際中,在jsp頁面裡,需要把javascript以後可能會用到的值,先放到html裡,比如:
這裡的<span>,是不在頁面上顯示的,目的就是為了之後給javascript來取
現在基本知道拉,總結一下:
Action是在服務端(servlet容器裡)執行的,執行之後生成jsp,並寫入響應返回給客戶端(一般是瀏覽器)
通常情況下,Action和jsp可以視為一個整體,Action是jsp的前置,jsp可以從ValueStack裡取到Action中定義的欄位。二者共同處理HTTP請求。
本質上來說,大體上可以認為是這個流程:Action進行邏輯處理之後,把一些值放到Request的Attribute裡(或者是SessionAttribute,總之都沒有脫離servlet規範的範疇),然後jsp從裡面取出來,最後jsp經過servlet容器的編譯,生成響應返回客戶端
但是javascript的執行環境完全不同。客戶端得到的最終的html裡,附帶了javascript的連結,瀏覽器重新發起請求,獲取到javascript之後,在本地執行,這時候與此前針對Action發起的請求已經沒有關係了。這時候一般來說,javascript只能基於html取值,也可以選擇重新發起ajax請求
所以實際中,在jsp頁面裡,需要把javascript以後可能會用到的值,先放到html裡,比如:
<td> <button class="edit_book">編輯</button> <button class="delete_book">刪除</button> <span class="hidden_book_id"><s:property value="id" /></span> </td>
這裡的<span>,是不在頁面上顯示的,目的就是為了之後給javascript來取
function deleteBook() { var $deleteButton = $(this); var $idSpan = $deleteButton.parent().find(".hidden_book_id"); var bookId = $idSpan.text(); var url = "delete.action?id=" + bookId; window.location.href = url; }