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; }