【问题标题】:Does Spring @RequestParam and req.getParameter("xx") work differently..?Spring @RequestParam 和 req.getParameter("xx") 的工作方式是否不同..?
【发布时间】:2012-05-06 20:15:51
【问题描述】:

请理解我的英语不好。

我使用 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 对象没有得到任何成功的 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);
    }

【问题讨论】:

  • 你的意思是你的 ajax 图像在 request.getParam() 的情况下丢失了吗??
  • 不,我的意思是加载图像出现,并在收到成功消息后消失。但是当我使用@RequestParam 时,它并没有消失。
  • 其实这一切都和服务端代码有关,不影响图片显示或隐藏,但是这些都是用js函数处理的,可能是调用不成功,这就是js的原因功能失败。
  • 是的,图片与Javascript更相关,但是javascript从服务器获取成功代码。

标签: java ajax spring


【解决方案1】:

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

编辑:

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

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

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

【讨论】:

  • 但是,我没有看到任何错误消息,除了图像之外,处理结果是相同的。
猜你喜欢
  • 1970-01-01
  • 2013-08-25
  • 2022-01-13
  • 2015-06-07
  • 1970-01-01
  • 2015-08-12
  • 1970-01-01
  • 1970-01-01
  • 2021-10-14
相关资源
最近更新 更多