SpringMVC他是spring框架的一个模型
SpringMVC是一个基于mvc设计模式的web框架
Springmvc的工作流程:
第一步:发起请求到前端控制器(DispatcherServlet)
第二步:前端控制器请求HandlerMapping查找 Handler
可以根据xml配置、注解进行查找
第三步:处理器映射器HandlerMapping向前端控制器返回Handler
第四步:前端控制器调用处理器适配器去执行Handler
第五步:处理器适配器去执行Handler
第六步:Handler执行完成给适配器返回ModelAndView
第七步:处理器适配器向前端控制器返回ModelAndView
ModelAndView是springmvc框架的一个底层对象,包括 Model和view
第八步:前端控制器请求视图解析器去进行视图解析 根据逻辑视图名解析成真正的视图(jsp)
第九步:视图解析器向前端控制器返回View
第十步:前端控制器进行视图渲染 视图渲染将模型数据(在ModelAndView对象中)填充到request域
第十一步:前端控制器向用户响应结果
组件:
1.前端控制器(DispatcherServlet),(不需要开发,需要配置)
作用,接受用户请求,就类似cpu
使用前端控制器有点:减少其他组件的耦合度
2.处理器映射器HandlerMapping(不需要开发,需要配置)
作用,根据请求的url找相应的hander
3.处理器适配器,(不需要开发,需要配置)
作用,按照规则去调用执行处理器(hander)
4.hander处理器 (需要开发,需要配置)
作用:处理返回modeAndView
5.视图解析器(不需要开发,需要配置)
作用:进行视图解析,解析成真正的视图
6.视图:(需要开发,jsp)
View是一个接口,支持不同的view类型(jsp,pdf。。。)
作用:
总结
Springmvc前端控制器,处理器映射器,处理器是适配器,视图解析器
前端控制器:配置一个DispatcherServlet,在servlet中需要加载springmvc的配置文件
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
处理器映射器:
1)非注解处理器映射器(理解)
2)注解处理器映射器(掌握)
对标记的@Controller类中标识有@RequestMapping注解的方法进行映射,需要在@RequestMapping中定义url
处理器是适配器;
1)非注解的处理器适配器(理解)
2)注解处理器适配器(掌握)
注意:注解处理器映射器必须和注解处理器适配器配合使用
<mvc:annotation-driven></mvc:annotation-driven>可以替代
<!-- 注意:注解处理映射器和注解处理适配器必须配对使用 -->
<!-- 处理器映射器 -->
<!-- <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean> -->
<!-- 处理器适配器 -->
<!-- <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean> -->
视图解析器:
在视图解析器中可以配置前缀和后缀(我在程序中不需要指定前缀和后缀了)
<!-- 视图解析 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
数据绑定
直接controiiler方法形参上定义下边类型的对象,就可以使用这些对象,早参数绑定过程中,如过遇到下边类型直接进行绑定。
7、 JSON 类型
JSON 键值对是用来保存 JS 对象的一种方式,和 JS 对象的写法也大同小异,键/ 值对组合中的键名写在前面并用双引号 "" 包裹,使用冒号 : 分隔,然后紧接着值:
例:{"name":"Json"}
在 JS 语言中,一切都是对象。
Springmvc和json数据交换的两种方式
1、请求json、输出json,要求前端页面必须把数据转成json串,不太方便
2、请求key/value,输出是json串,比较方便
拦截器
拦截器1放行,拦截器2不放行:拦截器2的preHander才会执行;
拦截器2的preHander不放行,拦截器2的postHander和afterCompletion不会执行
只要一个拦截器不放行,postHander就不执行
拦截器1不放行,拦截器2放行:postHander和afterComletion不会执行,拦截器2不会执行
我要做一个登陆验证,应放在拦截器链的第一个位置,
我要做一个权限认证,应放在登陆认证拦截器之后,因为我登陆通过后才能做权限认证