SpringMVC执行原理
springmvc的组件
前端控制器(DispatcherServlet)
前端控制器就是用来处理请求的中心,接收请求和响应结果都是由它控制的,也算是springmvc里的中心枢纽。
处理器映射器(HandlerMapping)
处理器映射器根据请求里的url来查找相应的处理器,即用来寻找处理器的。
处理器(Handler)
处理器是进行业务操作的。
处理器适配器(HandlerAdapter)
会把处理器包装成适配器,这样就可以支持多种类型的处理器,类比笔记本的适配器(适配器模式的应用)
视图解析器(ViewResovler)
即对返回来的视图进行解析,将代码解析成为对应的视图
工作流程
具体分析
- 用户发送请求,即在浏览器上输入url,DispatcherServlet会接收请求。
- DispatcherServlet收到请求后就会调用HandlerMapping来寻找需要的Handler。
- HandlerMapping找到Handler后就会返回给DispatcherServlet。
- 前端控制器DispatcherServlet收到Handler后就会调用HandlerAdapter对Handler进行处理。
- HandlerAdapter经过适配调用具体的Handler(Controller,也叫后端控制器)。
- 执行完毕后就会将一个ModelAndView返回给HandlerAdapter。
- HandlerAdapter将ModelAndView返回给DispatcherServlet。
- DispatcherServlet将调用ViewReslover来解析这个ModelAndView。
- ViewReslover解析ModelAndView后返回具体View给DispatcherServlet。
- DispatcherServlet根据这个view就会渲染出所需要的页面。
- DispatcherServlet将这个页面返回给用户,用户获取结果。
对于hellospringmvc的详解
首先在web.xml里注册的就是DispatcherServlet前端控制器,用户发出的请求(即输入url)先到的是这里。
这里DispatcherServlet收到请求就会获取有用的信息,就是将url拆分。
就比如我输入的url,https://localhost:8080/helloSpringmvc/hello 就会拆分为三部分- localhost:8080,这是tomcat开放的端口。
- helloSpringmvc,这个就是访问的你的项目名(可以自己更改),即tomcat的webapps下的helloSpringmvc文件夹。
- hello,即为控制器的id ,发出请求输入ur就是为了找到这个控制器。
然后经过关联的配置文件,即resource下的springmvc-servlet.xml。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<!--匹配到输入的url-->
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>springmvc-servlet.xml先是注册了HandlerMapping处理器映射器和HandlerAdapter处理器适配器,springmvc自动帮你调用这两个组件。
1
2<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>在springmvc-servlet.xml注册的Handler控制器,这样DispatcherServlet就可以通过这里找到这个hello控制器,然后DispatcherServlet将该控制器交给HandlerAdapter进行处理该Handler所包含的业务逻辑,这里就是HelloController类里的业务操作。
1
2<!--Handler-->
<bean id="hello" class="com.chen.controller.HelloController"/>HelloController中调用了Controller接口,即可以理解这就是mvc架构中Controller层,在这个类进行我们的业务逻辑操作,因为在springmvc中Control层的数据要交给DispatcherServlet处理的,所以返回了一个包装好的ModelAndView,Model存储数据,View存储视图。
1
2
3
4
5
6
7
8
9
10
11
12public class HelloController implements Controller {
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)
throws Exception {
//创建一个ModelAndView对象
ModelAndView mv = new ModelAndView();
//封装所需要的数据到ModelAndView的对象中
mv.addObject("msg","HelloSpringMVC!");
//封装要跳转的视图,放在ModelAndView中
mv.setViewName("hello"); // /WEB-INF/jsp/hello.jsp
return mv;
}
}DispatcherServlet收到包装好的ModelAndView后,通过注册的视图解析器进行解析渲染视图。
1
2
3
4
5
6
7<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
id="InternalResourceViewResolver">
<!--前缀-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!--后缀-->
<property name="suffix" value=".jsp"/>
</bean>这里就是对控制器进行拼接,比如hello控制器,加上前缀与后缀就成为了/WEB-INF/jsp/hello.jsp,然后就会在web目录下找到该视图进行跳转。
结合springmvc中第一个springmvc程序来看。由此可以看出springmvc帮我们做了很多事情,我们只需要配置好那几个重要的组件,然后编写业务逻辑和视图就能完成对于一个控制器的工作。