SPRINGMVC 后台控制器的同一个方法 可以使用两种不同的参数,SPRINGMVC 如何处理这两组不同的参数?

eisldkw 2020-09-22 11:58:20
同一个方法queryList 可以有两种参数 ,代码如下:

一、参数绑定:包装类
@RequestMapping(value="/queryList")
public String queryList(Model model,Fruit fruit) {
System.out.println("name:"+fruit.getName());
}
url:
http://localhost:8080/SpringMVC_test/queryList.action?name=%E5%8D%A7%E6%A7%BD
输出:
name:卧槽
name是Fruit包装类的属性名,这种类型会被SpringMVC的处理器适配器解析,会创建出具体的实体类,并将相关的属性值通过set方法绑定到包装类中,所以成功。

二、传入HttpServletRequest和HttpServletResponse,如:
@RequestMapping(value="/queryList")
public String queryList( HttpServletRequest request, HttpServletResponse response) {
System.out.println("name:"+request.getParameter("name"));
return "/fruitsList";
}
url:
http://localhost:8080/SpringMVC_test/queryList.action?name=%E5%8D%A7%E6%A7%BD
输出:
***
name:卧槽

问题如下:

为什么同一个方法 queryList ,它的参数既可以是 HttpServletRequest request, HttpServletResponse response 又可以是 Model model,Fruit fruit ,SPRINGMVC 接收到这两组参数,是如何区分的,又怎么能把这些参数对照到正确的 变量或对象中
...全文
600 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_39936465 2020-09-22
  • 打赏
  • 举报
回复
引用 10 楼 eisldkw 的回复:
[quote=引用 9 楼 qq_39936465 的回复:] 非常感谢。请问什么是模型类?
MVC = Model+View +Control Model 就是模型类,也可以叫数据模型,就是把特定数据封装在Model类中,使用更方便,耦合性更强。
cnblog2017 2020-09-22
  • 打赏
  • 举报
回复
springboot 参数解析器 你可以百度学习一下,spring 启动后就帮我们注册了一堆的参数解析器。比如: RequestMappingHandlerAdapter类的方法

private List<HandlerMethodArgumentResolver> getDefaultArgumentResolvers() {
    List<HandlerMethodArgumentResolver> resolvers = new ArrayList();
    resolvers.add(new RequestParamMethodArgumentResolver(this.getBeanFactory(), false));
    resolvers.add(new RequestParamMapMethodArgumentResolver());
    resolvers.add(new PathVariableMethodArgumentResolver());
    resolvers.add(new PathVariableMapMethodArgumentResolver());
    resolvers.add(new MatrixVariableMethodArgumentResolver());
    resolvers.add(new MatrixVariableMapMethodArgumentResolver());
    resolvers.add(new ServletModelAttributeMethodProcessor(false));
    resolvers.add(new RequestResponseBodyMethodProcessor(this.getMessageConverters(), this.requestResponseBodyAdvice));
    resolvers.add(new RequestPartMethodArgumentResolver(this.getMessageConverters(), this.requestResponseBodyAdvice));
    resolvers.add(new RequestHeaderMethodArgumentResolver(this.getBeanFactory()));
    resolvers.add(new RequestHeaderMapMethodArgumentResolver());
    resolvers.add(new ServletCookieValueMethodArgumentResolver(this.getBeanFactory()));
    resolvers.add(new ExpressionValueMethodArgumentResolver(this.getBeanFactory()));
    resolvers.add(new SessionAttributeMethodArgumentResolver());
    resolvers.add(new RequestAttributeMethodArgumentResolver());
    resolvers.add(new ServletRequestMethodArgumentResolver());
    resolvers.add(new ServletResponseMethodArgumentResolver());
    resolvers.add(new HttpEntityMethodProcessor(this.getMessageConverters(), this.requestResponseBodyAdvice));
    resolvers.add(new RedirectAttributesMethodArgumentResolver());
    resolvers.add(new ModelMethodProcessor());
    resolvers.add(new MapMethodProcessor());
    resolvers.add(new ErrorsMethodArgumentResolver());
    resolvers.add(new SessionStatusMethodArgumentResolver());
    resolvers.add(new UriComponentsBuilderMethodArgumentResolver());
    if (this.getCustomArgumentResolvers() != null) {
        resolvers.addAll(this.getCustomArgumentResolvers());
    }
    resolvers.add(new RequestParamMethodArgumentResolver(this.getBeanFactory(), true));
    resolvers.add(new ServletModelAttributeMethodProcessor(true));
    return resolvers;
}
这里有基于注解的,如 PathVariable,基于类型的如request,response。然后你在解析器里打个断点调试一下,就明白了
eisldkw 2020-09-22
  • 打赏
  • 举报
回复
引用 9 楼 qq_39936465 的回复:
[quote=引用 8 楼 eisldkw 的回复:][quote=引用 2 楼 qq_39936465 的回复:]打个比方你从获取一个值为10,你既可以把10当作int 参数,也可以把10当作 String 参数来用。
非常感谢。请问,这个 queryList的参数中 是不是 (Model model,Fruit fruit , HttpServletRequest request, HttpServletResponse response) 这4个参数 实际上是都有的? [/quote] Model是一个模型类,在你的例子里你可以理解成把/queryList页面的HttpServletRequest和HttpServletResponse的数据,封装在Model类型中生成一个特定的bean方便你使用,当然你也可以直接用java给用的HttpServletRequest 直接调用,所以使用那个你都可以选择。[/quote] 非常感谢。请问什么是模型类?
qq_39936465 2020-09-22
  • 打赏
  • 举报
回复
引用 8 楼 eisldkw 的回复:
[quote=引用 2 楼 qq_39936465 的回复:]打个比方你从获取一个值为10,你既可以把10当作int 参数,也可以把10当作 String 参数来用。
非常感谢。请问,这个 queryList的参数中 是不是 (Model model,Fruit fruit , HttpServletRequest request, HttpServletResponse response) 这4个参数 实际上是都有的? [/quote] Model是一个模型类,在你的例子里你可以理解成把/queryList页面的HttpServletRequest和HttpServletResponse的数据,封装在Model类型中生成一个特定的bean方便你使用,当然你也可以直接用java给用的HttpServletRequest 直接调用,所以使用那个你都可以选择。
eisldkw 2020-09-22
  • 打赏
  • 举报
回复
引用 2 楼 qq_39936465 的回复:
打个比方你从获取一个值为10,你既可以把10当作int 参数,也可以把10当作 String 参数来用。
非常感谢。请问,这个 queryList的参数中 是不是 (Model model,Fruit fruit , HttpServletRequest request, HttpServletResponse response) 这4个参数 实际上是都有的?
0大丸子0 2020-09-22
  • 打赏
  • 举报
回复
这个会报异常的,相同@RequestMapping(value="/queryList") Error creating requestMappingHandlerMapping
eisldkw 2020-09-22
  • 打赏
  • 举报
回复
引用 2 楼 qq_39936465 的回复:
打个比方你从获取一个值为10,你既可以把10当作int 参数,也可以把10当作 String 参数来用。
非常感谢。
qq_39936465 2020-09-22
  • 打赏
  • 举报
回复
你也可以用自己写的类继承接口,来实现数据的传输。不要被表象所迷惑了,本质就是方法传参,没什么很深的东西。
qq_39936465 2020-09-22
  • 打赏
  • 举报
回复
引用 3 楼 eisldkw 的回复:
[quote=引用 2 楼 qq_39936465 的回复:]打个比方你从获取一个值为10,你既可以把10当作int 参数,也可以把10当作 String 参数来用。
非常感谢。但是你太年轻了。[/quote] 只是打个比方而已,现在很多都是有框架实现的,你如果研究源码就会发现底层实现的方法其实都是一样的,不过是套了马甲而已。
eisldkw 2020-09-22
  • 打赏
  • 举报
回复
引用 2 楼 qq_39936465 的回复:
打个比方你从获取一个值为10,你既可以把10当作int 参数,也可以把10当作 String 参数来用。


非常感谢。但是你太年轻了。
qq_39936465 2020-09-22
  • 打赏
  • 举报
回复
打个比方你从获取一个值为10,你既可以把10当作int 参数,也可以把10当作 String 参数来用。
qq_39936465 2020-09-22
  • 打赏
  • 举报
回复
引用 楼主 eisldkw 的回复:
同一个方法queryList 可以有两种参数 ,代码如下: 为什么同一个方法 queryList ,它的参数既可以是 HttpServletRequest request, HttpServletResponse response 又可以是 Model model,Fruit fruit ,SPRINGMVC 接收到这两组参数,是如何区分的,又怎么能把这些参数对照到正确的 变量或对象中[/color]
方法参数是在类实例化时就申明时就确定的,这个同名方法不同参数这个很正常。因为本质上参数都是/queryList这个页面获取,只不过提取数据的参数类型不同而已。

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧