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 接收到这两组参数,是如何区分的,又怎么能把这些参数对照到正确的 变量或对象中
...全文
608 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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,122

社区成员

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

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