我目前正在学习jsp/servlet,并试图创建一个在线书店。使用jquery,我能够将get请求发送到servlet。成功后,它将用browsebookarea.jsp重新加载browsebookarea div。我不明白的是,这个过程在我的glashfish服务器上导致无限循环(它发生在browsebooktag.java中)。我在那里放了一个系统。
是否有其他方法可以将从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>

我的眉毛袋:
 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++;
        }
    }

最佳答案

我找到了罪犯。它是:

$("#browseBookArea").ajaxSuccess(function(){
         $(this).show(300);
         $(this).load("Components/browseBookArea.jsp");
    });

坏,坏,坏。这说明我不知道success方法调用的含义。我刚刚意识到,如果每次都让#browseBookAreadiv加载,就会导致一个成功的操作,然后它会再次执行,最终导致递归。我终于摆脱了这个陷阱。正确的做法应该是:
$(".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。

07-28 06:33