日期:2014-05-16  浏览次数:20327 次

(新手帖)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;
}