什么是SpringMVC?
SpringMVC是Spring的一个模块,是基于Java实现了MVC设计模式的一个轻量级WEB框架,该框架把模型model,视图view,控制器controller分离,实现了职责解耦(前端页面的展示,业务数据的处理),简单开发,易上手。
MVC设计模式的好处:
1. 分层设计,实现了业务系统各个组件之间的解耦,有利于业务系统的可扩展性,可维护性。
2. 有利于系统的并行开发(前后端分离),提升开发效率。
SpringMVC的主要组件有哪些?
1. 前端控制器DispatchServlet:接收请求,响应结果,相当于转发器,有了DispatchServlet就减少了其他组件之间的耦合度;
(⚠️Spring的MVC框架是围绕DispatchServlet来设计的,它用来处理所有的http请求和响应)
2. 处理器映射器HandlerMapping:根据前端请求的URL来查找Handler;
3. 处理器适配器HandlerAdater
4. 处理器Handler:需要程序员开发(Controller,后端控制器逻辑处理)
5. 视图解析器ViewResolver:进行视图解析,根据视图逻辑名解析成真正的视图view;
6. 视图View:需要程序员开发(例如JSP),View是一个接口,它的实现类支持不同的视图类型(JSP,Freemarker,PDF等)
SpringMVC框架的控制器如何理解?
控制器提供一个访问应用程序的行为,此行为通常通过服务接口实现。控制器解析用户输入并将其转换成一个由视图呈现给用户的模型。Spring用一个非常抽象的方式实现了一个控制层,允许用户创建多种用途的控制器。
SpringMVC的控制器是不是单例模式,如果是,有什么问题,怎么解决?
是单例模式,在多线程访问的时候,有线程安全问题,不要用同步,会影响性能,解决方案就是控制器里面不能写字段。
SpringMVC的工作原理?
1. 客户端发送请求到DispatcherServlet
2. DispatcherServlet查询handlerMapping找到处理请求的Controller
3. Controller调用业务逻辑后,返回ModelAndView
4. DispatcherServlet查询ModelAndView,找到指定视图
5. 视图将结果返回到客户端
SpringMVC的工作流程?
1. 用户发送请求至前端控制器DispatcherServlet。
2. DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3. 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4. DispatcherServlet调用HandlerAdapter处理器适配器。
5. HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
6. Controller执行完成返回ModelAndView。
7. HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
8. DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
9. ViewReslover解析后返回具体View。
10. DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
11. DispatcherServlet响应用户。
SpringMVC的优点
1. 可以支持各种视图技术,不仅仅局限于JSP;
2. 与Spring框架集成(例如IOC容器,AOP等);
3. 清晰的角色分配:前端控制器(DispatchServlet)请求到处理器映射器(HandlerMapping)处理器适配器(HandlerAdapter)视图解析器(ViewResolver);
4. 支持各种请求资源的映射策略;
5. 提供拦截器机制,可以方便的对请求进行拦截处理;
6. 提供异常机制,可以方便的异常做同一处理。
注解原理是什么?
注解本质上是一个继承了Annotation的特殊接口,其具体实现类是java运行时生成的动态代理类。
我们通过反射获取注解时,返回的是java运行时生成的动态代理对象。通过代理对象调用自定义注解的方法会最终调用AnnotationInvocationHandler的invoke方法。该方法会从memberValues这个Map中索引出对应的值,而memberValues的来源是java的常量池。
SpringMVC常用的注解有哪些?
1. @RequestMapping:用于处理请求URL映射的注解,可用于类和方法上。用于类上,则表示类中的所有响应请求的方法都是以该地址作为父路径;
2.参数注解:
@RequestBody:注解实现接收http请求的json数据,将json数据转换成java对象;
@PathVariable:从路径中获取传参参数信息;
@RequestParam:接收静态URL请求入参;
3. @ResponseBody:注解实现将controller方法返回对象转换为json对象响应给客户;
(⚠️可以使用@ResponseBody注解或者使用包含@ResponseBody注解的@RestController注解来返回json格式)
@Controller
@RequestMapping(value="/user")
public class testController{
@RequestMapping(value="/get",method=RequestMethod.GET)
@ResponseBody
public User getUserinfo(@RequestBody User param){}
}
4. @Controller:控制器Controller负责处理由DispatchServlet分发的请求,它把用户请求的数据经过业务处理层处理后封装成一个model返回给对应的view进行展示。单单使用@Controller注解还不能说明是一个控制类,因为Spring还不认识它,那么要如何做才能使Spring认识它呢?
这个时候就需要把这个控制器交给Spring来管理,有两种方式:
(1)在Springmvc的配置文件中定义myController的bean对象
(2)在Springmvc的配置文件中告诉Spring该到哪里去找标记为@Controller的Controller控制器。
SpringMVC怎么设定重定向和转发的?
1. 转发:在返回值前面加"forward",例如:"forward:user.do?method4"
2.重定向:在返回值前面加上"redirect",例如:"redirect:http://www.baidu.com"
SpringMVC的异常处理?
可以把异常抛给Spring框架,由Spring框架处理,我们只需要配置简单的异常处理器,在异常处理器中添加视图页面即可。
如何拦截GET方法提交的请求?
可以在@RequestMapping注解里面配置@RequestMethod.GET。
怎么在方法里面的到Request或者session?
直接在方法的形参中声明httpRequestServlet,SpringMVC就会自动把request对象传入
SpringMVC中函数的返回值是什么?
返回值可以有很多类型,有String,ModelAndView。ModelAndView类把视图和数据都合并在一起的,但一般用String比较好
SpringMVC用什么对象从后台向前台传递数据的?
通过ModelMap对象,可以在这个对象里面调用put方法,把对象加到里面,前台就可以通过el表达式拿到
怎样把ModelMap里面的数据放入session里面?
可以在类上面加上@SessionAttributes注解,里面包含的字符串就是要放入session里面的key。
SpringMVC拦截器和Filter过滤器有什么区别?
1. 功能相同:拦截器和Filter都能实现相应的功能,谁也不比谁强
2. 容器不同:拦截器构建在SpringMVC体系中,Filter过滤器构建在Servlet容器之上
3. 使用便利性不同;拦截器提供了三个方法,分别在不同的时机执行,过滤器仅提供一个方法,当然也能实现拦截器的执行时机的效果,就是比较麻烦一些。