SpringMVC流程解析及常见的参数处理

SpringMVC流程解析及常见的参数处理

Spring的web框架围绕DispatcherServlet设计。 DispatcherServlet的作用是将请求分发到不同的处理器。从Spring 2.5开始,使用Java 5或者以上版本的用户可以采用基于注解的controller声明方式。

Spring MVC框架像许多其他MVC框架一样, 以请求为驱动 , 围绕一个中心Servlet分派请求及提供其他功能,DispatcherServlet是一个实际的Servlet (它继承自HttpServlet 基类)。

SpringMVC流程图如下:
在这里插入图片描述
当发起请求时被前置的控制器拦截到请求,根据请求参数生成代理请求,找到请求对应的实际控制器,控制器处理请求,创建数据模型,访问数据库,将模型响应给中心控制器,控制器使用模型与视图渲染视图结果,将结果返回给中心控制器,再将结果返回给请求者。

图为SpringMVC的一个较完整的流程图,实线表示SpringMVC框架提供的技术,不需要开发者实现,虚线表示需要开发者实现。

简要分析执行流程

  1. DispatcherServlet表示前置控制器,是整个SpringMVC的控制中心。用户发出请求,DispatcherServlet接收请求并拦截请求。
  • 我们假设请求的url为 : http://localhost:8080/SpringMVC/h1

  • 如上url拆分成三部分:

  • http://localhost:8080服务器域名

  • SpringMVC部署在服务器上的web站点

  • hello表示控制器

  • 通过分析,如上url表示为:请求位于服务器localhost:8080上的SpringMVC站点的hello控制器。

  1. HandlerMapping为处理器映射。DispatcherServlet调用HandlerMapping,HandlerMapping根据请求url查找Handler。
  2. HandlerExecution表示具体的Handler,其主要作用是根据url查找控制器,如上url被查找控制器为:hello。
  3. HandlerExecution将解析后的信息传递给DispatcherServlet,如解析控制器映射等。
  4. HandlerAdapter表示处理器适配器,其按照特定的规则去执行Handler。
  5. Handler让具体的Controller执行。
  6. Controller将具体的执行信息返回给HandlerAdapter,如ModelAndView。
  7. HandlerAdapter将视图逻辑名或模型传递给DispatcherServlet。
  8. DispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传递的逻辑视图名。
  9. 视图解析器将解析的逻辑视图名传给DispatcherServlet。
  10. DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图。
  11. 最终视图呈现给用户。
参数处理
  1. 提交的域名称和处理方法的参数名一致

    ​ 处理方案,直接写对应的参数

    @RequestMapping("/hello")
    public String hello(String name){
        System.out.println(name);
        return "hello";
    }
    
  2. 提交的域名称和处理方法的参数名不一致

    处理方案:使用@RequestParam注解

    //@RequestParam("username") : username提交的域的名称 .
    //http://localhost:8080/hello?username=kuangshen
    @RequestMapping("/hello")
    public String hello(@RequestParam("username") String name){
        System.out.println(name);
        return "hello";
    }
    
  3. 提交的是一个对象

    处理方案:要求提交的表单域和对象的属性名一致 , 参数使用对象即可

    说明:如果使用对象的话,前端传递的参数名和对象名必须一致,否则就是null。

    //URL请求:http://localhost:8080/mvc04/user?name=kuangshen&id=1&age=15
    @RequestMapping("/user")
    public String user(User user){
        System.out.println(user);
        return "hello";
    }
    

以上是前端传的值如何接受,那后端的数据如何显示到前端呢?

第一种 : 通过ModelAndView

第二种 : 通过ModelMap

第三种 : 通过Model

Model,ModelMap,ModelAndView三者的区别是:

Model 只有寥寥几个方法只适合用于储存数据,简化了新手对于Model对象的操作和理解;

ModelMap 继承了 LinkedMap ,除了实现了自身的一些方法,同样的继承 LinkedMap 的方法和特性;

ModelAndView 可以在储存数据的同时,可以进行设置返回的逻辑视图,进行控制展示层的跳转。

RequestParam和PathVariable的区别:

相同点:

这两个都是用来处理前端传递过来的请求参数

不同点:

不同的是RequestParam处理的是请求参数,而PathVariable处理的是路径变量,

这样说更容易理解,

RequestParam是将对应请求路径下的请求参数值映射到处理器参数上,而PathVariable是将请求路径变量的值映射到处理器参数上

@RequestParam和@RequestBody的区别**:**

在GET请求中,不能使用@RequestBody。

在POST请求,可以使用@RequestBody和@RequestParam,但是如果使用@RequestBody,对于参数转化的配置必须统一(就是前后端的参数名一致)

@RequestParam可以接受简单类型的属性,也可以接受对象类型。

GET请求中,因为没有HttpEntity,所以@RequestBody并不适用。

POST请求中,通过HttpEntity传递的参数,必须要在请求头中声明数据的类型Content-Type,SpringMVC通过使用HandlerAdapter 配置的HttpMessageConverters来解析HttpEntity中的数据,然后绑定到相应的bean上。

注意1:@RequestParam注解中参数age设置了required=false,如果不设置,默认required=true。当required为true时,请求中必须要有age参数,否则会失败;当required为false时,请求中可以没有age参数,请求也不会失败,这种情况可以防止请求中忘记传入某个参数,不至于请求失败。

注意2:用@RequestParam注解从请求参数中映射到控制器中的参数时,控制器的参数一定要用对象类型或简单类型的包装类。例如@RequestParam(value=“age”) Integer age1)不能写成@RequestParam(value=“age”) int age1),不能用简单int类型去接收请求中的整数。因为,若请求中的对象为空,则int类型的参数不能接收空对象,int类型的参数必须要有一个默认值的。

若想用简单类型去接收请求中的值,需要赋值一个默认值,写成如下的形式:@RequestParam(value = “age”, required = false, defaultValue = “0”) int age1)

注意3:对于我们对接前端时候我们需要注意就是表单提交之类我们要用@RequestParam接收,

对于json格式提交的数据,我们需要用@RequestBody接收,

根据我们之前接收数据遇到的问题,当我们使用ajax发送post请求,后台接收数据时候我们要用@RequestParam接收,因为它的Content-Type就是用的表单提交的,

对于axios的post请求我们需要用@RequestBody接收,因为它内部处理时候Content-Type指定是application/json类型,所以我们需要注意,这些都是默认情况下,我们ajax原生发请求也可以自己指定头,所以根据情况选择

tent-Type就是用的表单提交的,

对于axios的post请求我们需要用@RequestBody接收,因为它内部处理时候Content-Type指定是application/json类型,所以我们需要注意,这些都是默认情况下,我们ajax原生发请求也可以自己指定头,所以根据情况选择

若有不同意见,欢迎来到评论区留言交流!!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值