SpringMvc执行过程源码分析
1.tomcat容器启动创建对象的过程
通过标签指定的1创建dispatchServlet对象
DispatchServlet父类是继承HttpServlet的·是一个Servlet,在被创建时候,会执行init()
在init()方法中:
//创建容器读取配置文件
WebApplicationContext ctx = new ClassPathXmlApplicationContext(“springmvc。xml”)
//把容器对象放入到ServletContext中
getServletContext().setAttribute(key,ctx);
说一下创建容器的作用:
可以创建@controller所在类的对象,比如上创建的myController对象
这个对象被放入到SpringMvc容器中,容器其实就是一个Map,因为计算机的数据结构问题
类似map.put(“myController”,myController对象)
2.请求的的过程
servlet的service方法是进行请求的
service(HttpServletRequest request ,HttpServletResponse response)
在执行 DoService(HttpServletRequest request ,HttpServletResponse response)
在执行 doDispatch(request,response)是容器请求的核心方法,包含了我们需要的对象
比如说modelAndView等,这个方法的里面会调用我们创建的controller里面的方法(中央调度器的方法),
DispatchServlet.doDispatch()接受返回参数,传递请求
提示一点关键内容,在我们的项目目录下面,webapp下的内容对用户是开放的
而 webapp下的WEB-INF目录下的内容是对用户不开放的
不能直接访问,资源受保护
配置了视图解析去后,可以使用逻辑名称(文件名)指定视图
框架配置了视图解析器以后使用 解析器的前缀+逻辑名称+后缀组成完整路径,就是字符串的连接操作
3.处理器四种请求参数 (controller方法内的参数)
1)HttpServletRequest
2)HttpServletResponse
3)HttpSession
4)请求携带的参数(形参和请求参数把持一致)
要说明的:后台方法使用包装类接受参数的好处:可以接受null “”,所有的参数接受的时候都是String
在提交请求参数:post传值中文会出现乱码问题,get请求不会出现
使用过滤器完美的解决,可以自定义,也可以使用框架现成的过滤器
4.过滤器 :位于spring-web包中
characterEncodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
utf-8
forceRequestEncoding
true
forceResponseEncoding
true
characterEncodingFilter
/*
源码:底层是filter 执行子类的doFilter()
在执行doFilterInternal(httpServletRequest request,HttpServletResponse response)
在这方法中设置请求响应的编码,如果在获取web.xml中设置的属性,
如果没有设置,那就设置输入的编码,如果设置了,将二者都进行设置编码
三层架构的对应:springMVC–界面层:接受用户请求,显示处理结果(springMvc容器的创建,管理控制器对象,接受请求处理结果)
:spring --业务层:处理业务逻辑,spring创建service dao工具类对象
:Mybatis-- 持久层:访问数据库,crud操作。
中央带调度器L DispatchServlet
前端控制器L FrontController(和中央调度器是同一个东西)
后端控制器L @Controller
5@RequestParam :(逐个接受)解决请求中和Controller的参数不一致问题
属性:value 请求的参数名(@requestParam(value=“前台请求参数”))
require = true表示请求必须有这个参数,如果没有参数默认为null,保证请求完成
位置:方法参数前