Spring4 MVC HelloWorld 註解和JavaConfig範例


在這一節中,我們以 Spring4 MVC HelloWorld 注釋/JavaConfig為範例,一步一步以簡單的方式學習Spring4 MVC 的註解,專案設定,程式碼,部署和執行。


在先前的 Spring MVC 4 Hello World XML教學範例中, 我們已經使用XML組態開發了一個Hello World Web應用程式。但是,XML不是組態Spring應用程式的唯一途徑。或者,我們可以使用Java組態來組態應用程式。

如果回頭看看之前的教學,你會發現我們已經使用XML組態在兩個地方。第一個是 spring-servlet.xml 在這裡我們定義的檢視解析程式識別真正的檢視,位置搜尋,通過元件掃描Bean。第二個是 web.xml, 我們定義前端控制器組態和URL模式將被尋找匹配。

在本教學中,我們將再次建立一個Hello world的例子,但這個時候我們使用Java組態。 我們將刪除上面提到的XML檔案,並通過它們對應的Java替換這些XML組態。


以下技術堆疊需要使用到:
  • Spring 4.0.6.RELEASE
  • Maven 3
  • JDK 1.6
  • Tomcat 8.0.21
  • Eclipse JUNO Service Release 2

現在我們開始!

第1步:建立所需的目錄結構專案

文章 使用Eclipse建立一個Maven web工程 包含使用Eclipse一步一步的嚮導來建立一個Maven專案。

以下將是最後的專案結構。

現在,讓我們來新增/更新上面討論專案結構中每一個細節提到的內容。

第2步:使用Spring和Servlet依賴更新pom.xml

我們要討論以 Spring Java為基礎的組態取決於Servlet 3.0 的API, 因此,我們需要包含的依賴在 pom.xml 中。

<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
	xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.yiibai.springmvc</groupId>
	<artifactId>Spring4MVCHelloWorldNoXMLDemo</artifactId>
	<packaging>war</packaging>
	<version>1.0.0</version>
	<name>Spring4MVCHelloWorldNoXMLDemo</name>

	<properties>
		<springframework.version>4.0.6.RELEASE</springframework.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${springframework.version}</version>
		</dependency>

		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
			<version>3.1.0</version>
		</dependency>
		<dependency>
			<groupId>javax.servlet.jsp</groupId>
			<artifactId>javax.servlet.jsp-api</artifactId>
			<version>2.3.1</version>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jstl</artifactId>
			<version>1.2</version>
		</dependency>
	</dependencies>

	<build>
		<pluginManagement>
			<plugins>
				<plugin>
					<groupId>org.apache.maven.plugins</groupId>
					<artifactId>maven-war-plugin</artifactId>
					<version>2.4</version>
					<configuration>
						<warSourceDirectory>src/main/webapp</warSourceDirectory>
						<warName>Spring4MVCHelloWorldNoXMLDemo</warName>
						<failOnMissingWebXml>false</failOnMissingWebXml>
					</configuration>
				</plugin>
			</plugins>
		</pluginManagement>
		<finalName>Spring4MVCHelloWorldNoXMLDemo</finalName>
	</build>
</project> 

首先要注意這裡maven-war-plugin 外掛的宣告。正如我們將完全刪除web.xml ,我們需要組態這個外掛,以避免Maven構建war包失敗。第二個變化是加入了JSP/Servlet/Jstl 的依賴關係,這些我們可能需要,因為我們將要使用 servlet API和JSTL檢視在我們的程式碼中。在一般情況下,容器已經包含這些庫,從而在pom.xml中為他們提供了,我們可以設定作用範圍。

第3步:新增控制器

在src/main/java下新增一個控制器類,如下所示:

com.yiibai.springmvc.controller.HelloWorldController

package com.yiibai.springmvc.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
@RequestMapping("/")
public class HelloWorldController {

	@RequestMapping(method = RequestMethod.GET)
	public String sayHello(ModelMap model) {
		model.addAttribute("greeting", "Hello World from Spring 4 MVC");
		return "welcome";
	}

	@RequestMapping(value = "/helloagain", method = RequestMethod.GET)
	public String sayHelloAgain(ModelMap model) {
		model.addAttribute("greeting", "Hello World Again, from Spring 4 MVC");
		return "welcome";
	}

} 

在類名@Controller註解宣告這個類的Spring bean 以及 @RequestMapping註解宣告了這個類是預設處理程式鍵入「/」的所有請求。第一種方法沒有宣告因此任何對映,它將繼承對映的對映宣告是在類級別上,預設處理GET請求。方法二(由於額外的對映宣告使用value屬性)形式 /hello 將再次請求。屬性方法說哪種型別的HTTP請求這種方法可以服務。

方法說哪種型別的HTTP請求這種方法可以服務。 ModelMap是一個Map實現,在這裡作為替代[request.getAttribute()/request.setAttribute()] 設定值作為請求屬性。請注意,我們從這個方法返回「welcome」字串。此字串將字尾和字首字尾,在檢視解析器定義的字首(見上面的 spring-servlet.xml),形成真正的檢視檔案名。

第4步:新增檢視

建立一個新的檔案夾命名為views在WEB-INF目錄下,並新增一個簡單的JSP頁面welcome.jsp (WEB-INF/views/welcome.jsp)從控制器到簡單的存取模式值。

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

第5步:新增組態類

在src/main/java下新增下面提到的類指定的包,如下圖所示。這種構造類可以被看作是一個替代 spring-servlet.xml,因為它包含了所有必需的元件的掃描和檢視解析器的資訊。

com.yiibai.springmvc.configuration.HelloWorldConfiguration

package com.yiibai.springmvc.configuration;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.yiibai.springmvc")
public class HelloWorldConfiguration {
	@Bean
	public ViewResolver viewResolver() {
		InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
		viewResolver.setViewClass(JstlView.class);
		viewResolver.setPrefix("/WEB-INF/views/");
		viewResolver.setSuffix(".jsp");

		return viewResolver;
	}

} 

@Configuration指明該類包含註解為@Bean 生產 bean管理是由Spring容器的一個或多個bean方法。 以上組態類對應等同於以下XML:

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
 	http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
 	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">

	<context:component-scan base-package="com.yiibai.springmvc" />

	<mvc:annotation-driven />
	
	<bean
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix">
			<value>/WEB-INF/views/</value>
		</property>
		<property name="suffix">
			<value>.jsp</value>
		</property>
	</bean>

</beans>

@EnableWebMvc 等同於 mvc:annotation-driven 在XML中. 它能夠為使用@RequestMapping向特定的方法傳入的請求對映@Controller-annotated 類。

@ComponentScan 等同於 context:component-scan base-package="..." 提供 spring 在哪裡尋找 管理 beans/classes.

第6步:新增初始化類

新增一個初始化類實現 WebApplicationInitializer 在src/main/java 中使用如下圖所示指定包(在這種情況下,作為替代在 web.xml 中定義的任何 Spring 組態)。在Servlet 3.0的容器啟動時,這個類將被載入並初始化,並在啟動由servlet容器呼叫方法。

com.yiibai.springmvc.configuration.HelloWorldInitializer

package com.yiibai.springmvc.configuration;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;

import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;

public class HelloWorldInitializer implements WebApplicationInitializer {

	public void onStartup(ServletContext container) throws ServletException {

		AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
		ctx.register(HelloWorldConfiguration.class);
		ctx.setServletContext(container);

		ServletRegistration.Dynamic servlet = container.addServlet("dispatcher", new DispatcherServlet(ctx));

		servlet.setLoadOnStartup(1);
		servlet.addMapping("/");
	}

}
 

內容上面類似 web.xml 在之前的教學中的內容,因為我們使用的是前端控制器 DispatcherServlet,分配對映(URL模式的XML)和而不是提供給 Spring 組態檔案(spring-servlet.xml)的路徑,在這裡,我們正在註冊的組態類。總體而言,我們都在做同樣的事情,只是方式有所不同。

更新:請注意,現在你可以更簡潔寫上面的類[和它的最佳方法] 來擴充套件 AbstractAnnotationConfigDispatcherServletInitializer 類,如下所示:

package com.yiibai.springmvc.configuration;

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

public class HelloWorldInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

	@Override
	protected Class<?>[] getRootConfigClasses() {
		return new Class[] { HelloWorldConfiguration.class };
	}
 
	@Override
	protected Class<?>[] getServletConfigClasses() {
		return null;
	}
 
	@Override
	protected String[] getServletMappings() {
		return new String[] { "/" };
	}

}

第7步:構建和部署應用程式

有一點要記住,像WebApplicationInitializer,Spring 是基於Java 的組態API依賴於 Servlet3.0容器。確保你沒有使用Servlet宣告任何小於3.0。對於我們的情況,我們將從應用程式中刪除 web.xml 檔案。

現在構建war (無論是作為Eclipse中提到的最後一個教學)或通過Maven的命令列(mvn clean install)。部署war 到Servlet3.0容器。由於我在這裡使用Tomcat,我就乾脆把這個 war 檔案放到 Tomcat 的 webapps 檔案夾,然後在 tomcat 的bin 目錄裡面點選 start.bat 執行。

或者 右鍵工程 =>Run As => Maven install 完成後,再次 右鍵工程 =>Run As => Maven build,彈出選擇:

執行應用程式,現在我們來存取URL: http://localhost:8080/Spring4MVCHelloWorldNoXMLDemo,顯示結果如下所示:


就這樣,完成!

程式碼下載:http://pan.baidu.com/s/1nugPMcT