一、SpringMVC 概述
1.基本概念
SpringMVC:是基于spring的一个框架, 实际上就是spring的一个模块, 专门是做web开发的,是servlet的一个升级。
web开发底层是servlet , 框架是在servlet基础上面加入一些功能,让你做web开发方便。
SpringMVC就是一个Spring。 Spring是容器,ioc能够管理对象,使用, @Component, @Repository, @Service, @Controller
SpringMVC能够创建对象, 放入到容器中(SpringMVC容器), springmvc容器中放的是控制器对象,
我们要做的是 使用@Contorller创建控制器对象, 把对象放入到springmvc容器中, 把创建的对象作为控制器使用这个控制器对象能接收用户的请求, 显示处理结果,就当做是一个servlet使用。
使用@Controller注解创建的是一个普通类的对象, 不是Servlet。 springmvc赋予了控制器对象一些额外的功能。
web开发底层是servlet, springmvc中有一个对象是Servlet : DispatherServlet(中央调度器)
DispatherServlet: 负责接收用户的所有请求, 用户把请求给了DispatherServlet, 之后DispatherServlet把请求转发给我们的Controller对象, 最后是Controller对象处理请求。
2.使用
核心对象:DispatcherServlet
1.加入依赖 : spring-webmvc, servlet依赖
2.在web.xml 注册DispatcherServlet
作用:
1.创建springmvc的容器对象, WebApplicationContext. 在创建容器对象的同时,读取配置文件
把controller控制器对象都创建好。 web项目启动后,所有对象都创建了,准备好了
2.它是一个servlet,能够接收用户的请求,并显示请求的处理结果
二、SpringMVC 注解式开发
1.@Controller: 创建控制器对象
2.@RequestMapping: 请求映射,把请求指定给某个方法处理
value:请求的uri地址,唯一值
method:表示请求的方式,get,post。 RequestMethod枚举值
3.接收请求的参数:
逐个接收: 请求中参数名需要和控制器方法的形参名一样;逐个接收中,如果名称不一样使用@RequestParam
java对象接收参数:要求属性名和请求中参数名一样
提交请求参数有中文乱码,使用字符集的过滤器, CharacterEncodingFilter
4.返回值,表示请求的处理结果
ModelAndView:表示数据和视图
String:表示视图
void:可以响应ajax请求
Object:对象,表示数据,响应ajax请求
1.返回一个Student,转为json对象
2.返回List<Student>,转为的json array
3.返回String,表示数据
springmvc中控制器方法返回对象,转为json响应ajax步骤:
1.加入处理json的工具库。加入依赖,默认是jackson处理json
2.springmvc配置文件,加入<mvc:annotation-driven>
3.在控制器方法的上面,加入@ResponseBody
控制器方法返回对象,转为json:使用的核心对象HttpMessageConveter和他的实现类
5.静态资源:
为什么要处理静态资源:中央调度器的url-pattern设置为“/” 导致静态资源的请求交给了中央调度器,而默认框架中是没有处理静态资源的控制器对象的,所以访问静态资源是404
解决方式:增加控制器对象,让加入的控制器对象处理静态资源的请求
1.在配置文件加入< mvc:default-servlet-hanlder > , < mvc:annotation-driven >,创建DefaultServletHttpRequestHandler这个控制器对象
2.在配置文件加入< mvc:resources mapping="请求静态资源的uri地址" location="静态资源的目录" />
< mvc:annotation-driven >,创建ResourceHttpRequestHandler这个控制器对象
三、SSM 整合开发
SSM整合也叫做SSI (IBatis也就是mybatis的前身), 整合中有容器。
1.第一个容器SpringMVC容器, 管理Controller控制器对象的。
2.第二个容器Spring容器,管理Service,Dao,工具类对象的
我们要做的把使用的对象交给合适的容器创建,管理。 把Controller还有web开发的相关对象交给springmvc容器, 这些web用的对象写在springmvc配置文件中,service,dao对象定义在spring的配置文件中,让spring管理这些对象。
springmvc容器和spring容器是有关系的,关系已经确定好了
springmvc容器是spring容器的子容器, 类似java中的继承。 子可以访问父的内容
在子容器中的Controller可以访问父容器中的Service对象, 就可以实现controller使用service对象
实现步骤:
0.使用springdb的mysql库, 表使用student(id auto_increment, name, age)
1.新建maven web项目
2.加入依赖
springmvc,spring,mybatis三个框架的依赖,jackson依赖,mysql驱动,druid连接池, jsp,servlet依赖
3.写web.xml
1)注册DispatcherServlet ,目的:
.创建springmvc容器对象,才能创建Controller类对象。
.创建的是Servlet,才能接受用户的请求。
2)注册spring的监听器:ContextLoaderListener,目的: 创建spring的容器对象,才能创建service,dao等对象。
3)注册字符集过滤器,解决post请求乱码的问题
4.创建包, Controller包, service ,dao,实体类包名创建好
5.写springmvc,spring,mybatis的配置文件
1)springmvc配置文件
2)spring配置文件
3)mybatis主配置文件
4)数据库的属性配置文件
6.写代码, dao接口和mapper文件, service和实现类,controller, 实体类。
7.写jsp页面
四、SpringMVC 核心技术
1.请求重定向和转发
当处理器对请求处理完毕后,向其它资源进行跳转时,有两种跳转方式:请求转发与重定向。而根据所要跳转的资源类型,又可分为两类:跳转到页面与跳转到其它处理器。
注意,对于请求转发的页面,可以是WEB-INF中页面;而重定向的页面,是不能为WEB-INF中页的。因为重定向相当于用户再次发出一次请求,而用户是不能直接访问 WEB-INF 中资源的。
forward:表示转发,实现 request.getRequestDispatcher("xx.jsp").forward()
redirect:表示重定向,实现 response.sendRedirect("xxx.jsp")
2.异常处理:
springmvc框架采用的是统一,全局的异常处理。
把controller中的所有异常处理都集中到一个地方。 采用的是aop的思想。把业务逻辑和异常处理代码分开。解耦合。
使用两个注解
1.@ExceptionHandler
2.@ControllerAdvice
3.拦截器:
1)拦截器是springmvc中的一种,需要实现HandlerInterceptor接口。
2)拦截器和过滤器类似,功能方向侧重点不同。 过滤器是用来过滤器请求参数,设置编码字符集等工作。
拦截器是拦截用户的请求,做请求做判断处理的。
3)拦截器是全局的,可以对多个Controller做拦截。
一个项目中可以有0个或多个拦截器, 他们在一起拦截用户的请求。
拦截器常用在:用户登录处理,权限检查, 记录日志。
拦截器的使用步骤:
1.定义类实现HandlerInterceptor接口
2.在springmvc配置文件中,声明拦截器, 让框架知道拦截器的存在。
拦截器的执行时间:
1)在请求处理之前, 也就是controller类中的方法执行之前先被拦截。
2)在控制器方法执行之后也会执行拦截器。
3)在请求处理完成后也会执行拦截器。
拦截器:看做是多个Controller中公用的功能,集中到拦截器统一处理。使用的aop的思想
4.拦截器和过滤器的区别
1.过滤器是servlet中的对象, 拦截器是框架中的对象
2.过滤器实现Filter接口的对象, 拦截器是实现HandlerInterceptor
3.过滤器是用来设置request,response的参数,属性的,侧重对数据过滤的。拦截器是用来验证请求的,能截断请求。
4.过滤器是在拦截器之前先执行的。
5.过滤器是tomcat服务器创建的对象,拦截器是springmvc容器中创建的对象
6.过滤器是一个执行时间点,拦截器有三个执行时间点
7.过滤器可以处理jsp,js,html等等
拦截器是侧重拦截对Controller的对象。 如果你的请求不能被DispatcherServlet接收, 这个请求不会执行拦截器内容
8.拦截器拦截普通类方法执行,过滤器过滤servlet请求响应