您好,登錄后才能下訂單哦!
今天小編給大家分享的是Springmvc框架的執行流程,相信大部分人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,話不多說,一起往下看吧。
先上圖:
下面結合源代碼和上圖來說明:
一:發送請求到DispatchServlet(中央控制器)
Web.xml配置文件:
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
是不是很熟悉的感覺,沒錯這里就是servlet的配置,只不過這個servlet是系統已經實現好的中央控制器:DispatcherServlet.
二:DispatcherServlet(中央控制器)調用HandlerMapping(處理器映射器)根據請求url找到需要執行的處理器(此處做了簡化實際返回的是執行鏈)
HandlerMapping是一個接口:
public interface HandlerMapping {
。。。
@Nullable
HandlerExecutionChain getHandler(HttpServletRequest var1) throws Exception;
}
這個接口里面只有一個方法:getHandler,該方法可以通過傳入的參數請求對象:HttpServletRequest,得到 :HandlerExecutionChain,這里的HandlerExecutionChain里面包括了處理器對象和攔截器。可以簡單的理解為該方法通過request請求對象獲得要執行的處理器(每種HandlerMapping實現類返回的處理器不一定相同,有可能是處理器中的方法,也有可能是處理器本身)。
默認的HandlerMapping實現類是BeanNameUrlHandlerMapping,他的getHandler方法返回的是處理器類, 常用的HandlerMapping實現類有:
RequestMappingHandlerMapping:采用注解方式進行映射,使用最廣泛,也最簡單,只需要在類或方法上加上@RequestMapping()的注解就可以了,它的getHandler方法返回的是處理器類中的方法。
@Controller
public class HelloController {
@RequestMapping("/sayHello")
public String sayHello(){
System.out.println("hello");
return "success";
}
}
SimpleUrlHandlerMapping:采用配置文件的方式進行映射,適用性最強,需要在配置文件里面配置,它的getHandler方法返回的是處理器類。
三:DispatcherServlet(中央控制器)通過HandlerAdapter(處理器適配器)調用處理器
因為不同的HandlerMapping實現類返回的處理器格式不是固定的,所以處理請求時需要HandlerAdapter(處理器適配器)做適配。
public interface HandlerAdapter {
//判斷該適配器是否支持傳入的handler(處理器)
boolean supports(Object handler);
//使用給定的handler處理請求,也就是執行handler
@Nullable
ModelAndView handle(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的核心配置文件中加上:<mvc:annotation-driven /> 就會自動幫我們注冊RequestMappingHandlerMapping和RequestMappingHandlerAdapter
<!-- 配置spring創建容器時要掃描的包 -->
<context:component-scan base-package="cn.xh"></context:component-scan>
<!-- 配置視圖解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<mvc:annotation-driven />
下面是網上看到的一套模擬springmvc適配器的代碼:
//定義一個Adapter接口
public interface HandlerAdapter {
public boolean supports(Object handler);
public void handle(Object handler);
}
//以下是三種Controller實現
public interface Controller {
}
public class HttpController implements Controller{
public void doHttpHandler(){
System.out.println("http...");
}
}
public class SimpleController implements Controller{
public void doSimplerHandler(){
System.out.println("simple...");
}
}
public class AnnotationController implements Controller{
public void doAnnotationHandler(){
System.out.println("annotation...");
}
}
//下面編寫適配器類
public class SimpleHandlerAdapter implements HandlerAdapter {
public void handle(Object handler) {
((SimpleController)handler).doSimplerHandler();
}
public boolean supports(Object handler) {
return (handler instanceof SimpleController);
}
}
public class HttpHandlerAdapter implements HandlerAdapter {
public void handle(Object handler) {
((HttpController)handler).doHttpHandler();
}
public boolean supports(Object handler) {
return (handler instanceof HttpController);
}
}
public class AnnotationHandlerAdapter implements HandlerAdapter {
public void handle(Object handler) {
((AnnotationController)handler).doAnnotationHandler();
}
public boolean supports(Object handler) {
return (handler instanceof AnnotationController);
}
}
//模擬一個DispatcherServlet
import java.util.ArrayList;
import java.util.List;
public class DispatchServlet {
public static List<HandlerAdapter> handlerAdapters = new ArrayList<HandlerAdapter>();
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 HandlerAdapter getHandler(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 ModelAndView findModelAndView(){
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
View resolveViewName(String viewName, Locale var2) throws Exception;
}
接口ViewResolver里面有一個方法:resolveViewName,可以根據邏輯視圖名viewName返回一個View實例。
public interface View {
void render(@Nullable Map<String, ?> model, HttpServletRequest var2, HttpServletResponse var3) throws Exception;
}
View接口里面有一個方法render,可以將數據model渲染到視圖。
六:中央控制器根據View渲染視圖(將模型填充到視圖),并響應給用戶。
以上就是Springmvc框架的執行流程了,看完之后是否有所收獲呢?如果想了解更多相關內容,歡迎關注億速云行業資訊!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。