Spring MVC 範例

歡迎來到 Spring MVC 範例。之前在 Spring MVC 教程 中,我解釋了如何使用 Spring Tool Suite 創建 Spring MVC 應用程序。但今天,我將使用 Maven 和 Eclipse 創建一個基本的 hello world Spring MVC 應用程序。

Spring MVC 範例

Spring MVC 基於模型-視圖-控制器架構。下面的圖像顯示了 Spring MVC 架構的高級。 DispatcherServlet 是前端控制器類,負責接收所有請求並開始處理它們。我們必須在 web.xml 文件中對其進行配置。它的工作是將請求傳遞給適當的控制器類,並在視圖頁面渲染完成後發送響應。 HomeController.java 將是我們 Spring MVC 範例應用程序中的唯一控制器類。 home.jspuser.jsp 是我們 Spring MVC hello world 範例應用程序中的視圖頁面。 User.java 將是我們 Spring MVC 範例 Web 應用程序中唯一的模型類。

Spring MVC示例Hello World Eclipse項目

下圖顯示了我們在Eclipse中的Spring MVC示例項目。讓我們開始並從頭開始創建我們的項目。

Spring MVC示例Eclipse項目設置

由於這是一個網絡應用程序,我們想要使用maven進行依賴管理,首先我們必須創建一個動態Web應用程序,然後將其轉換為一個maven項目。以下圖像顯示了如何執行此操作並準備好我們的項目骨架結構。在項目瀏覽器窗口上右鍵單擊,然後單擊“新建 -> 動態Web項目”,如下圖所示。 在下一個彈出頁面中提供名稱為“spring-mvc-example”,其餘的事情不需要更改。 在下一頁上,將源文件夾提供為“src/main/java”。在添加之前,您可能需要從列表中刪除“src”文件夾。 接下來是Web模塊頁面,將應用程序的上下文根提供為“spring-mvc-example”,並確保勾選“生成web.xml部署描述符”選項。 點擊“完成”,您將在eclipse項目瀏覽器中擁有一個新的動態Web項目。

將動態 Web 項目轉換為 Maven 項目

我們想要使用 Maven 輕鬆管理我們的 Spring MVC 依賴項。因此,讓我們將我們的 Web 項目轉換為 Maven。右鍵點擊項目,選擇“配置 -> 轉換為 Maven 項目”。接下來,按照下面所示提供 pom.xml 配置。我們的 Maven Web 應用項目骨架代碼已準備就緒。現在我們可以開始對其進行更改,並創建我們的 Spring MVC Hello World 範例應用程序。

將 Spring MVC 依賴項添加到 pom.xml

我們需要在 pom.xml 中添加 spring-web 和 spring-webmvc 依賴項,同時添加 servlet-api、jsp-api 和 jstl 依賴項。我們的最終 pom.xml 文件將如下所示。

<project xmlns="https://maven.apache.org/POM/4.0.0" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="https://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.journaldev.spring.mvc</groupId>
	<artifactId>spring-mvc-example</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>war</packaging>
	<name>Spring MVC Example</name>
	<description>Spring MVC Hello World Example</description>

	<!-- Add Spring Web and MVC dependencies -->
	<dependencies>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>4.3.9.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
			<version>4.3.9.RELEASE</version>
		</dependency>
		<!-- Servlet -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<version>2.5</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet.jsp</groupId>
			<artifactId>jsp-api</artifactId>
			<version>2.1</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jstl</artifactId>
			<version>1.2</version>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.6.1</version>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
				</configuration>
			</plugin>
			<plugin>
				<artifactId>maven-war-plugin</artifactId>
				<version>3.0.0</version>
				<configuration>
					<warSourceDirectory>WebContent</warSourceDirectory>
				</configuration>
			</plugin>
		</plugins>
		<finalName>${project.artifactId}</finalName> <!-- added to remove Version from WAR file -->
	</build>
</project>

通知中的finalName配置在构建中很重要,这样我们的WAR文件名称就不会包含版本详细信息。当项目在Eclipse中构建时,您会注意到所有的JAR文件都出现在Maven依赖项部分。

Spring MVC DispatcherServlet作为前端控制器

我们必须将Spring MVC框架添加到我们的Web应用程序中,为此,我们需要在web.xml中配置DispatcherServlet,如下所示。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns="https://java.sun.com/xml/ns/javaee" xsi:schemaLocation="https://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>spring-mvc-example</display-name>

	<!-- Add Spring MVC DispatcherServlet as front controller -->
	<servlet>
        <servlet-name>spring</servlet-name>
        <servlet-class>
                org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <init-param>
       		<param-name>contextConfigLocation</param-name>
       		<param-value>/WEB-INF/spring-servlet.xml</param-value>
    		</init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
 
    <servlet-mapping>
        <servlet-name>spring</servlet-name>
        <url-pattern>/</url-pattern> 
    </servlet-mapping>
    
 </web-app>

contextConfigLocation init-param用于提供Spring bean配置文件的位置。

Spring MVC示例Bean配置文件

下一步是创建Spring Bean配置文件spring-servlet.xml,如下所示。

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

	<!-- DispatcherServlet Context: defines this servlet's request-processing 
		infrastructure -->

	<!-- Enables the Spring MVC @Controller programming model -->
	<annotation-driven />
	<context:component-scan base-package="com.journaldev.spring" />

	<!-- Resolves views selected for rendering by @Controllers to .jsp resources 
		in the /WEB-INF/views directory -->
	<beans:bean
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<beans:property name="prefix" value="/WEB-INF/views/" />
		<beans:property name="suffix" value=".jsp" />
	</beans:bean>

</beans:beans>

有三个重要的配置。

  1. annotation-driven告诉DispatcherServlet使用@Controller 注解查找Controller类。
  2. context:component-scan告诉DispatcherServlet在哪里查找控制器类。
  3. InternalResourceViewResolver bean 配置指定視圖頁面的位置和使用的後綴。Controller 類方法返回視圖頁面的名稱,然後添加後綴以確定用於呈現響應的視圖頁面。

Spring MVC 控制器類

我們有一個單一的控制器類來回應兩個 URI – “/” 用於首頁和 “/user” 用於用戶頁面。

package com.journaldev.spring.controller;

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.journaldev.spring.model.User;

@Controller
public class HomeController {

	/**
	 * Simply selects the home view to render by returning its name.
	 */
	@RequestMapping(value = "/", method = RequestMethod.GET)
	public String home(Locale locale, Model model) {
		System.out.println("Home Page Requested, locale = " + locale);
		Date date = new Date();
		DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);

		String formattedDate = dateFormat.format(date);

		model.addAttribute("serverTime", formattedDate);

		return "home";
	}

	@RequestMapping(value = "/user", method = RequestMethod.POST)
	public String user(@Validated User user, Model model) {
		System.out.println("User Page Requested");
		model.addAttribute("userName", user.getUserName());
		return "user";
	}
}

請注意,為了簡單起見,我沒有使用任何日誌框架,例如 log4j

Spring MVC 模型類

我們有一個簡單的模型類,帶有一個變量及其 getter-setter 方法。這是一個簡單的 POJO 類。

package com.journaldev.spring.model;

public class User {
	private String userName;

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}
}

Spring MVC 視圖頁面

我們有以下定義的兩個視圖頁面。 home.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib uri="https://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ page session="false"%>
<html>
<head>
<title>Home</title>
</head>
<body>
	<h1>Hello world!</h1>

	<P>The time on the server is ${serverTime}.</p>

	<form action="user" method="post">
		<input type="text" name="userName"><br> <input
			type="submit" value="Login">
	</form>
</body>
</html>

user.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>User Home Page</title>
</head>
<body>
<h3>Hi ${userName}</h3>
</body>
</html>

注意到Spring MVC會將表單變量映射到模型類變量,這就是為什麼兩個地方都有相同的變量名稱。就是這樣,我們的Spring MVC示例項目已準備好部署和測試了。

Spring MVC Eclipse項目部署

我們可以使用Eclipse的導出WAR文件選項直接部署到運行中的任何tomcat服務器的webapps目錄。但是您也可以使用命令行構建該項目,然後將其複製到您喜歡的servlet容器部署目錄中。

Spring MVC示例測試

一旦部署了 Spring MVC 項目,我們可以在首頁訪問 https://localhost:8080/spring-mvc-example/。請相應地更改 Tomcat 端口和上下文根。 這就是 Spring MVC 實例的全部內容,我已經盡量保持簡單。但如果您遇到任何問題,請通過評論讓我知道,我會盡力幫助您解決。您可以從下面的鏈接下載最終的 Spring MVC 實例項目。

下載 Spring MVC 實例項目

參考文獻:官方頁面

Source:
https://www.digitalocean.com/community/tutorials/spring-mvc-example