4

请理解我的英语不好。

我使用 Spring MVC 并替换了这个源

@RequestMapping("/ajax/add_server")
public void addServer(HttpServletRequest request, HttpServletResponse response) throws Exception {
    String host = request.getParameter("host");
    String port = request.getParameter("port");
    String state = request.getParameter("state");

    serverService.addServer(host, port, state);
}

@RequestMapping("/ajax/add_server")
public void addServer(
        @RequestParam("host") String host,
        @RequestParam("port") String port,
        @RequestParam("state") String state) throws Exception {

    serverService.addServer(host, port, state);

}

addServer() 方法由 AJAX 调用。

在使用 req.getParameter() 的情况下,我的 ajax 加载图像消失了,但是当我使用 @RequestParam 时图像没有消失。

我猜 Ajax XMLRequest Object 没有得到任何成功的 MSG。

但我不知道为什么,这正常吗?

额外发现!!

@RequestMapping("/ajax/add_server")
    public void addServer(
            @RequestParam("host") String host,
            @RequestParam("port") String port,
            @RequestParam("state") String state,
            HttpServletResponse response) throws Exception {

        serverService.addServer(host, port, state);
    }

我添加了对参数的响应,然后图像消失了。我不知道为什么。

我把这个留作我的参考。

具有 void 返回类型的 Controller 方法使用 URI-BASED VIEW。

例如,以下源代码使用 ajax/add_server.jsp 作为视图。

@RequestMapping("/ajax/add_server")
    public void addServer(
            @RequestParam("host") String host,
            @RequestParam("port") String port,
            @RequestParam("state") String state) throws Exception {

        serverService.addServer(host, port, state);
    }
4

1 回答 1

4

的默认@RequestParam值是该值是必需的,如果没有则抛出异常。另一方面,getParameter它只是将一个空值传递给下一个方法。因此,如果有时您没有提供所有三个参数,那么更改将无法正常工作。

编辑:

关于您发布的其他信息:当 void 方法将 HttpServletResponse 作为参数时,AnnotationMethodHandlerAdapter 内部有一些特殊处理会更改路由。基本上,它假定由于您接受了响应,您正在处理需要生成的任何输出,并且它会禁用默认视图分辨率。这将导致服务器简单地使用空响应正文回复 200。

如果您有一个 void 方法,但没有读取 HttpResponse 对象,它会恢复为默认视图分辨率。这可能导致生成错误,因为我怀疑您在任何地方都有一个名为 add_server 的 .jsp 文件!:) 由于您的服务调用在方法返回和 Spring 尝试视图解析之前完成并提交,因此请求基础“有效”。ajax 调用最终会转到错误处理程序而不是成功处理程序。

tl;博士有时带注释的控制器“魔术”有点太神奇了:)

于 2012-04-26T06:03:03.580 回答