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
顯示結果如下所示:
就這樣,完成!