1.什么是SpringMVC?
轻量级框架、MVC设计模式
2.SpringMVC的工作原理
1) 用户发起请求 -> DispatcherServlet(中央处理器,前端控制器)
2) DispatcherServlet -> HandlerMapping(处理器映射器)
3) 由HandlerMapping处理器映射器根据配置或者注解找到最终要执行的Handler并返回
4) DispatcherServlet -> HandlerAdapter(处理器适配器)
5) 由HandlerAdapter处理器适配器根据Handler不同映射规则执行Handler(Servlet、Action以及Controller)
6) 执行Handler(Servlet、Action以及Controller)并返回ModelAndView
7) 返回ModelAndView(包含了展示的数据和跳转的页面)至DispatcherServlet
8) 由DispatcherServlet将ModelAndView送达到视图解析器ViewResolver
9) 由视图解析器ViewResolver进行视图解析工作(获取完整页面路径=前缀+逻辑视图名(页面名称)+后缀)
例如:/WEB-INF/jsp/index.jsp
10) 将ModelAndView中的Model部分渲染到具体的View视图上进行显示
11) 由DispatcherServlet将响应结果发送给用户(响应用户Response)
核心组件的作用:
1)DispatcherServlet:前端控制器,中央处理器,用于请求接收和分发以及响应结果
2)HandlerMapping:处理器映射器,根据配置或者注解找到最终要执行的Handler并返回(仅查找,不执行)
3)HandlerAdapter:处理器适配器,根据Handler的不同规则执行Handler(这里才是执行动作)
4)ModelAndView:模型视图,包含了被渲染的数据和跳转的页面(仅是逻辑视图名)
5)ViewResolver:解析ModelAndView中的View部分进行视图解析操作,获取完整页面路径=前缀+逻辑视图名(页面名称)+后缀
3.综合案例
1,添加springmvc相关依赖
2,添加JSTL依赖
3,在WEB-INF下添加springmvc-servlet.xml(spring-mvc.xml)
注1:修改spring-mybatis的扫描配置
注2:修改spring-mvc.xml的扫描配置
4,配置web.xml
5,配置Tomcat
6,HandlerMappinp处理映射器
7,常用注释
1,@Controller:用于标识处理器类
2,@RequestMapping:请求到处理器功能方法的映射规则,可定义到类和方法
1)如果作用在类上,起到窄化路径的作用
2)如果作用在方法上,表示该方法为请求处理方法
3)属性 :value:作用在类上,叫做窄化路径;作用在方法上,叫做请求路径
注意:如果单独使用value属性,那么value属性可以省略
如果与其他属性一起使用,则必须指明
2,参数传递
1)直接传递String或者八大基础类型
2)传递对象类型的参数 3)RequestParam
required = false:允许为空
defaultValue = "未知类型":默认值
4)传递Request/Response/Session
5)传递集合类型的参数
5.1 请使用@RequestParam方式接收Map类型参数
5.2 使用@RequestBody方式传遍List或Map类型的参数,但是参数的格式必须是JSON
注意:必须导入jackson的jar包
JSON格式:
1)数组:[1,2,3,4,5...]
2)对象:{'name':'zs','age':21}
3)混合:{'total':81,'rows':[{'bname':'三字经','price':100},{'bname':'十宗罪','price':100},{},{}....]}
3,返回值
1)String:逻辑视图名 (跟上面一样的,不用跳转页面)
以下三种方式都属于需要跳转到视图解析器中进行视图解析器操作:
2)ModelAndView
3)String+Model
4)json
4,跳转 1)forward:转发,"forward:path":地址栏不变 2)redirect:重定向,"redirect:path":地址栏改变 注意事项: 1)这两种跳转方式将会绕开视图解析器的前缀和后缀 2)还有就是如果在同一controller中则不用使用"/"从根目录开始,而如果是在不同的controller则一定要从根目录开始 3)转发和重定向的路径,不是路径视图名,而是请求方法名 3.1)如果在本Controller里面跳转,不需要使用"/"开头 3.2)如果在不同的Controller里面跳转,则需要使用"/"开头,并且是窄化路径+请求路径 例如:redirect:/index/toIndex
例如:redirect:/index/toIndex
4,图片