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> </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