对 jsp 的 Ajax 调用和 jsp 重定向到进一步的 jsp

Posted

技术标签:

【中文标题】对 jsp 的 Ajax 调用和 jsp 重定向到进一步的 jsp【英文标题】:Ajax call to jsp and jsp redirecting to further jsp 【发布时间】:2014-06-06 15:02:47 【问题描述】:

我正在对一个 jsp 页面进行 ajax 调用,该页面又根据该 jsp 文件中计算的标志变量的值进行重定向。

ajax 调用是这样的:

$.ajax(
            url: 'uploadwebcamimage.jsp',
            type: "POST",

            data: 
                encodeimg: dataUrl,
                OwnerId: document.Clickpictures.OwnerId.value,
                OwnerPhone: document.Clickpictures.OwnerPhone.value,
                mobilepass: document.Clickpictures.mobilepass.value,
                emailpass: document.Clickpictures.emailpass.value,
                mypassword: document.Clickpictures.mypassword.value,
                mygroupuserid: document.Clickpictures.mygroupuserid.value

            ,
            error : function() 
                alert('Error'); 
            ,
            success: function(msg)
                //alert((msg));
                    if(msg.indexOf("true")>=0)
                    
                        //how to get grouplist 
                        location.href="site_index_groupadmin.jsp?res1="+grouplist;  
                    
                    else
                        alert("UNSUCCESSFUL");
                    
            
        );

在jsp中我做了这样的事情:

<%
    ArrayList<String> list = new ArrayList<String>();

     String query="Select GNAME from tbGroup";
     ps1 = con.prepareStatement(query);
     rs1=ps1.executeQuery();
     while(rs1.next())
         list.add(rs1.getString("GNAME"));
      
    //How can i send this list also to my ajax call.Please help

    if(flag==true)

    out.println(flag);

    

    else if(flag==false)

    out.println(flag);


    %>

但它没有重定向到其他页面。请帮助

【问题讨论】:

使用 jquery 获取表单字段值或使用 serialize() 并且不要在其他 jsp 中使用 sendRedirect(),而是在您进行 ajax 调用的同一页面中重定向。 @Rembo 虽然我解决了重定向问题。问题现在是我需要发送一个数组列表作为请求参数。请参阅我编辑的帖子 【参考方案1】:

当您通过 AJAX 调用 jsp 时,根据定义,无论服务器发送的标头如何,您都会停留在同一页面上。

如果你想改变页面,你必须使用javascript,在$.ajax(..)调用的成功处理函数中。

您可以读取Location 响应标头并将window.location.href 设置为该值。 See here for other options.

通过调用HttpServletResponse#getWriter 获取PrintWriter 对象并编写您的字符串。

response.getWriter().write("isSuccess: true");

现在在 jsp 中检查 isSuccess 是真还是假并使用 window.location.href

【讨论】:

实际上我也在尝试这样做。我试图在我的 ajax 调用中获取该标志值,然后做出决定。可以做到吗? 你只需用一些变量值写回响应,然后你就可以确定 请给我一段代码来做同样的事情。实际上我想要的是如果标志为真则重定向到其他页面否则留在同一页面上(这里同一页面是正在制作的页面ajax 调用)。 我没有得到你。请提供ajax调用的代码 请在帖子中查看我的编辑。我解决了重定向问题。但面临另一个问题。请帮助【参考方案2】:

如何将此列表也发送到我的 ajax 调用。

使用 Gson 或任何其他 json 库来编写 json 响应:

<%@ page language="java" contentType="application/json; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
  //after generating your list

  Gson gson = new Gson();
  JsonObject root = new JsonObject();
  root.addProperty("flag", flag); //add flag
  root.addProperty("list", gson.toJson(list)); //add list

  out.println(gson.toJson(root));
  out.flush();
%>

并在 ajax 中渲染列表,如:

$.ajax(
        url: 'uploadwebcamimage.jsp',
        type: "POST",
        dataType: 'json', //set dataType as json i.e. response data format 
        data: 
            encodeimg: dataUrl,
            OwnerId: document.Clickpictures.OwnerId.value,
            OwnerPhone: document.Clickpictures.OwnerPhone.value,
            mobilepass: document.Clickpictures.mobilepass.value,
            emailpass: document.Clickpictures.emailpass.value,
            mypassword: document.Clickpictures.mypassword.value,
            mygroupuserid: document.Clickpictures.mygroupuserid.value

        ,
        error : function(jqXHR, textStatus, errorThrown) 
            alert(textStatus+' : '+ errorThrown);
        ,
        success: function(response)
           alert(response.flag);
           $.each(response.list, function(key,value)
               alert(value);
           );
        
    );

编辑:

根据您的评论:

创建一个servlet而不是在jsp中编写java代码,并将java代码移动到servlet,例如:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 

    ArrayList<String> list = new ArrayList<String>();

    String query="Select GNAME from tbGroup";
    ps1 = con.prepareStatement(query);
    rs1=ps1.executeQuery();

    while(rs1.next())
         list.add(rs1.getString("GNAME"));
    

    //set flag
    boolean flag = true;

    Gson gson = new Gson();

   response.setContentType("application/json");
   response.setCharacterEncoding("UTF-8");          
   PrintWriter out = response.getWriter();    

   out.write(gson.toJson(new ResponseResult(flag, list)));     
   out.flush();

和 ResponseResult 类看起来像:

public class ResponseResult 

    private boolean flag;
    private List<String> list;

    public ResponseResult()

    public ResponseResult(boolean flag, List<String> list) 
        super();
        this.flag = flag;
        this.list = list;
    

       //getters and setters

如果您想将列表发送到任何其他 jsp,那么在 servlet 中执行以下操作:

如果您转发,则使用请求:

   request.setAttribute("list", list);
   RequestDispatcher dispatcher = request.getRequestDispatcher("pagename.jsp");
   dispatcher.forward(request, response);

如果您进行重定向,则备用正在使用会话,然后像:

//add list to session
request.getSession().setAttribute("list",list);
//get it back in another page like
List<String>myListObject=(List<String>) request.getSession().getAttribute("list");

【讨论】:

我需要将此列表传递给此 jsp 页面。我如何发送它?另外,我将如何在该 site_index_groupadmin 页面上检索它?如果标志设置为 true,我还需要执行此操作。所以在你的代码中也要提到这一点。所以我请求你更新你的 ajax 调用成功部分 @user3522121 如果你想发送列表到site_index_groupadmin.jsp 然后使用request.setAttribute("list", list); 然后转发它。或者更好地使用 servlet 而不是 jsp。 也在这部分:root.addProperty("list", list);它给出了一个错误,找不到适合 addProperty(java.lang.String,java.util.ArrayList 的方法 并在另一端检索它。Will ArrayList list1 = (ArrayList)request.getAttribute("list");工作?在哪里写这个:request.setAttribute("list", list);?我必须用ajax写吗? 该错误已被删除,问题仅出在 ajax 调用端

以上是关于对 jsp 的 Ajax 调用和 jsp 重定向到进一步的 jsp的主要内容,如果未能解决你的问题,请参考以下文章

HTTP中的重定向和请求转发的区别

成功的 ajax 发布到 Spring Security 不会重定向

转发与重定向

ajax跳转到新的jsp页面(局部刷新)

JSP如何实现网页重定向

JSP:在JSP中重定向到xhtml