标签:根据 string 用户 请求 映射 不用 应该 for span
springMVC下面的四大组件:
(1)DispatcherServlet :
前端控制器,接收所有请求 ,并把请求路径和请求参数解析出来,本质是一个servlet在web.xml中配置 (如果配置"/"不包含 jsp ,如果配置成了"/*",所有请求都拦截)
(2)HandlerMapping:
本质是一个接口,在HandlerMapping的实现类中,有一个属性urlMap,是一个LinkedHashMap,在这个urlMap中 key就是程序员自己编写的controller(也就是处理器)的逻辑路径,例如我们用注解@RequestMapping("/test"),设置的"test",它就是urlMap中的一个key。那么value就是程序员编写的这个Controller。前端控制器(DispatcherServlet)解析出来请求路径后,就去这个处理器映射器中根据请求路径获取要执行的那个controller。
参考别处:HandlerMapping 将会把请求映射为HandlerExecutionChain 对象(包含一个Handler 处理器(页面控制器)对象、多个HandlerInterceptor 拦截器)对象,通过这种策略模式,很容易添加新的映射策略;
下面是一个简单最早的一种配置,现在都使用注解进行controller进行配置
<!-- 注册 处理器,也就是controller --> <bean id="handler" class="com.caopeng.controller.DemoController"></bean> <!-- 注册HandlerMapping 处理器映射器 会根据url请求解析出应该调用哪一个 处理器,但是调用并不是处理器映射器调用 --> <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="urlMap"> <map> <!-- key解析出来的请求的逻辑名 value-ref代表要调用的控制器 --> <entry key="demo" value-ref="handler" ></entry> </map> </property> </bean>
处理器的编写代码:早期的写法要实现Controller接口,现在都是用注解进行配置
public class DemoController implements Controller{ @Override public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { System.out.println("执行了springmvc的控制器"); //具备视图和传值的功能 ModelAndView modelAndView =new ModelAndView("main"); return modelAndView; } }
(3)HandlerAdapter:
根据处理器映射器 返回的处理器, 把处理器(controller)进行调用
配置如下:
<!-- 注册 处理器适配器,处理器适配器会调用 处理器 处理器适配器可以不用配置,会走默认值 --> <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
参考别处:HandlerAdapter 将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器;HandlerAdapter 将会根据适配的结果调用真正的处理器的功能处理方法,完成功能处理;并返回一个ModelAndView 对象(包含模型数据、逻辑视图名);
(4)ViewResovler:视图解析器.解析结果,准备跳转到具体的物理视图
参考别处:ModelAndView的逻辑视图名——> ViewResolver, ViewResolver 将把逻辑视图名解析为具体的View,通过这种策略模式,很容易更换其他视图技术;
配置如下:
<!-- 在spring容器中 ,注册视图解析器 同样视图解析器也可以不用配置,也会走默认值 InternalResourceViewResolver的父类中有两个属性:prefix,suffix 代表前缀和后缀 ModelAndView modelAndView =new ModelAndView("main"); 前缀和后缀会对ModelAndView中的参数进行拼接,拼接成"/main.jsp", 一般请情况下,我们会使用默认的视图解析器,但是有时候我们会在WebContent下建立一个page目录用来存放 jsp文件,此时在写ModelAndView modelAndView =new ModelAndView("main.jsp");是,需要前面加上 page/main.jsp,为了省略page/一般会把prefix配置成page/ 在返回ModelAndView时,默认会走请求转发,在InternalResourceViewResolver父类UrlBasedViewResolver 中有 public static final String REDIRECT_URL_PREFIX = "redirect:"; public static final String FORWARD_URL_PREFIX = "forward:"; 可以通过配置让其走重定向 --> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/"></property> <property name="suffix" value=".jsp"></property> </bean>
下面都是参考别处;
核心架构的具体流程步骤如下:
1、首先用户发送请求——>DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制;
2、DispatcherServlet——>HandlerMapping, HandlerMapping 将会把请求映射为HandlerExecutionChain 对象(包含一个Handler 处理器(页面控制器)对象、多个HandlerInterceptor 拦截器)对象,通过这种策略模式,很容易添加新的映射策略;
3、DispatcherServlet——>HandlerAdapter,HandlerAdapter 将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器;
4、HandlerAdapter——>处理器功能处理方法的调用,HandlerAdapter 将会根据适配的结果调用真正的处理器的功能处理方法,完成功能处理;并返回一个ModelAndView 对象(包含模型数据、逻辑视图名);
5、ModelAndView的逻辑视图名——> ViewResolver, ViewResolver 将把逻辑视图名解析为具体的View,通过这种策略模式,很容易更换其他视图技术;
6、View——>渲染,View会根据传进来的Model模型数据进行渲染,此处的Model实际是一个Map数据结构,因此很容易支持其他视图技术;
7、返回控制权给DispatcherServlet,由DispatcherServlet返回响应给用户,到此一个流程结束。
下边两个组件通常情况下需要开发:
Handler:处理器,即后端控制器用controller表示。
View:视图,即展示给用户的界面,视图中通常需要标签语言展示模型数据。
SpringMVC原理图:
看到这个图大家可能会有很多的疑惑,现在我们来看一下这个图的步骤:(可以对比MVC的原理图进行理解)
第一步:用户发起请求到前端控制器(DispatcherServlet)
第二步:前端控制器请求处理器映射器(HandlerMappering)去查找处理器(Handle):通过xml配置或者注解进行查找
第三步:找到以后处理器映射器(HandlerMappering)像前端控制器返回执行链(HandlerExecutionChain)
第四步:前端控制器(DispatcherServlet)调用处理器适配器(HandlerAdapter)去执行处理器(Handler)
第五步:处理器适配器去执行Handler
第六步:Handler执行完给处理器适配器返回ModelAndView
第七步:处理器适配器向前端控制器返回ModelAndView
第八步:前端控制器请求视图解析器(ViewResolver)去进行视图解析
第九步:视图解析器像前端控制器返回View
第十步:前端控制器对视图进行渲染
第十一步:前端控制器向用户响应结果
标签:根据 string 用户 请求 映射 不用 应该 for span
原文地址:https://www.cnblogs.com/cplinux/p/9782515.html