1.SpringMVC介绍
以前我们在写代码的时候,虽然有了mvc的模式分出三层架构,让我们能够更加清晰和方便实现业务。但还有在Servlet里存在获取请求参数、页面跳转代码冗余等一些问题,这个时候就有一些公司针对mvc框架的优化,推出一些框架,比如struts、WebWork、Spring MVC等。我个人觉得Spring MVC在数据绑定、视图解析、本地化处理及静态资源处理上都有许多不俗的表现,感觉他在很多方面都超越了struts和WebWork。他通过一套MVC的注解,让POJO成为处理请求的控制器,无需实现任何接口并支持Rest风格的URL请求。他是围绕DispatcherServlet这个核心展开的,让他负责截获请求并分派给相应的处理器处理。在面试中我们经常被问到Spring MVC的执行流程,用下图来表示他的整体结构。
2.Spring MVC的使用(注解)
第一步创建一个Controller类,在类上加上@Controller,类中的方法上面写@RequestMapping注解表示请求的路径,也可在类上面加上这个注解;方法的返回值为ModelAndView,类中创建一个ModelAndView,并注入参数,最后返回mv;下面有一个实例图展示。
3.RequestMapping映射请求
他的映射请求分为几种情况:第一种标准URL映射@RequestMapping(value=”xxx”)可以定义在Controller类上也可以定义在Controller类中的方法上;第二种ant风格映射会使用?通配一个字符,*通配0个或者多个字符, * *通配0个或多个路径;第三种占位符映射 @RequestMapping(value=”user/{userId}/{userName}”)这种请求方式跟通配符很类似,但是除了可以起到通配的作用,最精要的地方就在于可以传递参数。并且如果传递过来的参数类型和接收参数的形参类型不一致,则会自动转换;如果转换失败(例如:id传的是abc字符串,而是方法的形参定义的是Long),则会报400错误(参数列表错误);第四种限定请求方法映射@RequestMapping(value=”xxx”,method=RequestMethod.请求类型);第五种限定请求参数映射@RequestMapping(value=””,params=””)params里面可以有一个或多个参数。
4.组合注解
因为RequestMapping注解并没有说明请求方式,除了上述说过的使用method来定义之外,还可以使用组合注解,比如get请求,可以直接是GetMapping以此类推PostMapping,PutMapping等。
5.接受参数
接收请求路径中占位符的值,使用@PathVariable注解标志映射关系,使用ModelAndView方法里的addObject方法,前面加“msg”后面加上"占位符映射:"和占位符的参数就能接受。举个实例图。
6.JSON的处理
现在很多时候,我们接受到的数据都是JSON,而对于JSON数据的注解处理,首先我们引入fastjson依赖,配置mvc注解驱动,会自动注册消息转换器,通过消息转换器把Controller的返回值转换成json。使用@RequestBody用于把前端传过来的json格式参数,反向解析成对象并用参数接收。用个实例图展示
7.拦截器
前面我们说到Spring MVC的执行流程,当请求到达DispatcherServlet时,DispatcherServlet根据请求路径到HandlerMapping查询具体的Handler,从HandlerMapping返回的值是一个HandlerExecutionChain执行链,其中包含一个具体的Handler对象和Interceptors。所以我们写一个类实现HandlerInterceptor,然后在springmvc-servlet.xml配置,就可以自定义一个拦截器。如果配置多个拦截器的话,我们只需要在配置文件里添加多个拦截器的全路径名就可以了。下面是多个拦截器执行实例图。