一个基于spring的框架,实际上就是spring的一个模块,专门做web开发的,理解是servlet的一个升级。web开发底层是servlet,框架是在servlet基础上加入一些功能,让你做web更方便。
springmvc就是一个spring.spring是容器,ioc能够管理对象,使用<bean>,@Component,@Repositoty,@Service,@Controller. springmvc能够创建对象,放入到容器中,springmvc中放入的是控制器对象。我们要做的是使用@Controller创建控制器对象,把对象放入springmvc容器中,把创建的对象作为控制器使用,这个控制器对象能接收用户的请求,显示处理结果,就当作是一个servlet使用。
使用@Controller创建的是一个普通类的对象,不是servlet.springmvc赋予了控制器对象一些额外的功能。
web开发底层是servlet,springmvc中有一个对象是servlet,dispatcherServlet
DispatcherServlet:负责接收用户的所有请求,用户把请求给了DispatcherServlet,之后DispatherServlet把请求转发给我们的Controller对象,最后Controller对象处理请求。
index.jsp---------------dispatherServlet-------转发/分配给controller对象(@Controller注解创建的对象)
main.jsp MainController
addUser.jsp UserController
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
springmvc请求的处理流程
1)发起some.do
2)tomcat(web.xml,url-pattern知道*.do的请求给DispatcherServlet)
3)DispatcherServlet根据springmvc配置知道some.do对应doSome()方法
4)DispatcherServlet把some.do转发给MyController.doSome()方法
5)框架执行doSome()把modelAndVies进行处理,转发到show.jsp
简化:some.do------>DispatcherServlet------->MyController
springmvc执行过程源代码分析
1,tomcat启动,创建容器的过程
通过load-on-start标签指定的1,创建DispatcherServlet对象。Diapatcher它的父类继承HttpServlet,它是一个servlet,在创建时执行init()方法:
// 创建容器 读取配置文件
WebApplicationContext ctx = new ClassPathXmlApplicationContext("springmvc.xml");
// 把容器对象放入到ServletContext中
getServletContext.setAttribute(key,ctx);
作用:创建@Controller注解所在的类的对象,创建MyController对象,这个对象放入到springmvc容器中,容器时map,类似map.put("myController",myController对象);
2,请求的处理过程
1)执行servlet的service
protect void service(HttpServletRequest request,HttpServletResponse response)
protect void doService(HttpServletRequest request,HttpServletResponse response)
DiapatcherServlet.doDispatch(request,response){
调用MyController的.doSome()方法;
}
在jsp,html中的地址,都是在前端页面中的地址,是相对地址
1,绝对地址,带有协议名称叫绝对地址如HTTP百度,ftp
2,相对地址,没有协议开头的,例如user/do,/user/some.do,相对地址不可独立使用,必须有一个参开地址,通过参考地址+相对地址本身才能指定资源
如张皓轩,1班张皓轩,2班张皓轩,这个1和2就是参考
3,参考地址
在你的页面中,访问地址不加 /
访问:http://localhost:8082/ch02_requestmapping__3__war_exploded/index.jsp
其中http://localhost:8082/ch02_requestmapping__3__war_exploded/是地址,index.jsp是资源
在index.jsp发起user/some.do请求,访问地址变为http://localhost:8082/ch02_requestmapping__3__war_exploded/user/some.do
当你的地址没有 / 开头,例如user/some.do,当你点击连接时,访问地址是当前页面的地址+上链接的地址http://localhost:8082/ch02_requestmapping__3__war_exploded/+user/some.do
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
index.jsp访问user/some.do,返回后现在的地址http://localhost:8082/ch06_path_war_exploded/user/some.do
路径:http://localhost:8082/ch06_path_war_exploded/user/
资源:some.do
不加 / ,变成了http://localhost:8082/ch06_path_war_exploded/user/user/some.do两个user,错了
解决方案:
1)${pageContext.request.contextPath}
2)加入一个base标签,是HTML中的标签,表示当前页面中访问地址的基地址(你页面中所有没有以 / 开头的地址,都是以base标签中的地址为参考地址)
使用 base中的地址 + user/some.do组成访问地址
在你的页面中,访问地址加 /
访问:http://localhost:8082/ch02_requestmapping__3__war_exploded/index.jsp
其中路径是http://localhost:8082/ch02_requestmapping__3__war_exploded/是地址,index.jsp是资源
在index.jsp发起 /user/some.do请求,访问地址变为http://localhost:8082/user/some.do,参考地址是:http://localhost:8082,也即是你的服务器地址,不全,因此代码上得写全,
代码上写全了,那以后改的话咋办?比较麻烦。解决方法就是加${pageContext.request.contextpath}
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------index.jsp---->addStudent.jsp---->student/addStudent.do(service方法 调用dao的方法)---->result.jsp
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
异常处理:
mvc采用的是统一,全局的异常处理,把controller的所有异常处理都集中到一个地方,采用的是aop思想,把业务逻辑和代码分来,解耦合。
使用两个注解:
1,@ExceptionHandler
2,ControllerAdvice
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------lanjieqi拦截器
1)拦截器时springmvc的一种,需要实现handlerinterceptor接口
2)拦截器和过滤器类似,功能方向侧重点不同,过滤器是用来过滤器请求参数,设置编码字符集等工作,拦截器是拦截用户的请求,做请求做判断处理的
3)拦截器是全局的,可以对多个controller做拦截,一个项目中可以有0个或者多个拦截器,他们一起拦截用户的请求,拦截器常用字用户登录处理,权限检查,记录日志
拦截器使用步骤:
1,定义类实现handlerInterceptor接口
2,在mvc配置文件中,声明拦截器,让框架知道拦截器的存在
拦截器的执行时间:
1)在请求处理之前,也即是controller类中的方法先被拦截
2)在控制器方法执行以后也会执行拦截器
3)在请求处理完成后也会执行拦截器