0

我正在尝试做什么...

我想将响应消息发送回调用 jQuery AJAX 方法,然后我可以使用它来创建警告弹出消息。

我尝试使用 HttpServletResponse 方法:

   sendError(int sc, java.lang.String msg)

问题...

不幸的是,这种方法将“msg”字符串值包装在一个更大的 HTML 字符串中——这显然是为了用作独立错误页面的内容。

--我希望只获取消息字符串本身(即,使用 jquery 对象方法 - 例如,“jqXHR”)。

我应该如何最好地做到这一点?(即,在没有 HTML“包装器”的情况下将消息返回到成功/失败方法)

...java服务器片段...

    -
    -
    -
        private List<MyDTO> performSearch(HttpSession session, HttpServletResponse resp)
        {
            try
            {
                // (code to inspect searchString, etc.)
                //...forcing error for this test...
                throw new Exception("bad request yaddah...yaddah...yaddah...");
            }
            catch (Exception e)
            {
                try
                {
                    resp.sendError(HttpServletResponse.SC_NOT_FOUND, e.getMessage());
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
            }

            return null;
        }
    -
    -
    -

... JQuery 客户端片段...

    -
    -
    -
                $.ajax({
                    type: "POST",
                    url: searchurl,                            
                    data: "searchString=" + searchString,
                    async: true,
                    success: function(jqXHR) {
                        alert("success");
                    },
                    error: function(jqXHR) {
                        alert("Error - bad search string used:" + jqXHR.responseText);
                    }
                });  
    -
    -
    -

注意: 执行以下操作似乎可以正常工作,但是,我想知道是否有更好的方法将简单的消息字符串发送回 ajax 调用...

    -
    -
    -       
        private List<MyDTO> performSearch(HttpSession session, HttpServletResponse resp)
        {
            try
            {
                // (inspect searchString, etc.)
                //...forcing error for this test...
                throw new Exception("bad request yaddah...yaddah...yaddah...");
            }
            catch (Exception e)
            {
                try
                {
                    resp.setStatus(HttpServletResponse.SC_NOT_ACCEPTABLE);
                    resp.getWriter().write(e.getMessage());
                    resp.flushBuffer();
                }
                catch (Exception ex)
                {
                    e.printStackTrace();
                }
            }

            return null;
        }       
    -
    -
    -

完成我想做的最简单/最好的方法是什么?

谢谢你的帮助!!!

4

2 回答 2

1

我不知道 3 年后你是否还需要答案,但我正在做一个项目,需要做同样的事情。我使用ResponseEntity作为控制器中方法的返回类型。它有一个 HttpStatus 代码(它将触发 jQuery/AJAX 的成功/错误函数)和一个主体(没有包装器)。您可以像这样重写您的控制器方法:

控制器

private ResponseEntity performSearch(HttpSession session)
    {
        try
        {
            // (inspect searchString, etc.)
            //...forcing error for this test...
            throw new Exception("bad request yaddah...yaddah...yaddah...");
        }
        catch (Exception e)
        {
            return new ResponseEntity(e.getMessage, HttpStatus.BAD_REQUEST);
        }

        return null;
    }       

jQuery/AJAX

您的代码没问题,只需调用jqXHR.responseText(). 另外,success 函数的签名是(data, textStatus, jqXHR)(jqXHR 排在第三位,而不是第一位)。

响应实体

ResponseEntity 可以通过多种方式返回:

//Equivalent
return new ResponseEntity(someString, HttpStatus.OK);
return ResponseEntity.ok(someString);
return ResponseEntity.ok().body(someString);

ResponseEntity 使用泛型,例如ResponseEntity<T>. 因此,如果您的方法返回 List 您可以使用private ReponseEntity<List<MyDTO>>.

希望这仍然可以帮助您。

于 2016-08-19T14:20:14.057 回答
0

只要您可以从服务器端返回值,您的 jQuery POST 请求就是成功的。即使你在服务器上得到它,你也不会在你的 jquery 中得到错误(必然)。

您应该区分服务器端对客户端的响应中的错误和成功。无论哪种方式,Jquery 都会执行“成功”回调!

于 2013-06-17T23:27:05.453 回答