天天看點

SpringMVC架構基礎知識(01)

1. SpringMVC架構的作用

MVC = Model(資料模型) + View(視圖) + Controller(控制器),MVC思想是建議每個項目中至少有這3種核心的角色,用于處理不同的問題,其中,Model表示的資料處理,例如資料的增删改查等,View表示軟體的界面,Controller表示控制器,用于接收用戶端送出到伺服器端的請求,并在處理完請求後給予用戶端響應結果。

在不同的技術領域,這種思想可能也不同,例如在一些用戶端軟體的開發中,會使用MVP、MVVP等思想。

SpringMVC架構是基于Spring架構的,是以,在SpringMVC中,會使用到Spring架構的作用,例如通過Spring架構來建立對象、管理對象,也會使用到Spring架構中的一些注解。

SpringMVC架構主要解決了V-C互動的問題,即:用戶端将請求送出到伺服器後,肯定是由伺服器端的控制器接收請求,SpringMVC就解決了如何接收請求(包含請求中的參數等)的問題,當伺服器端處理完請求之後,應該給予用戶端響應結果,SpringMVC也解決了如何響應的問題!事實上,SpringMVC架構與“M”完全沒有任何關系,是以,在SpringMVC的學習過程中,完全不考慮資料的增删改查相關資料庫技術。

2. 為什麼要使用SpringMVC架構

……

3. SpringMVC HelloWorld

【案例目标】

寫完項目後,運作項目,打開浏覽器,輸入http://localhost:8080/項目名稱/hello.do即可看到預期顯示的内容。

【準備工作】

在Eclipse中找到Servers面闆,如果目前沒有配置Tomcat,則點選該面闆中的連結即可開始添加Tomcat!

如果Eclipse中沒有顯示Servers面闆,則點選Window菜單的ShowView的Other選項,并在彈出的對話框輸入Servers進行篩選,即可打開該面闆!

在添加Tomcat的對話框中,結合本機中已有的Tomcat版本進行選擇,然後,在對話框的第2個界面中浏覽到本機的Tomcat檔案夾,即可完全配置。

配置完成後,在Servers面闆中就會出現剛才配置的Tomcat,同時,在項目清單中還會出現名為Servers的項目,該項目表示Tomcat的配置,在使用Tomcat的過程中,該項目必須是打開的,如果關閉了,Tomcat将無法啟動!

【建立項目】

建立新的Maven Project,在建立過程中勾選Create a simple project,Group Id填為cn.tedu,Artifact Id填為springmvc01,Packaging必須選擇war。

如果建立的項目是用戶端項目,是通過某個類的main()方法啟動的項目,應該選擇jar;如果建立的項目是伺服器端項目,是需要運作在Tomcat上的,就要選擇war。

在Eclipse中,建立的war項目預設會報錯,因為在項目中缺少web.xml檔案,但是,war項目并不一定需要該檔案!可以在pom.xml中添加以下配置:

<properties>
    <failOnMissingWebXml>false</failOnMissingWebXml>
</properties>      

當然,以上配置也可以結合關于開發、編譯版本的配置為:

<properties>
    <failOnMissingWebXml>false</failOnMissingWebXml>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
</properties>      

并且,繼續在pom.xml中添加spring-webmvc的依賴:

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.2.5.RELEASE</version>
    </dependency>
</dependencies>      

最後,對項目點右鍵,選擇Properties,并在彈出的項目屬性對話框中,左側選擇Targeted Runtimes,在右側勾選Tomcat。

【使用SpringMVC架構處理請求】

首先,在項目中建立cn.tedu.spring包,用于存放相關檔案;

然後,自定義某個類(類名可以自定義),繼承自AbstractAnnotationConfigDispatcherServletInitializer類:

package cn.tedu.spring;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
public class SpringMvcInitializer extends
    AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
  // TODO Auto-generated method stub
  return null;
    }
    @Override
    protected Class<?>[] getServletConfigClasses() {
  // TODO Auto-generated method stub
  return null;
    }
    @Override
    protected String[] getServletMappings() {
  // TODO Auto-generated method stub
  return null;
    }
}      

由于AbstractAnnotationConfigDispatcherServletInitializer是抽象類,是以,繼承之後,需要重寫其中的3個抽象方法:

getRootConfigClasses():擷取Spring的配置類,在簡單的SpringMVC項目中,也許并不需要編寫任何Spring環境的配置,則該方法傳回null即可,後續,如果整合MyBatis架構或其它架構時,可能需要編寫相關配置;

getServletConfigClasses():擷取SpringMVC的配置類,SpringMVC的配置類可以自定義,且必須實作WebMvcConfigurer接口;

getServletMappings():擷取架構所處理的請求的路徑,假設所有以.do為字尾的請求都需要被SpringMVC架構處理,則可以配置為*.do。

例如,可以将以上方法重寫為:

package cn.tedu.spring;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class SpringMvcInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return null;
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[] { SpringMvcConfigurer.class };
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "*.do" };
    }

}

      

以上SpringMvcInitializer類的作用就類似于web.xml的作用!例如,後續,當項目中需要使用到Filter元件時,也可以在這個類中添加配置!

接下來,在SpringMVC的配置類SpringMvcConfigurer的聲明之前配置元件掃描:

package cn.tedu.spring;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@ComponentScan("cn.tedu.spring")
public class SpringMvcConfigurer implements WebMvcConfigurer {
}      

注意:在SpringMVC項目中,元件掃描必須配置在SpringMVC的配置類之前,不可以隻配置在Spring的配置類之前!

在原生的Java EE技術中,控制器類就是一個個自定義的Servlet類,需要繼承自HttpServlet的!而在SpringMVC項目中,控制器類不需要繼承自某個特定的類,也不需要實作任何接口,僅有的要求是:

必須放在元件掃描的包中;

必須添加@Controller注解。

如果需要SpringMVC架構處理某個路徑的請求,需要在控制器類中自定義方法,然後在方法内部編寫代碼進行處理,關于方法的聲明:

在方法的聲明之前添加@RequestMapping注解,用于配置處理哪個路徑的請求;

應該使用public權限;

傳回值類型暫時使用String類型;

方法的名稱可以自定義;

方法的參數清單暫時為空。