1. 程式人生 > 其它 >Spring基礎知識(11)- Spring MVC (一)

Spring基礎知識(11)- Spring MVC (一)

Spring MVC 簡介、建立 Maven Webapp 專案、配置 Spring MVC


1. Spring MVC 簡介

    Spring MVC(模型-檢視-控制)框架是 Spring 提供的一個基於 MVC 設計模式的輕量級 Web 開發框架,本質上相當於 Servlet。Spring MVC 圍繞 DispatcherServlet 設計的,DispatcherServlet 用來處理所有的 HTTP 請求和響應。

    Spring MVC 是結構最清晰的 Servlet + JSP + JavaBean 的實現,是一個典型的教科書式的 MVC 構架,不像 Struts 等其它框架都是變種或者不是完全基於 MVC 系統的框架。 Spring MVC 採用鬆耦合可插拔的元件結構,具有高度可配置性,比起其它 MVC 框架更具有擴充套件性和靈活性。

    在 Spring MVC 框架中,Controller 替換 Servlet 來擔負控制器的職責,用於接收請求,呼叫相應的 Model 進行處理,處理器完成業務處理後返回處理結果。Controller 呼叫相應的 View 並對處理結果進行檢視渲染,最終客戶端得到響應資訊。

    Spring MVC 本身就是 Spring 框架的一部分,所以可以說與 Spring 框架是無縫整合,效能方面具有先天的優越性,對於開發者來說,開發效率也高於其它的 Web 框架,在企業中的應用越來越廣泛,成為主流的 MVC 框架。

    一個好的框架要減輕開發者處理複雜問題的負擔,內部有良好的擴充套件,並且有一個支援它的強大使用者群體,恰恰 Spring MVC 都做到了。


2. 建立 Maven Webapp 專案

    本文將在 Windows 下使用 IntelliJ IDEA 和 Apache Maven 建立一個簡單的 Maven Webapp 程式。在開始之前,確保已經正確搭建了 Spring 開發環境,參考 “ Spring基礎知識(1)- Spring簡介、Spring體系結構和開發環境配置 ”。

    Windows版本 : Windows 10 Home (20H2)   
    IntelliJ IDEA:Community Edition for Windows 2020.1.4
    Apache Maven:3.8.1


    1) 在 IDEA上建立 Maven Webapp 專案

        (1) 執行 IDEA
    
            點選選單 New 建立 Project:
            
            New Project -> Project Type: Maven -> Project SDK: 1.8 -> Check "Create from archtype" -> select "org.apache.maven.archtypes:maven-archtype-webapp" -> Next

                Name: SpringmvcBasic
                GroupId: com.example
                ArtifactId: SpringmvcBasic

            -> Finish

        (2) 生成的專案目錄結構和檔案



            |-- src
            |    |-- main
            |         |-- webapp
            |               |-- WEB-INF
            |               |     |-- web.xml
            |               |-- index.jsp
            |   
            |-- pom.xml

        (3) index.jsp 程式碼

            <html>
            <body>
            <h2>Hello World!</h2>
            </body>
            </html>

        (4) web.xml 程式碼

            <!DOCTYPE web-app PUBLIC
                "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
                "http://java.sun.com/dtd/web-app_2_3.dtd" >

            <web-app>
                <display-name>Archetype Created Web Application</display-name>
            </web-app>

        (5) pom.xml 程式碼

 1             <?xml version="1.0" encoding="UTF-8"?>
 2             <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 4             <modelVersion>4.0.0</modelVersion>
 5 
 6             <groupId>com.example</groupId>
 7             <artifactId>SpringmvcBasic</artifactId>
 8             <version>1.0-SNAPSHOT</version>
 9             <packaging>war</packaging>
10 
11             <name>SpringmvcBasic Maven Webapp</name>
12             <!-- FIXME change it to the project's website -->
13             <url>http://www.example.com</url>
14 
15             <properties>
16                 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
17                 <maven.compiler.source>1.7</maven.compiler.source>
18                 <maven.compiler.target>1.7</maven.compiler.target>
19             </properties>
20 
21             <dependencies>
22                 <dependency>
23                 <groupId>junit</groupId>
24                 <artifactId>junit</artifactId>
25                 <version>4.11</version>
26                 <scope>test</scope>
27                 </dependency>
28             </dependencies>
29 
30             <build>
31                 <finalName>SpringmvcBasic</finalName>
32                 <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
33                     <plugins>
34                         
35                         ...
36 
37                     </plugins>
38                 </pluginManagement>
39             </build>
40             </project>

 

    2) 使用 tomcat7-maven-plugin, 將 tomcat 內嵌執行

        (1) 修改 pom.xml

 1             <project ... >
 2                 <build>
 3                     <plugins>
 4                         <plugin>
 5                             <groupId>org.apache.tomcat.maven</groupId>
 6                             <artifactId>tomcat7-maven-plugin</artifactId>
 7                             <version>2.2</version>
 8                             <configuration>                
 9                                 <path>/</path>
10                                 <port>9090</port>
11                                 <uriEncoding>UTF-8</uriEncoding>
12                             </configuration>
13                         </plugin>
14                     </plugins>
15                 </build>
16             </project>

 

            *注: path 是專案訪問路徑, 如果配置為/aa,則訪問路徑為 http://localhost:9090/aa 。

        (2) 配置執行

            Run -> Edit configurations -> Click "+" -> Select "Maven"

                Command line: clean tomcat7:run
                Name: SpringmvcBasic [clean,tomcat7:run]

                Before Launch:
                    Click "+", select "Launch Web Browser"
                    Browser: default
                    Url: http://localhost:9090

            -> OK

            Run -> Run "SpringmvcBasic [clean,tomcat7:run]"

        (3) 打包 War 後執行

            Run -> Edit configurations -> Click "+" -> Select "Maven"

                Command line: clean tomcat7:run-war
                Name: SpringmvcBasic [clean,tomcat7:run-war]

                Before Launch:
                    Click "+", select "Launch Web Browser"
                    Browser: default
                    Url: http://localhost:9090

            -> OK

            Run -> Run "SpringmvcBasic [clean,tomcat7:run-war]"

            在 target 目錄下會生成 SpringmvcBasic.war

        (4) 打包 War (方式二)

            View -> Tool Windows -> Maven -> SpringmvcBasic -> Lifecycle -> Clean | Package

            在 target 目錄下會生成 SpringmvcBasic.war


3. 配置 Spring MVC

    1) 匯入 servlet-api, springmvc 相關依賴包

        訪問 http://www.mvnrepository.com/,查詢 servlet, springmvc

        修改 pom.xml:

 1             <project ... >
 2                 ...
 3 
 4                 <dependencies>
 5 
 6                     ...
 7 
 8                     <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
 9                     <dependency>
10                     <groupId>javax.servlet</groupId>
11                     <artifactId>javax.servlet-api</artifactId>
12                     <version>4.0.1</version>
13                     <scope>provided</scope>
14                     </dependency>
15 
16                     <!-- https://mvnrepository.com/artifact/org.springframework/spring-web -->
17                     <dependency>
18                     <groupId>org.springframework</groupId>
19                     <artifactId>spring-web</artifactId>
20                     <version>4.3.9.RELEASE</version>
21                     </dependency>
22                     <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
23                     <dependency>
24                     <groupId>org.springframework</groupId>
25                     <artifactId>spring-webmvc</artifactId>
26                     <version>4.3.9.RELEASE</version>
27                     </dependency>
28                     <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
29                     <dependency>
30                     <groupId>org.springframework</groupId>
31                     <artifactId>spring-jdbc</artifactId>
32                     <version>4.3.9.RELEASE</version>
33                     </dependency>
34                     <!-- https://mvnrepository.com/artifact/org.springframework/spring-orm -->
35                     <dependency>
36                         <groupId>org.springframework</groupId>
37                         <artifactId>spring-orm</artifactId>
38                         <version>4.3.9.RELEASE</version>
39                     </dependency>
40 
41                     ...
42 
43                 </dependencies>
44             
45                 ...    
46 
47             </project>


        在IDE中專案列表 -> SrpingmvcBasic -> 點選滑鼠右鍵 -> Maven -> Reload Project

        本文選擇了 springmvc 4.3.9.RELEASE 相關依賴包,servlet-api、spring-web 和 spring-webmvc 是必選項,spring-jdbc 和 spring-orm 是可選項,後期資料庫操作時需要。

    2) 建立 springmvc-beans.xml

        在 src/main/resources (需要手動建立該目錄,下同)目錄下,建立 springmvc-beans.xml 檔案。

 1         <?xml version="1.0" encoding="UTF-8"?>
 2         <beans xmlns="http://www.springframework.org/schema/beans"
 3             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4             xmlns:mvc="http://www.springframework.org/schema/mvc"
 5             xmlns:context="http://www.springframework.org/schema/context"
 6             xsi:schemaLocation="http://www.springframework.org/schema/beans
 7                                 http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
 8                                 http://www.springframework.org/schema/mvc
 9                                 http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd    
10                                 http://www.springframework.org/schema/context
11                                 http://www.springframework.org/schema/context/spring-context-4.0.xsd">
12 
13         </beans>

   3) 修改 web.xml

 1         <!DOCTYPE web-app PUBLIC
 2             "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 3             "http://java.sun.com/dtd/web-app_2_3.dtd" >
 4         
 5         <web-app>
 6             <display-name>Springmvc Basic</display-name>
 7 
 8             <!-- Springmvc -->
 9             <servlet>
10                 <servlet-name>springMVC</servlet-name>
11                 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
12                 <init-param>
13                     <param-name>contextConfigLocation</param-name>
14                     <param-value>classpath:springmvc-beans.xml</param-value>
15                 </init-param>
16                 <load-on-startup>1</load-on-startup>
17             </servlet>
18             <servlet-mapping>
19                 <servlet-name>springMVC</servlet-name>
20                 <url-pattern>/</url-pattern>
21             </servlet-mapping>
22         </web-app>

    4) 建立 View

        View 是指 JSP 檔案,JSP檔案一般都在 webapp 目錄或子目錄下,這裡配置的路徑是 src/main/webapp/WEB-INF/jsp/,中間路徑如果不存在,自行建立(下同)。

        建立 src/main/webapp/WEB-INF/jsp/demo.jsp 檔案,程式碼如下:

 1             <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"  isELIgnored="false" %>
 2             <html>
 3             <head>
 4                 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 5                 <title>Demo</title>
 6             </head>
 7             <body>
 8                 <h3>Demo Page</h3>
 9                 <p>&nbsp;</p>
10                 <p>Message: ${message} </p>
11             </body>
12             </html>

    5) 建立 Controller

        Controller 是指 Controller 類檔案,這裡的路徑是 src/main/java/com/example/controller,中間路徑如果不存在,自行建立(下同)。

        (1) 建立 src/main/java/com/example/controller/TestController.java 檔案,程式碼如下:

 1             package com.example.controller;
 2 
 3             import javax.servlet.http.HttpServletRequest;
 4             import javax.servlet.http.HttpServletResponse;
 5             import org.springframework.ui.ModelMap;
 6             import org.springframework.web.servlet.ModelAndView;
 7             import org.springframework.web.servlet.mvc.Controller;
 8 
 9             public class TestController implements Controller {
10                 public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) {
11                     ModelMap modelMap = new ModelMap();
12                     modelMap.addAttribute("message", "Spring MVC Demo Page");
13                     return new ModelAndView("/WEB-INF/jsp/demo.jsp", modelMap);
14                 }
15             }


         (2) 把 Controller 配置到 springmvc-beans.xml

            修改 src/main/resources/springmvc-beans.xml

1             <beans ...>
2                 ...
3 
4                 <!-- TestController 類對映到 "/demo" -->
5                 <bean name="/demo" class="com.example.controller.TestController"/>
6 
7                 ...
8             </beans>

    6) 執行

        跳轉到第 2 步的 “使用 tomcat7-maven-plugin, 將 tomcat 內嵌執行”,執行程式。

        訪問 http://localhost:9090/demo ,頁面輸出:

            Demo Page
    
            Message: Spring MVC Demo Page