今天小編給大家分享的是Springmvc框架的執(zhí)行流程,相信大部分人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,話不多說,一起往下看吧。
公司主營業(yè)務(wù):成都做網(wǎng)站、成都網(wǎng)站建設(shè)、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)建站是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)建站推出梅縣免費做網(wǎng)站回饋大家。
先上圖:
下面結(jié)合源代碼和上圖來說明:
一:發(fā)送請求到DispatchServlet(中央控制器)
Web.xml配置文件:
是不是很熟悉的感覺,沒錯這里就是servlet的配置,只不過這個servlet是系統(tǒng)已經(jīng)實現(xiàn)好的中央控制器:DispatcherServlet.
二:DispatcherServlet(中央控制器)調(diào)用HandlerMapping(處理器映射器)根據(jù)請求url找到需要執(zhí)行的處理器(此處做了簡化實際返回的是執(zhí)行鏈)
HandlerMapping是一個接口:
public interface HandlerMapping{
。。。
@Nullable
HandlerExecutionChaingetHandler(HttpServletRequest var1) throws Exception;
}
這個接口里面只有一個方法:getHandler,該方法可以通過傳入的參數(shù)請求對象:HttpServletRequest,得到 :HandlerExecutionChain,這里的HandlerExecutionChain里面包括了處理器對象和攔截器??梢院唵蔚睦斫鉃樵摲椒ㄍㄟ^request請求對象獲得要執(zhí)行的處理器(每種HandlerMapping實現(xiàn)類返回的處理器不一定相同,有可能是處理器中的方法,也有可能是處理器本身)。
默認(rèn)的HandlerMapping實現(xiàn)類是BeanNameUrlHandlerMapping,他的getHandler方法返回的是處理器類, 常用的HandlerMapping實現(xiàn)類有:
RequestMappingHandlerMapping:采用注解方式進行映射,使用最廣泛,也最簡單,只需要在類或方法上加上@RequestMapping()的注解就可以了,它的getHandler方法返回的是處理器類中的方法。
@Controller
public class HelloController{
@RequestMapping("/sayHello")
public StringsayHello(){
System.out.println("hello");
return "success";
}
}
SimpleUrlHandlerMapping:采用配置文件的方式進行映射,適用性最強,需要在配置文件里面配置,它的getHandler方法返回的是處理器類。
三:DispatcherServlet(中央控制器)通過HandlerAdapter(處理器適配器)調(diào)用處理器
因為不同的HandlerMapping實現(xiàn)類返回的處理器格式不是固定的,所以處理請求時需要HandlerAdapter(處理器適配器)做適配。
public interface HandlerAdapter{
//判斷該適配器是否支持傳入的handler(處理器)
boolean supports(Object handler);
//使用給定的handler處理請求,也就是執(zhí)行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處理請求,也就是執(zhí)行handler.
常用的HandlerAdapter實現(xiàn)類是RequestMappingHandlerAdapter,它是和RequestMappingHandlerMapping配合使用的。
在spring mvc的核心配置文件中加上:
下面是網(wǎng)上看到的一套模擬springmvc適配器的代碼:
//定義一個Adapter接口
public interface HandlerAdapter{
public boolean supports(Object handler);
public void handle(Object handler);
}
//以下是三種Controller實現(xiàn)
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出,可以出,
//不論實現(xiàn)何種Controller,適配器總能經(jīng)過適配以后得到想要的結(jié)果
// HttpController controller = new HttpController();
// AnnotationController controller = new AnnotationController();
SimpleController controller= new SimpleController();
//得到對應(yīng)適配器
HandlerAdapter adapter= getHandler(controller);
//通過適配器執(zhí)行對應(yīng)的controller對應(yīng)方法
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();
}
}
四:執(zhí)行處理器,返回ModelAndView給中央控制器
這里的ModelAndView類指的是執(zhí)行完處理器以后需要在視圖顯示的數(shù)據(jù)和視圖,Model數(shù)據(jù),View視圖這個名字就很清晰的表明了該類的作用。執(zhí)行處理器后,將數(shù)據(jù)保存在ModelAndView的Model屬性中,將要顯示的視圖(通常為邏輯視圖名)保存在View屬性中,然后返回,ModelAndView類可以將處理器和視圖渲染之間的緊密聯(lián)系解耦和。
@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;
}
五:中央控制器調(diào)用ViewResolver(視圖解析器)根據(jù)處理器返回的ModelAndView中的邏輯視圖名為中央控制器返回一個可用的view實例。
public interface ViewResolver{
@Nullable
ViewresolveViewName(String viewName, Locale var2) throws Exception;
}
接口ViewResolver里面有一個方法:resolveViewName,可以根據(jù)邏輯視圖名viewName返回一個View實例。
public interface View{
void render(@Nullable Map
}
View接口里面有一個方法render,可以將數(shù)據(jù)model渲染到視圖。
六:中央控制器根據(jù)View渲染視圖(將模型填充到視圖),并響應(yīng)給用戶。
以上就是Springmvc框架的執(zhí)行流程了,看完之后是否有所收獲呢?如果想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊!