1. 程式人生 > >(新手帖)Action、jsp、js的關係

(新手帖)Action、jsp、js的關係

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裡,比如:
<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;
}