我目前正在学习jsp / servlet,并试图建立一个在线书店。使用jquery,我能够将GET请求发送到servlet。成功后,它将使用browseBookArea.jsp重新加载browseBookArea div。我不明白的是,这个过程导致我的glashfish servet无限循环(它发生在BrowseBookTag.java中。我在那里放了一个System.out.println来检查它。)
还有另一种方法可以将从servlet返回的数据传递给Jquery,这样我可以正确地完成吗?我认为在会话中设置变量不是一个好方法。我在jquery.get中看到了一个示例,我们可以在其中获取响应数据。
var currentCat = "all";
$(document).ready(function(){
$(".categoryItem").click(function(event){
$("#browseBookArea").fadeToggle(100);
currentCat = $(this).attr("id");
$.get("GetBookFromCategoryServlet",{selectedCat:currentCat, currentPage:1}); });
$("#browseBookArea").ajaxSuccess(function(){
$(this).show(300);
$(this).load("Components/browseBookArea.jsp");
});
$(".pagination").click(function(event){
$("#browseBookArea").fadeToggle(100);
var page = $(this).attr("id");
alert(currentCat);
$.get("GetBookFromCategoryServlet",{selectedCat:currentCat, currentPage:page});
});
});
这是我的browseBookArea.jsp:
<div id="browseBookArea" class="span-15 last">
<%System.out.println("Back from servlet");
Collection c = (Collection) request.getAttribute("booksFromCat");
if (c == null) {
Collection c1 = (Collection) session.getAttribute("booksFromCat");
if (c1 == null) System.out.println("Books are null");
}
%>
<myJavaTags:BrowseBookTag books="${booksFromCat}" pageSize="${pageSize}" >
<c:if test="${not empty book1 }">
<div class="span-7">
<center>
<img width="115px" height="115px" src='${book1.photoPath}.jpg'/>
<p>${book1.price}<br/><a>${book1.title}</a> <br/>${book1.authorName}<p>
</center>
</div>
</c:if>
<c:if test="${not empty book2 }">
<div class="push-1 span-7 last">
<center>
<img width="115px" height="115px" src='${book2.photoPath}.jpg'/>
<p>${book2.price}<br/><a>${book2.title}</a> <br/>${book2.authorName}<p>
</center>
</div>
</c:if>
<hr class="space">
</myJavaTags:BrowseBookTag>
<hr class="space"/>
</div>
我的BrowseBookTag:
public void doTag() throws JspException, IOException{
// if (books ==null){
// admin = AdminBeanFactory.getAdminInstance();
// books = admin.browseBook(cat);
// }
Iterator bookIt = books.iterator();
JspContext jsp = getJspContext();
int i = 0, count = 0;
System.out.println("Total book size in browse tag: "+books.size());
while (bookIt.hasNext() && i < pageSize){
BookDTO b = (BookDTO) bookIt.next();
if (count == 0){
jsp.setAttribute("book1", b);
if ((i+1) == pageSize){
jsp.setAttribute("book2", null);
getJspBody().invoke(null);
}
count++;
}else{
jsp.setAttribute("book2", b);
getJspBody().invoke(null);
count = 0;
}
i++;
}
}
答案 0 :(得分:1)
我找到了罪魁祸首。它是:
$("#browseBookArea").ajaxSuccess(function(){
$(this).show(300);
$(this).load("Components/browseBookArea.jsp");
});
坏,坏,坏。这表明我不知道success
方法调用的含义。我刚刚意识到,如果我每次都加载#browseBookArea
div,它会导致一个成功的操作,然后它会再次执行,最终导致递归。最后我摆脱了这个陷阱。正确的事情应该是:
$(".categoryItem").click(function(event){
$("#browseBookArea").fadeToggle(100);
var currentId = $(this).attr("id");
$.get("GetBookFromCategoryServlet",{selectedCat:currentId, currentPage:1}, function(data){
$("#browseBookArea").fadeIn(300);
$("#browseBookArea").load("Components/browseBookArea.jsp");
});
});
我只需要在GET请求之后定义一个成功的处理程序,并且成功的处理程序不能是调用该操作的div。