關於java的mvc框架層出不窮,可能大家都會用,但是具體的原理知道不知道呢。所以我想寫一個寫一個簡單mvc的系列博客,主要面向想了解這些原理的。
其實所謂的mvc框架,基本都是一個原理,就是配置一個filter或者servlet來攔截所有的請求,然后轉發請求。
這個圖就能說明mvc的工作模式
1.首先頁面發送一個post請求,請求到某一個action。
2.然后由servlet或filter進行攔截,攔截固定后綴的請求,比如*.action,這里比如我們發送的請求是UserAction.action,servlet或filter就會攔截下來,然后在servlet里進行封裝,轉發到某一個action里。處理完畢后,再通過攔截器進行轉發,回到配置好的頁面。
下面是一個struts2的配置文件(網上找的)。
- <?xml version="1.0" encoding="UTF-8"?>
- <web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
- <display-name>Struts Blank</display-name>
- <filter>
- <!-- 配置Struts2核心Filter的名字 -->
- <filter-name>struts2</filter-name>
- <!-- 配置Struts2核心Filter的實現類 -->
- <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
- <init-param>
- <!-- 配置Struts2框架默認加載的Action包結構,可以沒有。 -->
- <param-name>actionPackages</param-name>
- <param-value>org.apache.struts2.showcase.person</param-value>
- </init-param>
- <!-- 配置Struts2框架的配置提供者類 -->
- <init-param>
- <param-name>configProviders</param-name>
- <param-value>lee.MyConfigurationProvider</param-value>
- </init-param>
- </filter>
- <!-- 配置Filter攔截的URL -->
- <filter-mapping>
- <!-- 配置Struts2的核心FilterDispatcher攔截所有用戶請求 -->
- <filter-name>struts2</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
- <welcome-file-list>
- <welcome-file>index.html</welcome-file>
- </welcome-file-list>
- </web-app>
這里的org.apache.struts2.dispatcher.FilterDispatcher就是圖中第2步中的攔截器。由於我沒看源碼,所以就大概說一下這個攔截器在中間都做了什么動作。
1.攔截從頁面發來的請求。假設這里的請求是 UserAction.action
2.然后攔截器會讀取框架配置文件,找到UserAction這個類
3.找到這個類以后,利用java的反射原理,封裝請求發來的參數
4.把封裝好的參數轉發給UserAction
5.UserAction執行其中的邏輯,返回一個值,根據這個值,由攔截器轉發執行完畢的結果,跳到制定頁面。
這大概就是一個mvc框架的流程。可見並不復雜,所以我就打算寫一個簡單的框架,來詳細的帶大家理解mvc。
寫這個mvc主要就是用到了java的反射原理,像第2步中,怎么找到把請求轉發給哪個類?第3步中的怎么把頁面的數據進行封裝?還有第5步中怎么根據值確定返回哪個頁面?
這些基本都是用的java反射原理。
在我寫的這個mvc框架中,我是用的注解配置,所以這里還設計到自定義注解。當然你也可以自己定制通過xml來配置你的mvc框架。
基本原理都是相同的。
下一篇文章我將講解一下其中的基礎知識。也就是java反射跟自定義注解以及他們在mvc框架中的應用。
其實本來想錄個視頻跟大家講解的,又怕沒多少人看,到時候就白費力氣了。所以就寫博客吧,當一個自己的積累。
如果有錯誤,請大家指出,謝謝!