在先前的 Spring MVC 4 Hello World XML教程示例中, 咱們已經使用XML配置開發了一個Hello World Web應用程序。可是,XML不是配置Spring應用程序的惟一途徑。或者,咱們能夠使用Java配置來配置應用程序。html
若是回頭看看以前的教程,你會發現咱們已經使用XML配置在兩個地方。第一個是 spring-servlet.xml 在這裏咱們定義的視圖解析程序識別真正的視圖,位置搜索,經過組件掃描Bean。第二個是 web.xml, 咱們定義前端控制器配置和URL模式將被尋找匹配。前端
在本教程中,咱們將再次建立一個Hello world的例子,但這個時候咱們使用Java配置。 咱們將刪除上面提到的XML文件,並經過它們對應的Java替換這些XML配置。java
- Spring 4.0.6.RELEASE
- Maven 3
- JDK 1.6
- Tomcat 8.0.21
- Eclipse JUNO Service Release 2
如今咱們開始!web
文章 使用Eclipse建立一個Maven web工程 包含使用Eclipse一步一步的嚮導來建立一個Maven項目。spring
咱們要討論以 Spring Java爲基礎的配置取決於Servlet 3.0 的API, 所以,咱們須要包含的依賴在 pom.xml 中。apache
<?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中爲他們提供了,咱們能夠設置做用範圍。swift
com.yiibai.springmvc.controller.HelloWorldControllerapi
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請求這種方法能夠服務。spring-mvc
方法說哪一種類型的HTTP請求這種方法能夠服務。 ModelMap是一個Map實現,在這裏做爲替代[request.getAttribute()/request.setAttribute()] 設定值做爲請求屬性。請注意,咱們從這個方法返回「welcome」字符串。此字符串將後綴和前綴後綴,在視圖解析器定義的前綴(見上面的 spring-servlet.xml),造成真正的視圖文件名。tomcat
建立一個新的文件夾命名爲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>
在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.
添加一個初始化類實現 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[] { "/" }; } }
有一點要記住,像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,彈出選擇:
就這樣,完成!