第一章SpringMVC概述
springvc:是基于spring的一个框架,实际上就是spring的一个模块,专门是做web开发的。理解是servlet的一个升级
web开发底层是servlet ,框架是在servlet基础上面加入一些功能,让你做web开发方便。
SpringMVC就是一个Spring。Spring是容器,ioc能够管理对象,使用<bean>,@Component,@Repository,@Service,@Controller,SpringMVC能够创建对象,放入到容器中(SpringMVC容器),SpringMVC容器中放的是控制器对象。
我们要做的是使用@Controller创建控制器对象,把对象放入到SpringMVC容器中,把创建的对象作为控制器使用,这个容器对象能接受用户的请求,显示处理结果,就当做是一个servlet使用(类似但并不是)。
使用@Controller注解创建的是一个普通类的对象,不是Servlet。SpringMVC赋予了控制器对象一些额外的功能。
Web开发底层是servlet,SpringMVC中有个对象是Servlet:DispatherServlet(中央调度器)
DispatherServlet:负责接收用户所有的请求,用户把请求给了DispatherServlet,之后DispathServlet把请求转发给我们的Controller对象,最后是Controller对象处理请求。
Index.jsp---DispatherServlet(Servlet)---转发,分配给---Controller对象(@Controller注解创建的对象)
第二章Springmvc请求的处理流程
1).发起请求some.do---
2).tomcat(web.xml—url-pattern知道 *.do的请求是给中央调度DispatcherServlet)---
3)DispatcherServlet(根据springmvc.xml配置知道some.do---dosome())-------4)DispatcherServlet把some.do转发给MyController.doSome()方法
5)框架执行dosome()把得到ModelAndView进行处理,转发到show.jsp
上面的过程简化的方式
Some.do---DispatcherServlet---MyController
Springmvc执行过程源代码分析
- tomcat启动,创建容器的过程
通过load-on-start标签指定的1,创建DispatcherServlet对象,DispatcherServlet它的父类是集成HttpServlet的,它是一个serlvet,在被创建时,会执行init()方法。在init方法中
//创建容器,读取配置文件
webApplicationContext ctx=new ClassPathXmlApplicationContext("springmvc.xml");
//把容器对象放入到ServletContext中
getServletContext().setAttribute(key,ctx);
上面创建容器作用:创建@Controller注解所在的类的对象。创建MyController对象中,这个对象放入到springmvc的容器中,容器是map,类似map.put(“myController”, MyController对象)
- 请求的处理过程
1)执行serv的service()
Protected void service(HttpServletRequest request,HttpServletResponse response)
Protected void doService(HttpServletRequest request,HttpServletResponse response)
DispatcherServlet.doDispatch(request,response){
调用MyController的dosom()方法;
}
复习springmvc框架以及如何接收用户的参数
没有加入Java到JSON转换的时候其中内存中的对象
text/plain;charset=ISO-8859-1
发起的请求是由哪些服务器程序处理的。
Tomcat本身能处理静态资源的访问,像html,图片,js文件都是静态资源。
表示静态资源和未映射的请求都给default处理
Default这个servlet作用:
- 处理静态资源
- 处理未映射到其他servlet的请求
复习前两天的内容:
解决请求中post方式有中文乱码,使用过滤器解决问题。CharacterEncodingFilter
逐个接收中,请求中参数名和形参名不一样,使用注解@RequestParam解决问题
使用Java对象接收请求参数时,要求请求中参数名和属性名一样。
Springmvc处理器方法的形参还可以用Map、List等集合类型,数组都可以。
处理器方法的返回值:
表示请求的处理结果
- ModelAndView,表示数据和视图,对视图执行forward
- String:表示视图的,可以逻辑名称,完整视图路径,对视图执行forward
- Void:返回值本身不能表示数据和视图,可以相应ajax请求
- 对象Object:表示数据的,可以响应ajax请求。
- Springmvc处理器返回对象,转为json响应ajax步骤:①加入处理java转为json转换的工具库:使用jackson。②在springmvc配置文件加入注解驱动<mvc:annotation-dirver>。③在处理器方法上面加入@Requestbody。
url-pattren设置中央调度器的url-pattern是“/”:表示静态资源访问失败都是404,动态资源可以正常访问(例如网页的请求)。
第一种解决静态资源访问的方案:在spring的配置文件中1)<mvc:default-servelt-handler> 2)<mvc:annotation-driven>。(原理:给程序内存中增加一个处理器对象,DefaultHttpRequestHandler,让这个对象来处理静态资源的访问)
在jsp,html中使用的地址,都是在前端页面中的地址,都是相对地址
地址分类:
- 绝对地址,带有协议名称的是绝对地址,http://www.baidu.com,ftp://202.122.23.1
- 相对地址,没有协议开头的,例如:user/some.do,/user/some.do。相对地址不能独立的使用,必须有一个参考地址,通过参考地址+相对地址本身才能够指定资源。
- 参考地址
在你的页面中的,访问地址不加“/”
访问的是:http://localhost:8080/ch06_path/index.jsp
路径:http://localhost:8080/ch06_path/
资源:index.jsp
在index.jsp发起user/some.do请求,访问地址变为:http://localhost:8080/ch06_path/user/some.do
当你的地址 没有斜杠开头,例如 user/some.do,当你点击链接时,访问地址是当前页面的地址再加上你链接的地址。
http://localhost:8080/ch06_path/ + user/some.do
index.jsp 访问user/some.do,返回后现在的地址:http://localhost:8080/ch06_path/user/some.do
路径http://localhost:8080/ch06_path/user/
资源:some.do
在index.jsp在user/some.do,就变为http://localhost:8080/ch06_path/user/user/some.do
解决方案:
- 加入EL表达式也就是下面介绍的那个。
- 加入一个base标签,是html语言中的标签。表示当前页面中访问地址的基地址。表示你的页面中所有没有“/”开头的地址,都是以base标签中的地址作为参考地址,使用base中的地址+user/some.do组成访问地址
2)在你的页面加上斜杠“/”
访问的是:http://localhost:8080/ch06_path/index.jsp
路径:http://localhost:8080/ch06_path/
点击 /user/some.do 访问地址变为http://localhost:8080/user/some.do 参考地址是 你的服务器地址,也就是http://localhost:8080
如果你的资源不能加入${pageContext.request.contextPath}(这个叫做EL表达式)
<p><a href="/ch06_path/user/some.do">发起user/first.do的get请求</a></p>
如果你的资源不能访问,有一个/是绝对的所以我们需要加入${pageContext.request.contextPath}这个EL表达式.
Index,jsp---addStudent.jsp—student/addStudent.do(Service的方法dao的方法)—result.jsp
第四章 SpringMVC核心技术
SpringMVC框架采用的是统一,全局的异常处理。
把Controller中的所有异常处理都集中到一个地方。采用的是aop的思想。把业务逻辑和异常处理代码分开,解耦合。
使用两个注解
拦截器:
1)拦截器是SpringMVC中的一种,需要实现HandlerInterceptor接口
2)拦截器和过滤器类似,功能方向侧重点不同。过滤器是用来过滤器请求参数,设置编码字符集等工作。
3)拦截器是拦截用户请求,做请求做判断处理。
4)拦截器是全局的,可以对多个Controller做拦截。一个项目中可以有0个或多个拦截器,他们在一起拦截用户请求。拦截器常用在:用户登录处理,权限检查,记录日志。
拦截器的使用步骤:
- 定义类实现HandlerInterceptor接口
- 在SpringMVC配置文件中声明拦截器,让框架知道拦截器的存在。
拦截器的执行时间:
1)在请求处理之前,也就是Controller类中的方法执行之前先被拦截。
2)在控制器方法执行之后也会执行拦截器。
3)在请求处理完成后也会执行拦截器。
拦截器原理图
拦截器:看做是多个Controller中公用的功能,集中到拦截器统一处理,使用的是AOP的思想。掌握第一个preHandle()方法
============================================================
多个拦截器:
第一个拦截器preHandle=true,第二个拦截器preHandle=true
11111111拦截器的MyInterceptor的preHandle()
22222222拦截器的MyInterceptor的preHandle()
===================执行MyController中的doSome方法==============
22222222拦截器的MyInterceptor的postHandle()
11111111拦截器的MyInterceptor的postHandle()
22222222拦截器的MyInterceptor的afterCompletion()
111111111111拦截器的MyInterceptor的afterCompletion()
第一个拦截器preHandle=true,第二个拦截器preHandle=false
11111111拦截器的MyInterceptor的preHandle()
22222222拦截器的MyInterceptor的preHandle()
111111111111拦截器的MyInterceptor的afterCompletion()
第一个拦截器preHandle= false,第二个拦截器preHandle=true
11111111拦截器的MyInterceptor的preHandle()
拦截器和过滤器的区别
- 过滤去是Servlet中的对象,拦截器是框架中的对象。
- 过滤器是实现Filter接口对象,拦截器是实现HandlerInterceptor
- 过滤器是用来设置request,Response的参数,属性的,侧重对数据过滤的。拦截器是用来验证请求的,能截断请求。
- 过滤器是在拦截器之前先执行的。
- 过滤器是Tomcat服务器创建的对象。拦截器是SPringMVC容器中创建的对象。
- 过滤器是一个执行时间点,而拦截器是有三个执行时间点。
- 过滤器可以处理jsp,js,html等等。拦截器是侧重拦截对Controller的对象,如果你的请求不能被中央调度器DispatcherServlet接收,这请求不会执行拦截器的内容。
- 过滤器拦截普通类方法执行,过滤器过滤Servlet请求响应。
用拦截器验证用户身份
Ch12
SpringMVC的执行流程(理解)
ApplicationContext ctx = new ClassPathXmlApplication ( "beans.xml") ;studentservice service = (studentService) ctx.getBean ( "service") ;
SpringMVC内部请求的处理流程:也就是SpringMVC接收请求,到处理完成的过程
- 用户发起请求some.do
- DispatcherServlet接收请求some.do,把请求转交给处理器映射器。
处理器映射器:SpringMVC框架中的一种对象,框架把视线了HandlerMapping接口的类都叫做映射器(多个)。
处理器映射器作用:根据请求,从SpringMVC容器对象中获取处理器对象(MyController controller=ctx.getBean(“some.do”))
框架把找到的处理器对象放到一个叫做处理器执行链(HandlerExecutionChain)的类保存
HandlerExecutionChain:类中保存着:1.处理器对象(MyController);2.项目中的拦截器List<HandlerIntercept>
3. DispatcherServlet把2中的HandlerExecutionchain中的处理器对象交给了处理器适配器对象(多个)处理器适配器:springmvc框架中的对象,需要实现HandlerAdapter接口。I
处理器适配器作用:执行处理器方法(调用MyController.doSome()得到返回值ModelAndView)
4.DispatcherServlet把3中获取的ModelAndView交给视图解析器对象。
视图解析器:SpringMVC的对象,需要实现ViewResoler接口(可以有多个)
视图解析器作用:组成视图完整路径,使用前缀,后缀。并创建View对象。
View是一个接口,表示视图,在框架中jsp,html不是string表示,而是使用View和他的实现类表示视图。
InternalResourceView:视图类,表示jsp文件,视图解析器会创建InternalResourceView类对象。这个对象的里面,有一个属性url=/WEB-INF/view/show.jsp
5.DispatcherServlet把4步骤中创建的view对象获取到,调用view类自己的方法,把Model数据放入到request作用域。执行对象视图的forward。请求结束。