请理解我的英语不好。
我使用 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 的 View 。
例如,以下源使用 ajax/add_server.jsp 作为 View 。
@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);
}
最佳答案
@RequestParam
的默认值是必填项,如果没有则抛出异常。另一方面,对于 getParameter
,它只是将 null 传递给下一个方法。因此,如果有时您没有提供所有三个参数,那么更改将无法正常工作。
编辑:
关于您发布的附加信息: 当 void 方法将 HttpServletResponse 作为参数时,AnnotationMethodHandlerAdapter 内部有一些特殊处理会更改路由。基本上它假定,由于您接受了响应,因此您正在处理需要生成的任何输出,并且它会禁用默认 View 分辨率。这将导致服务器简单地回复 200 和一个空的响应主体。
如果您有一个 void 方法,但没有读取 HttpResponse 对象,它将恢复为默认 View 分辨率。这可能导致生成错误,因为我怀疑您在任何地方都有一个名为 add_server 的 .jsp 文件! :) 由于您的服务调用在方法返回和 Spring 尝试查看解析之前完成并提交,因此请求仍然“有效”。 ajax 调用最终转到错误处理程序而不是成功处理程序。
tl;dr 有时带注释的 Controller “魔法”有点太神奇了:)
关于java - Spring @RequestParam 和 req.getParameter ("xx") 的工作方式不同吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10327636/