java 常用框架 MVC 框架模式 和 SpringMVC 框架模式,分布式等 詳解


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM