1.SpringMVC是什么?
SpringMVC是一个表现层框架,作用是:从请求中接受传来的参数,将处理后的结果返回给页面展示
2.SpringMVC的架构及处理流程
2.1.架构图
2.2.处理流程
1、 用户发送请求至前端控制器DispatcherServlet
2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3、 处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4、DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
5、 执行处理器(Controller,也叫后端控制器)。
6、 Controller执行完成返回ModelAndView
7、 HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
8、 DispatcherServlet将ModelAndView传给ViewReslover视图解析器
9、 ViewReslover解析后返回具体View
10、 DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
11、DispatcherServlet响应用户
3.组件说明
3.1.DispatcherServlet:前端控制器
用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性。
3.2.HandlerMapping:处理器映射器
HandlerMapping负责根据用户请求找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式
3.3.Handler:处理器
Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。
Handler涉及到具体的用户业务请求,需要根据业务开发。
3.4.HandlerAdapter:处理器适配器
通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行
处理器适配器存在的意义,让前端控制器执行Handler可以吗?
答:可以,但是让处理器适配器去执行Hander目的是为了减轻前端控制器的压力;处理器适配器相当于一个转换头,为了适配不同形式Handler(例如注解形式的@Controler,配置文件方式的,直接实现Controler接口的)。前端控制器将Handler交给处理器适配器,处理器适配器适配好合适处理器去执行Handler
3.5.ViewResolver:视图解析器
ViewResolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。
4.ModelAndView和Model的使用
1).使用ModelAndView时将返回的数据封装在Model中,将返回路径设置在View中,代码如下:
@RequestMapping("/itemEdit") publicModelAndView itemEdit(HttpServletRequest request) { //从Request中取id String strId = request.getParameter("id"); Integer id = null; //如果id有值则转换成int类型 if (strId != null&& !"".equals(strId)) { id = newInteger(strId); } else { //出错 returnnull; } Items items = itemService.getItemById(id); //创建ModelAndView ModelAndView modelAndView = new ModelAndView(); //向jsp传递数据 modelAndView.addObject("item", items); //设置跳转的jsp页面 modelAndView.setViewName("editItem"); returnmodelAndView; }
2).使用Model时,SpringMVC中方法返回一个简单String字符串,SpringMVC会认为这个字符串就是页面路径,在将数据封装在Model中返回。代码如下:
@RequestMapping("/itemEdit") publicString itemEdit(HttpServletRequest request, Model model) { //从Request中取id String strId = request.getParameter("id"); Integer id = null; //如果id有值则转换成int类型 if (strId != null&& !"".equals(strId)) { id = newInteger(strId); } else { //出错 returnnull; } Items items = itemService.getItemById(id); model.addAttribute("item", items); //设置跳转的jsp页面 return"editItem"; }
5.参数绑定(从请求中获取数据)
(从前端传过来的是String类型的数据,直接转换成基本数据类型没问题。日期类型就不行)
5.1.可以从HttpServletRequest中获取参数
5.2.绑定简单类型,当请求参数名称和处理器形参名称一致时会将请求参数与形参进行绑定。简化从Request中取了
5.3.SpringMVC可以直接接收pojo类型:要求页面上input框的name属性名称必须与pojo类的属性名称一致(日期类型不能直接转,可以用一个Converter转换器)
5.4.当Controller中接收的是VO,那么页面上input框name属性值要等于vo的属性.属性(封装起来的VO对象就是查询属性可能是商品对象,订单对象)
Vo类型(根据name,price查询)
数组(根据ids批量删除)
List(批量修改)
图片作为参考:
注意:前端页面标签中的name属性一般是向后端传输数据的,它的值要与接收类中的属性对应。
而value属性一般是显示数据用的。
6.JSON数据交互
6.拦截器:
作用:拦截请求,一般做登录权限验证时用的比较多
1)需要编写自定义拦截器类,实现HandlerInterceptor接口
2)在spirngMvc.xml中配置拦截器生效
7.登录权限验证:
1)编写登录的controller, 编写跳转到登录页面的方法, 编写登录验证方法
2)编写登录页面
3)编写拦截器
运行过程:
1)访问随意一个页面,拦截器会拦截请求,会验证session中是否有登录信息
如果已登录,放行
如果未登录,跳转到登录页面
2)在登录页面中输入用户名,密码,点击登录按钮,拦截器会拦截请求,如果是登录路径放行
在controller方法中判断用户名密码是否正确,如果正确则将登录信息放入session