1. 框架與設計模式
框架、設計模式這兩個概念很容易被人混淆,但其實這兩者之間還是存在差別的。框架通常是代碼重用,而設計模式是設計重用。
設計模式是對反復出現的問題的解決方案的描述,是一種思想用於處理細節的,比框架更加抽象。框架是已經用代碼實現的,可以執行也可以復用。設計模式是比框架更小的元素,一個框架往往會包含一個或者多個設計模式。框架總是針對某一特定領域的,而設計模式則可以適用於各個應用。
常見的框架模式:
MVC, ORM等。
常見的框架:
C++語言的MFC、qt、 gtk,Java語言的SSH,Python語言的django等。
常見的設計模式:
代理模式,抽象工廠模式等23種設計模式。
2. MVC框架模式
MVC是三個單詞的首字母縮寫,它們是Model(模型)、View(視圖)和Controller(控制)。
所謂MVC模型就是將數據、邏輯處理、用戶界面分離的一種方法。
- M(Model, 模型):用於數據處理、邏輯處理。
- V(View,視圖):用於顯示用戶界面。
- C(Controller,控制器):根據客戶端的請求控制邏輯走向和畫面。
而在Java中,MVC這三個部分則分別對應於 JavaBeans、JSP和Servlet。
- M = JavaBeans:用於傳遞數據,擁有與數據相關的邏輯處理。
- V = JSP:從Model接收數據並生成HTML
- C = Servlet:接收HTTP請求並控制Model和View
MVC 更詳細的簡介 https://blog.csdn.net/qq_21225505/article/details/81666986
常見的 MVC 框架有Struts1/2,Spring MVC等,實際上都是在最底層的Servlet規范中發展而來的。而不同MVC框架其M(對應JAVA的POJO類)和V(如JSP,HTML等)一般是相同的,最主要的區別在C,它是HTTP處理請求、響應的關鍵。

3. SpringMVC框架
3.1 SpringMVC簡介
springMVC 即 spring web MVC。
springMVC框架是基於Java的實現了MVC框架模式的請求驅動類型的輕量級框架。前端控制器是DispatcherServlet接口實現類,映射處理器是HandlerMapping接口實現類,視圖解析器是ViewResolver接口實現類,頁面控制器是Controller接口實現類。SpringMVC的工作流程圖如下:

Spring中的 DispatcherServlet 包為 org.springframework.web.servlet.DispatcherServlet,繼承自 HttpServlet 。

(1)客戶端請求提交到前端控制器DispatcherServlet; ----即 web.xml 文件 。<web-app>.....</web-app> 中 servlet部分。
<web-app xmlns=.......>
<servlet>
<servlet-name>mvc-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:mvc-dispatcher-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<display-name>appdemo-server</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
</web-app>
此時根據servlet listener 監聽器配置context-param 來自定義該文件的名稱和位置。applicationContext.xml
applicationContext.xml
-
這個文件將用於創建bean定義,重新定義在全局范圍內具有相同名稱的任何已定義的 bean。
-
標簽將用於激活 Spring MVC 注釋掃描功能,該功能允許使用注釋,如 @Controller 和 @RequestMapping 等等。
- InternalResourceViewResolver 將使用定義的規則來解決視圖名稱。按照上述定義的規則,一個名稱為 hello 的邏輯視圖將發送給位於
/WEB-INF/jsp/hello.jsp中實現的視圖。
(2)前端控制器DispatcherServlet查找一個或者多個映射處理器HandlerMapping,從而確定調用哪個頁面控制器Controller對請求進行處理;
(3)DispatcherServlet將請求提交給Controller;
(4)Controller根據業務邏輯對請求進行處理,並返回ModelAndView;
(5)DispatcherServlet查找一個或者多個ViewResolver,得到ModelAndView指定的視圖view,並將model中的數據傳入視圖view中進行渲染;
(6)DispatcherServlet將渲染后的視圖返回響應;
由上述過程可見,DispatcherServlet是Spring MVC的核心,它負責協調SpringMVC的各個組成部分對所有的Http請求進行處理,其主要工作如下:
(1)截獲符合特定格式的Http請求;
(2)初始化DispatcherServlet上下文對應的WebApplicationContext,並將其與業務層、持久層的WebApplicationContext關聯起來;
(3)初始化Spring MVC的各個組件,並裝配到DispatcherServlet中;
SPring Web MVC 運行的具體過程 ,參考https://blog.csdn.net/qq_18975791/article/details/81069016
3.2 SpringMVC框架中的接口
DispatcherServlet接口:Spring提供的前端控制器,所有的請求都是由它來進行分發。在DispatcherServlet將請求分發到對應的Controller之前,需要借助Spring提供的HandlerMapping才能定位到相應的Controller.
HandlerMapping接口:完成客戶請求到Controller的映射。
Controller接口:需要為並發用戶處理請求,在實現Controller接口時,必須保證線程安全且可重用。
在Controller完成用戶請求的處理,返回ModelAndView對象給DispatcherServlet,ModelAndView對象中包含了模型Model和視圖View。
從宏觀角度進行考慮,DispatcherServlet是整個Web應用的控制器;從微觀角度進行考慮,Controller是單個Http請求處理過程的控制器。
ViewResolver接口:根據ModelAndView對象在web應用查找view視圖,並將model中是數據傳入到view視圖中進行渲染。
3.3 SpringMVC框架優勢
(1)角色清晰,分工明確,進行更簡介的web開發;
(2)和其他Spring框架無縫集成;
(3)強大的JSP標簽庫;
(4)HandlerMapping, ViewResolver等能夠簡單地進行定制;
3.4 SpringMVC常用注解
1、@Controller
在SpringMVC中,控制器Controller負責處理由DispatcherServlet分發的請求,它把用戶請求中的數據經過業務處理層處理后封裝為一個Model,然后將該Model返回相應的View進行顯示。在SpringMVC中提供了一個非常簡單的定義Controller的方法,你無需繼承特定的類或者實現特定的接口,你只需要用@Controller注解標記一個類是Controoller,然后采用@RequestMapping和@RequestParam等一些注解用於定於URL和Controller方法之間的映射,這樣Controller便能夠被外界訪問。此外,Controller不會直接依賴HttpServletRequest和HttpServletResponse等HttpServlet對象,這些對象可以通過Controller方法參數來獲得。
采用@Controller注冊一個bean到spring上下文中時,bean默認的ID名稱是類名開頭字母小寫,也可以自己指定bean的名稱:
@Controller public class TestController {} @Controller("test") public class TestController {}
@Controller注解在一個類上,表明該類是一個SpringMVC Controller對象。分發處理器將會掃描使用了該注解的類的所有方法,並檢測該類中的方法是否使用了@RequestMapping注解。@Controller注解只是定義一個控制器,@RequestMapping注解的方法才是真正處理請求的處理器。單單使用了Controller注解還不能說明該類就是SpringMVC的控制器,因為這個時候Spring還無法獲取該類,我們可以通過如下兩種方式將@Controller注解的控制器類交給spring進行管理:
//方法一 //在SpringMVC配置文件中定義MyController的bean對象 <bean class="com.host.app.web.controller.MyController"/> //方法二 //在SpringMVC配置文件中告訴Spring去哪里掃描@Controller注解的Controller對象 <context:component-scan base-package="com.host.app.web.controller"/>
2、@RequestMapping
@RequestMapping是一個用來處理請求地址映射的注解,可以用於類或者方法上。當該注解用於類上時,表示該類中所有響應請求的方法都是以該地址為父路徑。
@RequestMapping注解包含6個屬性,下面我們對這6個屬性進行分析:
value:指定請求的實際地址,指定的地址可以是URL Template模式;
method:指定請求的方法類型;
consumes:指定請求提交的內容類型(Content-Type),例如application/json,text/html;
produces:指定返回的內容類型,僅當請求頭部中Accept包含指定類型時方法才進行處理;
params:請求中必須包含某些參數時,方法才進行處理;
headers:請求header中必須包含某些指定的header值,方法才進行處理;
3、@Resource和@Autowired
@Resource和@Autowired都是bean注入時使用,但是其實@Resource並不是spring的注解,它的包是javax.annotation.Resource,需要導入,但是Spring支持該注解的注入;
@Resource和@Autowired的共同點:兩者都可以使用在字段或者setter方法上,如果使用在了字段上,那么就不再需要setter方法。
@Resource和@Autowired的不同點:
@Autowired注解是由spring提供的,需要導入org.springframework.beans.factory.annotation.Autowired,只按照byType進行注入。在默認情況下,它要求依賴的對象必須存在,如果允許null,可以通過屬性required設置為false進行設置。如果我們需要輔助通過byName進行裝配bean,我們可以結合@Qualifier注解一起使用。
@Resource注解默認是按照byName進行裝配bean,由J2EE提供,需要導入javax.annotion.Resource。@Resource注解包含兩個重要的屬性: name和type,Spring將@Resource注解中的name屬性解析為bean的名字,將type屬性解析為bean的類型。
當@Resource注解的name屬性時,Spring將按照byName方式進行bean注入,找不到將會拋出異常;
當使用type屬性時,將按照byType方式進行bean注入,找不到或者找到多個將會拋出異常;
如果同時使用了這兩個屬性,那么將會從Spring上下文中查找指定類型指定名字bean進行裝配,找不到將會拋出異常;
如果兩個屬性都沒有使用,那么將會按照默認方式byName進行bean注入。
4、@ModelAttribute
@ModelAttribute注解有兩種用法:一種是用在擁有返回值的方法上,方法的返回值將會作為Model中指定屬性的值;另一種是用在請求處理方法參數上,方法參數將會從Model的屬性列表中獲取指定屬性的值。通過@ModelAttribute(“xxxx”)可以指定屬性的名稱。在Controller的請求處理方法調用之前,@ModelAttribute注解的方法都會被首先執行。
5、@SessionAttributes
@SessionAttibutes注解只能用在類上,不能使用在方法上。該注解將Model屬性列表中指定的一些屬性保存到Session對象中。
6、@PathVariable
該注解用於將請求URL的模板變量提取出來,應用到請求處理方法參數中。
@RequestMapping(value="/users/{user}/roles/{role}")
public void getUserAndRole(@PathVariable("user") String user,@PathVariable("role")String role){
System.out.println(user+" : "+role);
}
7、@RequestParam
@RequestParam主要用於SpringMVC后台請求處理方法中獲取參數,類似與request.getParameter(“name”), 該注解包含三個屬性:required, defaultValue, value,其中required表示請求中是否必須包含該參數,defaultValue表示請求中沒有包含該參數時的默認值,value表示傳入的參數的名稱。
8、@ResponseBody
該注解用於將Controller請求處理方法返回的對象,通過適當的HttpMessageConverter轉換為指定的格式,保存到Response對象的body區。
9、@Component
相當於通用的注解。
10、@Repository
用於注解DAO層。
原文鏈接:https://blog.csdn.net/qq_36827957/article/details/78515403
其他框架 Maven、mybatis 等框架 ,見博文https://www.cnblogs.com/byqh/p/5595384.html
