SpringMVC:學習筆記(1)——理解MVC及快速入門


SprigMVC—理解MVC及快速入門

說明:

  傳統MVC——>JSPModel2——>Front Controller + Application Controller + Page Controller + Context 三種模式是JavaWeb設計模式的逐漸適配和演進。本文分別講述了這三種模式,作為了解即可。SpringMVC正是采用了第三種設計模式。

MVC

說明

  MVC是Xerox PARC在20世紀80年代為編程語言SmallTalk發明的一種軟件設計模式。
  MVC是一種設計模式,它強制性地把應用程序的數據展示、數據處理和流程控制分開
  MVC將應用程序分成3個核心模塊:模型、視圖、控制器,他們相互聯結又分別擔當不同的任務,如圖示所示。

圖示

  

理解

  ☐ 模型:數據模型,提供要展示的數據,因此包含數據和行為,可以認為是JavaBean,一個模型可以為多個視圖提供數據。
  ☐ 視圖:負責模型的展示,一般就是我們見到的用戶界面,客戶想要看到的東西。
  ☐ 控制器:控制器負責應用的流程控制,所謂流程控制就是接受用戶請求,委托給模型進場處理,后獲取模型數據交由視圖展示。

JSPModel2

說明

  在早期的Web應用中,JSP負責處理業務邏輯、控制網頁流程並創建HTML頁面。基本上JSP包攬的所有的模塊,這無疑造成了不少的困擾:
  比如:
    ☐可維護性差
    ☐調試困難
    ☐ HTML與Java程序代碼強耦合在一起
    ☐ 內嵌的流程控制邏輯,要理解應用程序的邏輯必須瀏覽所有的JSP頁面。
  為了解決這些問題,SUN公司先后制定了兩種設計模式,分別為Model1和Model2。雖然Model1在一定程序上實現了MVC中的視圖和模型,但是他的運用並不理想,知道Model2的出現才改變了這種局面。
  Model2中用JSP技術實現了視圖的功能、用Servlet技術實現了控制器的功能、用JavaBean技術實現了模型的功能

圖解

  

Front Controller + Application Controller + Page Controller + Context

說明

  前端控制器+應用控制器+頁面控制器(也有稱其為動作)+上下文,也是一種WebMVC模型,只是責任更加明確,SpringMVC正是這種模式

運行流程圖

  

職責

  Front Controller:前端控制器,負責為表現層提供統一訪問點,從而避免Model2中出現的重復的控制邏輯(由前端控制器統一回調相應的功能方法,如前邊的根據submitFlag=login轉調login方法);並且可以為多個請求提供共用的邏輯(如准備上下文等等),將選擇具體視圖和具體的功能處理(如login里邊封裝請求參數到模型,並調用業務邏輯對象)分離。
 
  Application Controller:應用控制器,前端控制器分離選擇具體視圖和具體的功能處理之后,需要有人來管理,應用控制器就是用來選擇具體視圖技術(視圖的管理)和具體的功能處理(頁面控制器/命令對象/動作管理),一種策略設計模式的應用,可以很容易的切換視圖/頁面控制器,相互不產生影響。
 
  Page Controller(Command):頁面控制器/動作/處理器:功能處理代碼,收集參數、封裝參數到模型,轉調業務對象處理模型,返回邏輯視圖名交給前端控制器(和具體的視圖技術解耦),由前端控制器委托給應用控制器選擇具體的視圖來展示,可以是命令設計模式的實現。頁面控制器也被稱為處理器或動作。
 
  Context:上下文,還記得Model2中為視圖准備要展示的模型數據嗎,我們直接放在request中(Servlet API相關),有了上下文之后,我們就可以將相關數據放置在上下文,從而與協議無關(如Servlet API)的訪問/設置模型數據,一般通過ThreadLocal模式實現。

HelloWorld

 0.說明

  現在我們以前了解了MVC編程模型,接下來我們實際地編寫一個SpringMVC入門實例,我們現在還不能解所有的技術細節,但是在接下來的博客一定會有相關解釋。

 1.加入Jar包

  

說明:

  點擊鏈接(http://projects.spring.io/spring-framework/)進入官方網站,頁面右側選擇4.0版本進行下載,下載完畢后添加以上Jar包到Java環境變量中。

2.配置Web.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
    <!--配置DispatcherServlet-->
    <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--配置初始化參數:作用是配置SpringMVC配置文件的位置和名稱-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:dispatcherServlet-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>  

說明:

      DispatcherServlet是前端控制器設計模式的實現,提供了Spring Web MVC的集中訪問點。 

    與其它web MVC框架一樣,Spring的web MVC框架是一個請求驅動的web框架,其設計圍繞一個中心的servlet進行, 它能將請求分發給控制器,並提供其它功能幫助web應用開發。然而,Spring的DispatcherServlet 所做的不僅僅是這些,它和Spring的IoC容器完全集成在一起,從而允許你使用Spring的其它功能

    請求處理流程:

    

 

3.加入SpringMVC的配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans.xsd 
          http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    <!--配置自動掃描的包-->
    <context:component-scan base-package="handles"/>
    <!--配置視圖解析器:如何把handle方法返回值解析為實際的物理視圖-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

說明:

  視圖解析器用來解析視圖。如上視圖解析器配置有前綴和后綴兩個屬性,這樣一來,view路徑將會縮短。

4.創建請求處理器類(編寫控制器)

說明:

  這里我們使用了注解@Controller ,可以表明了該類作為一個控制器,而不需要你擴展任何控制器基類或者引用ServletAPI。當然,如果需要還是可以引用特定Servlet功能。注解@Controller的基本目標是擔任所注解的類的原型的角色,指明它的職責。

  所注解的控制器Bean可以被顯示定義。@Controller也允許自動偵測。要實現隊所注解的控制器的自動偵測,必須要像配置中加入組件掃描的部分的語句。  

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="org.springframework.samples.petclinic.web"/>

    <!-- ... -->
</beans>

5.編寫JSP頁面(編寫視圖)

/WEB-INF/views/success.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    Hello,World!
</body>
</html>

6.簡單說明及測試

  控制器return返回了視圖的名稱,我們在SpringMVC 中設置了如何解析處理器返回值為視圖。

  所以當我們訪問/helloworld后我們會被處理器跳轉到success.jsp頁面。


免責聲明!

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



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