杭州下起了小雪,但是也阻止不了我写博客总结技术的步伐。
什么是SpringMVC
SpringMVC是一个强大的Web框架,它支持注解配置,易用性高。Spring MVC 是当前应用最多的 MVC 框架,而且在很多公司,通常会把 Spring MVC 和 Mybatis 整合起来使用。
框架原理和执行流程
在Spring MVC框架中,从“Request(请求)”开始,依次进入“DispatcherServlet(核心分发器)” —> “HandlerMapping(处理器映射)” —> “Controller(控制器)” —> “ModelAndView(模型和视图)” —> “ViewResolver(视图解析器)” —> “View(视图)” —> “Response(响应)”结束,其中DispatcherServlet、HandlerMapping和ViewResolver 只需要在XML文件中配置即可,从而大大提高了开发的效率,特别是对于 HandlerMapping 框架为其提供了默认的配置。Spring MVC 框架的结构图如下所示:
相关接口解释:
(1) DispatcherServlet
前端控制器,所有的请求都有经过它来统一分发,请求会被分发给对应的Handler。
(2) HandlerMapping(处理器映射器)
解析请求连接,然后根据请求连接找到执行这个请求的类(Controller)。可以通过注解或在xml文件中配置。
(3) Controller
Controller 将处理用户请求,Controller 处理完用户请求,则返回 ModelAndView 对象给DispatcherServlet 前端控制器。
(4) ViewResolver(视图解析器)
解析 MdoelAndView,将 MdoelAndView 中的逻辑视图名变为一个真正的 View 对象,并将 MdoelAndView 中的 Model 取出。
从宏观角度考虑,DispatcherServlet 是整个 Web 应用的控制器;从微观考虑,Controller 是单个 Http 请求处理过程中的控制器。
搭建SpringMVC框架
pom.xml配置依赖的jar包
配置jar包依赖:
1 | <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
配置web.xml
在web.xml中主要需要配置一下DispatcherServlet类
1 | <!DOCTYPE web-app PUBLIC |
添加springmvc-config.xml配置文件
1 | <?xml version="1.0" encoding="UTF-8"?> |
配置的视图解析器 InternalResourceViewResolver 用来解析视图,将 View 呈现给用户。视图解析器中配置的 prefix表示视图的前缀, suffix表示视图的后缀。
实体类
1 | package com.haozai.entity; |
Controller控制器
1 | package com.haozai.controller; |
@Controller注解表名这个类是一个Controller。
@RequestMapping注解,配置外部的访问路径。
jsp中
1 | <%@ page language="java" contentType="text/html; charset=utf-8" |
因为配置的Servlet是2.3版本的,需要设置<%@page isELIgnored=”false” %>标签,,2.4版本或者更新的版本,isELIgnored默认值为false,而2.3或者 更早的版本isELIgnored默认值为true。jsp中EL表达式不起作用的问题
测试
结果
异步请求
在使用AJAX异步请求的时候,Controller中并不需要返回ModelAndView,一般只需要返回Json格式的数据即可。
异步请求和同步请求的流程有如下的区别:
异步请求的时候,发送请求Request到DispatcherServlet然后DispatcherServlet通过HandlerMapping找到Controller控制器中的方法,然后再通过Response返回Json格式的数据即可。所以在被@RequestMapping注解过的方法要被异步访问的时候,需要做一些修改,不再是返回ModelAndView而是可以直接返回字符串或者集合等数据类型。例如:
1 | package com.haozai.controller; |
大家可以自行用ajax测试一下,或者直接在浏览器输入地址和参数。
需要注意的是,如果打算使返回的值是Json格式的话,需要在方法上加ResponseBody注解。
并且不止可以返回String类型的数据,还可以返回List、Map等集合,框架底层会自动封装成Json格式的数据。