Spring MVC 是 Spring 提供的一个基于 MVC 设计模式的轻量级 Web 开发框架,本质上相当于 Servlet。
SpringMVC
Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把模型-视图-控制器分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰的几部分,简化开发,减少出错,方便组内开发人员之间的配合。
核心组件
前端控制器 DispatcherServlet(不需要程序员开发):处理所有的HTTP请求和响应,减少了其它组件之间的耦合度。
处理器映射器HandlerMapping(不需要程序员开发):根据请求的URL来查找Handler
处理器适配器HandlerAdapter
处理器Handler(需要程序员开发)
视图解析器 ViewResolver(不需要程序员开发):进行视图的解析,根据视图逻辑名解析成真正的视图(view)
视图View(需要程序员开发jsp):View是一个接口, 它的实现类支持不同的视图类型(jsp,freemarker,pdf等等)
控制器
解析用户输入并将其转换为一个由视图呈现给用户的模型。Spring用一个非常抽象的方式实现了一个控制层,允许用户创建多种用途的控制器。
单例模式,所以在多线程访问的时候有线程安全问题,同步会影响性能,解决方案是在控制器里面不能写字段。
工作原理
request -> DispatcherServlet -> HandlerMapping -> HandlerAdapter -> Handler -> ModelAndView -> ViewResolver -> View -> reponse
(1)用户发送请求至前端控制器DispatcherServlet;
(2) DispatcherServlet收到请求后,调用HandlerMapping处理器映射器,请求获取Handle;
(3)处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet;
(4)DispatcherServlet 调用 HandlerAdapter处理器适配器;
(5)HandlerAdapter 经过适配调用 具体处理器(Handler,也叫后端控制器);
(6)Handler执行完成返回ModelAndView;
(7)HandlerAdapter将Handler执行结果ModelAndView返回给DispatcherServlet;
(8)DispatcherServlet将ModelAndView传给ViewResolver视图解析器进行解析;
(9)ViewResolver解析后返回具体View;
(10)DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)
(11)DispatcherServlet响应用户。
MVC设计模式
模型(model)- 视图(view)- 控制器(controller),三层架构的设计模式。用于实现前端页面的展现与后端业务数据处理的分离。
分层设计,实现了业务系统各个组件之间的解耦,有利于业务系统的可扩展性,可维护性。
有利于系统的并行开发,提升开发效率。
注解
@RequestMapping:用于处理请求 url 映射的注解,可用于类或方法上,用于类上表示类父路径。
@RequestBody:接收http请求的json数据,将json转换为java对象。
@ResponseBody:将controller方法返回对象转化为json对象响应给客户。
@RestController == @ResponseBody + @Controller
@Controller
控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Model 返回给对应的View 进行展示。
@Controller 只是定义了一个控制器类,而使用@RequestMapping 注解的方法才是真正处理请求的处理器。
@PathVariable @RequestParam
@PathVariable来获取 @RequestMapping(value = “/page/{id}”, method = RequestMethod.GET)
@RequestParam用来获得静态的URL请求入参 spring注解时action里用到。
Spring MVC与Struts2
相同点
都是基于mvc的表现层框架,都用于web项目的开发。
不同点
前端控制器不一样。Spring MVC的前端控制器是servlet:DispatcherServlet。struts2的前端控制器是filter:StrutsPreparedAndExcutorFilter。
请求参数的接收方式不一样。Spring MVC是使用方法的形参接收请求的参数,基于方法的开发,线程安全,可以设计为单例或者多例的开发,推荐使用单例模式的开发(执行效率更高),默认就是单例开发模式。struts2是通过类的成员变量接收请求的参数,是基于类的开发,线程不安全,只能设计为多例的开发。
Struts采用值栈存储请求和响应的数据,通过OGNL存取数据,Spring MVC通过参数解析器是将request请求内容解析,并给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过reques域传输到页面。Jsp视图解析器默认使用jstl。
重定向和转发
转发:在返回值前面加”forward:”,譬如”forward:user.do?name=method4”
重定向:在返回值前面加”redirect:”,譬如”redirect:http://www.baidu.com"
中文乱码
POST
在web.xml中配置一个CharacterEncodingFilter过滤器,设置成utf-8;
<filter> |
GET
- 修改tomcat配置文件添加编码与工程编码一致
<ConnectorURIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/> |
- 对参数进行重新编码:
String userName = new String(request.getParamter(“userName”).getBytes(“ISO8859-1”),“utf-8”) |
异常处理
可以将异常抛给Spring框架,由Spring框架来处理;我们只需要配置简单的异常处理器,在异常处理器中添视图页面即可。
拦截GET方式提交的方法
可以在@RequestMapping注解里面加上method=RequestMethod.GET。
获取 Request、Session
直接在方法的形参中声明request,Spring MVC就自动把request对象传入。
拦截的方法里面得到入参
直接在形参里面声明这个参数就可以,但必须名字和传过来的参数一样。
接收对象属性的参数
直接在方法中声明这个对象,Spring MVC就自动会把属性赋值到这个对象里面。
后台向前台传递数据
通过ModelMap对象,可以在这个对象里面调用put方法,把对象加到里面,前台就可以通过el表达式拿到。
ModelMap数据放入Session
可以在类上面加上@SessionAttributes注解,里面包含的字符串就是要放入session里面的key。
拦截器
Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理。例如通过拦截器可以进行权限验证、记录请求信息的日志、判断用户是否登录等。
通过实现HandlerInterceptor接口;
实现 preHandle(之前)、postHandle(之后)、afterCompletion(该方法会在整个请求完成,即视图渲染结束之后执行。可以通过此方法实现一些资源清理、记录日志信息等工作。)
通过实现WebRequestInterceptor接口。
单个拦截器
多个拦截器
preHandle()方法会按照配置文件中拦截器的配置顺序执行,postHandle()方法和afterCompletion()方法则会按照配置顺序的反序执行。
WebApplicationContext
WebApplicationContext 继承了ApplicationContext 并增加了一些WEB应用必备的特有功能,它不同于一般的ApplicationContext ,因为它能处理主题,并找到被关联的servlet。