今天小编给大家分享的是Springmvc框架的执行流程,相信大部分人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,话不多说,一起往下看吧。
公司主营业务:成都做网站、成都网站建设、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。创新互联建站是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。创新互联建站推出梅县免费做网站回馈大家。
先上图:
下面结合源代码和上图来说明:
一:发送请求到DispatchServlet(中央控制器)
Web.xml配置文件:
是不是很熟悉的感觉,没错这里就是servlet的配置,只不过这个servlet是系统已经实现好的中央控制器:DispatcherServlet.
二:DispatcherServlet(中央控制器)调用HandlerMapping(处理器映射器)根据请求url找到需要执行的处理器(此处做了简化实际返回的是执行链)
HandlerMapping是一个接口:
public interface HandlerMapping{
。。。
@Nullable
HandlerExecutionChaingetHandler(HttpServletRequest var1) throws Exception;
}
这个接口里面只有一个方法:getHandler,该方法可以通过传入的参数请求对象:HttpServletRequest,得到 :HandlerExecutionChain,这里的HandlerExecutionChain里面包括了处理器对象和拦截器。可以简单的理解为该方法通过request请求对象获得要执行的处理器(每种HandlerMapping实现类返回的处理器不一定相同,有可能是处理器中的方法,也有可能是处理器本身)。
默认的HandlerMapping实现类是BeanNameUrlHandlerMapping,他的getHandler方法返回的是处理器类, 常用的HandlerMapping实现类有:
RequestMappingHandlerMapping:采用注解方式进行映射,使用最广泛,也最简单,只需要在类或方法上加上@RequestMapping()的注解就可以了,它的getHandler方法返回的是处理器类中的方法。
@Controller
public class HelloController{
@RequestMapping("/sayHello")
public StringsayHello(){
System.out.println("hello");
return "success";
}
}
SimpleUrlHandlerMapping:采用配置文件的方式进行映射,适用性最强,需要在配置文件里面配置,它的getHandler方法返回的是处理器类。
三:DispatcherServlet(中央控制器)通过HandlerAdapter(处理器适配器)调用处理器
因为不同的HandlerMapping实现类返回的处理器格式不是固定的,所以处理请求时需要HandlerAdapter(处理器适配器)做适配。
public interface HandlerAdapter{
//判断该适配器是否支持传入的handler(处理器)
boolean supports(Object handler);
//使用给定的handler处理请求,也就是执行handler
@Nullable
ModelAndViewhandle(HttpServletRequest var1, HttpServletResponse var2, Object handler) throws Exception;
long getLastModified(HttpServletRequest var1, Object var2);
}
HandlerAdapter也是一个接口,它里面有两个重要的方法:
boolean supports(Object handler)这个方法可以判断该适配器是否支持传入的handler(处理器)
ModelAndView handle(HttpServletRequest var1, HttpServletResponse var2, Object handler)throws Exception;这个方法使用给定的handler处理请求,也就是执行handler.
常用的HandlerAdapter实现类是RequestMappingHandlerAdapter,它是和RequestMappingHandlerMapping配合使用的。
在spring mvc的核心配置文件中加上:
下面是网上看到的一套模拟springmvc适配器的代码:
//定义一个Adapter接口
public interface HandlerAdapter{
public boolean supports(Object handler);
public void handle(Object handler);
}
//以下是三种Controller实现
public interface Controller{
}
public class HttpControllerimplements Controller{
public void doHttpHandler(){
System.out.println("http...");
}
}
public class SimpleControllerimplements Controller{
public void doSimplerHandler(){
System.out.println("simple...");
}
}
public class AnnotationControllerimplements Controller{
public void doAnnotationHandler(){
System.out.println("annotation...");
}
}
//下面编写适配器类
public class SimpleHandlerAdapterimplements HandlerAdapter{
public void handle(Object handler) {
((SimpleController)handler).doSimplerHandler();
}
public boolean supports(Object handler) {
return (handlerinstanceof SimpleController);
}
}
public class HttpHandlerAdapterimplements HandlerAdapter{
public void handle(Object handler) {
((HttpController)handler).doHttpHandler();
}
public boolean supports(Object handler) {
return (handlerinstanceof HttpController);
}
}
public class AnnotationHandlerAdapterimplements HandlerAdapter{
public void handle(Object handler) {
((AnnotationController)handler).doAnnotationHandler();
}
public boolean supports(Object handler) {
return (handlerinstanceof AnnotationController);
}
}
//模拟一个DispatcherServlet
import java.util.ArrayList;
import java.util.List;
public class DispatchServlet{
public static List
public DispatchServlet(){
handlerAdapters.add(new AnnotationHandlerAdapter());
handlerAdapters.add(new HttpHandlerAdapter());
handlerAdapters.add(new SimpleHandlerAdapter());
}
public void doDispatch(){
//此处模拟SpringMVC从request取handler的对象,仅仅new出,可以出,
//不论实现何种Controller,适配器总能经过适配以后得到想要的结果
// HttpController controller = new HttpController();
// AnnotationController controller = new AnnotationController();
SimpleController controller= new SimpleController();
//得到对应适配器
HandlerAdapter adapter= getHandler(controller);
//通过适配器执行对应的controller对应方法
adapter.handle(controller);
}
public HandlerAdaptergetHandler(Controller controller){
for(HandlerAdapter adapter: this.handlerAdapters){
if(adapter.supports(controller)){
return adapter;
}
}
return null;
}
public static void main(String[] args){
new DispatchServlet().doDispatch();
}
}
四:执行处理器,返回ModelAndView给中央控制器
这里的ModelAndView类指的是执行完处理器以后需要在视图显示的数据和视图,Model数据,View视图这个名字就很清晰的表明了该类的作用。执行处理器后,将数据保存在ModelAndView的Model属性中,将要显示的视图(通常为逻辑视图名)保存在View属性中,然后返回,ModelAndView类可以将处理器和视图渲染之间的紧密联系解耦和。
@RequestMapping("/findModelAndView")
public ModelAndViewfindModelAndView(){
System.out.println("modelAndView");
ModelAndView md= new ModelAndView();
User u1= new User();
u1.setUid(1);
u1.setName("zhangsan");
u1.setAge(23);
md.addObject("user",u1);
md.setViewName("aa");
return md;
}
五:中央控制器调用ViewResolver(视图解析器)根据处理器返回的ModelAndView中的逻辑视图名为中央控制器返回一个可用的view实例。
public interface ViewResolver{
@Nullable
ViewresolveViewName(String viewName, Locale var2) throws Exception;
}
接口ViewResolver里面有一个方法:resolveViewName,可以根据逻辑视图名viewName返回一个View实例。
public interface View{
void render(@Nullable Map
}
View接口里面有一个方法render,可以将数据model渲染到视图。
六:中央控制器根据View渲染视图(将模型填充到视图),并响应给用户。
以上就是Springmvc框架的执行流程了,看完之后是否有所收获呢?如果想了解更多相关内容,欢迎关注创新互联行业资讯!