一. 軟件環境
eclipse-jee-mars-R-win32-x86_64
jdk1.7.0_79
apache-tomcat-7.0.52
spring-framework-3.2.0.RELEASE-dist
二. 環境搭建及實例
2.1 新建動態web工程
2.2 導入jar包
2.3 配置Spring MVC前端控制器和訪問的url
在web.xml中配置:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> 3 <display-name>SpringMVC</display-name> 4 5 <!-- 配置SpringMVC DispatcherServlet(前端控制器) --> 6 <servlet> 7 <servlet-name>springmvc</servlet-name> 8 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 9 <init-param> 10 <!-- 指定Spring MVC啟動所需加載的配置文件 --> 11 <param-name>contextConfigLocation</param-name> 12 <param-value>classpath:springmvc.xml</param-value> 13 </init-param> 14 <load-on-startup>1</load-on-startup> 15 </servlet> 16 17 <!-- 配置DispatcherServlet所要攔截的url --> 18 <servlet-mapping> 19 <servlet-name>springmvc</servlet-name> 20 <url-pattern>/</url-pattern> 21 </servlet-mapping> 22 23 <welcome-file-list> 24 <welcome-file>index.html</welcome-file> 25 <welcome-file>index.htm</welcome-file> 26 <welcome-file>index.jsp</welcome-file> 27 <welcome-file>default.html</welcome-file> 28 <welcome-file>default.htm</welcome-file> 29 <welcome-file>default.jsp</welcome-file> 30 </welcome-file-list> 31 32 </web-app>
其中:
a) 9~13行用於指定Spring MVC啟動所需加載的配置文件,這里的配置含義是指在src目錄下。默認為WEB-INF目錄下,名稱為[servlet-name]-servlet.xml,如spring-servlet.xml
<!-- 指定Spring MVC啟動所需加載的配置文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-servlet.xml</param-value>
</init-param>
b) 14行含義為:標記容器是否在啟動的時候就加載這個servlet。
當值為0或者大於0時,表示容器在應用啟動時就加載這個servlet。
當是一個負數或者沒有指定時,則指示容器在該servlet被選擇時才加載。
正數的值越小,啟動該servlet的優先級越高。
(為什么不是true或false呢?這是因為如果我們在web.xml中設置了多個servlet的時候,可以使用load-on-startup來指定servlet的加載順序,服務器會根據load-on-startup的大小依次對servlet進行初始化。不過即使我們將load-on-startup設置重復也不會出現異常,服務器會自己決定初始化順序)。
c) 18~21行表示攔截的模式。這里是"/"表示對所有的請求都進行攔截,包括靜態資源如js,css,jpg等。關於攔截的模式以及如何訪問靜態資源詳細請看另一篇:SpringMVC訪問靜態資源的springmvc.xml配置。
2.4 既然12行指示需要加載src目錄下的一個名為springmvc.xml文件,接下來創建該文件
創建springmvc.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 xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" 7 xsi:schemaLocation="http://www.springframework.org/schema/beans 8 http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 9 http://www.springframework.org/schema/mvc 10 http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd 11 http://www.springframework.org/schema/context 12 http://www.springframework.org/schema/context/spring-context-3.2.xsd 13 http://www.springframework.org/schema/aop 14 http://www.springframework.org/schema/aop/spring-aop-3.2.xsd 15 http://www.springframework.org/schema/tx 16 http://www.springframework.org/schema/tx/spring-tx-3.2.xsd "> 17 18 <!-- 注解掃描(實現方式四), 通過掃描將帶有@Controller注解的類交由spring容器管理並維護 --> 19 <context:component-scan base-package="com.pers.controller"/> 20 21 <!-- 處理器映射器 --> 22 <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/> 23 24 <!-- 處理器適配器 --> 25 <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/> 26 27 <!-- 視圖解析器 --> 28 <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 29 <property name="prefix" value="/WEB-INF/jsp/"></property> 30 <property name="suffix" value=".jsp"></property> 31 </bean> 32 33 </beans>
其中:
a) 2~16行這些文件頭詳細介紹請看另一篇文章:XXXXXX。
b) 19行表示指定注解掃描的范圍,這里是"com.pers.controller"即:掃描com.pers.controller包下的所有文件(當然,首先需要創建package:com.pers.controller)。
c)22、25行分別配置處理器映射器和處理器適配器,實際開發中,使用下面注解驅動的方式代替上面兩種配置(更簡潔),使用這種配置默認加載了很多需要的類型轉換器,如json,還可以將自定義類型轉換器添加到該配置中。
1 <!-- 注解驅動自動注冊組件, 處理器映射器和處理器適配器通過注解驅動的方式配置代替下面的處理器映射器和處理器適配器 --> 2 <mvc:annotation-driven/>
c) 28~31行,配置視圖解析器ViewResolver,通過配置邏輯地址(前綴和后綴),將ModelAndView對象進行拆分,將model對象渲染到視圖頁面。如果不配置ViewResolver,Spring MVC默認依然將org.springframework.web.servlet.view.InternalResourceViewResolver作為ViewResolver,但是prefix和suffix的value都為空。
2.5 創建index.jsp(WebContent下)
1 <%@ page language="java" contentType="text/html; charset=UTF-8"
2 pageEncoding="UTF-8"%>
3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
4 <html>
5 <head>
6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
7 <title>SpringMVC登錄頁面</title>
8 </head>
9 <body>
10 <h2>SpringMVC示例</h2>
11 <form action="./user/login" method="post">
12 username:<input type="text" id="name" name="username" /><br/>
13 password:<input type="password" id="password" name="password" /><br/>
14 <input type="submit" value="登錄"/>
15 </form>
16 </body>
17 </html>
其中:
a) 11行action="./user/login"表示請求的url,method="post"表示post請求。
2.6 創建UserController類(com.pers.controller包下)
1 package com.pers.controller; 2 3 import org.springframework.stereotype.Controller; 4 import org.springframework.web.bind.annotation.RequestMapping; 5 import org.springframework.web.bind.annotation.RequestMethod; 6 import org.springframework.web.servlet.ModelAndView; 7 8 /** 9 * @author liangyadong 10 * @date 2017年2月28日 下午2:25:39 11 * @version 1.0 12 */ 13 @Controller 14 @RequestMapping("/user") 15 public class UserController { 16 17 @RequestMapping(value="/login",method={RequestMethod.POST,RequestMethod.GET}) 18 public ModelAndView login(String username, String password){ 19 ModelAndView mv = new ModelAndView(); 20 // 指定返回頁面loginSucc.jsp 21 mv.setViewName("loginSucc");// 當不配置視圖解析器的時候,參數loginSucc改為:/WEB-INF/jsp/loginSucc.jsp 22 // 設置返回信息 23 mv.addObject("msg", "歡迎,登錄成功!"); 24 return mv; 25 } 26 27 }
其中:
a) 13行@Controller注解,表明自己是一個Controller。
b) 14行@RequestMapping("/user")注解,和17行@RequestMapping(value="/login")注解共同組合為/user/login作為jsp中請求的url。/user注解放在類上,/login注解放在方法上並且與方法名login()相同。之所以拆開,目的是分類化管理Controller,這一點稱為“窄化請求”。
c) 14行@RequestMapping(value="/login",method={RequestMethod.POST,RequestMethod.GET})的method限定請求方法。
d) 21行指定返回的頁面loginSucc.jsp,不是瞎返回的,這個jsp的位置是和springmvc.xml配置文件的視圖解析器相匹配的,視圖解析器前綴"/WEB-INF/jsp/",后綴".jsp",意思就是返回這個目錄下的頁面loginSucc.jsp。
e) 關於Controller的返回值可以參考另一篇文章:XXXXXX
2.7 創建返回成功的頁面
創建loginSucc.jsp
1 <%@ page language="java" contentType="text/html; charset=UTF-8"
2 pageEncoding="UTF-8"%>
3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
4 <html>
5 <head>
6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
7 <title>SpringMVC歡迎頁面</title>
8 </head>
9 <body>
10 返回信息:${msg} 11 </body>
12 </html>
2.8 測試
將該動態工程加入tomcat,啟動tomcat,打開瀏覽器地址欄輸入:localhost:8080/SpringMVC/index.jsp,如下圖所示:
點擊"登錄",成功跳轉到登錄成功頁面如下圖:
三. 附圖
3.1. 最終項目結構圖:
四. 總結
以上是Spring MVC基於注解的實現方式,也是最常用的方式。除了注解還有非注解的實現方式,非注解的實現方式是通過實現Controller接口或HttpRequestHandler接口,但是這種方式僅僅實現了一個方法(handlerRequest()),而在實際開發中一個Controller往往代表一個模塊,該模塊下會有許多方法,那么非注解的實現方式顯然不合適了,於是就通過注解的方式實現來解決。
默認加載的配置信息(在web.servlet中的DispatcherServlet.properties中配置了默認的各種器)詳見下圖:
可以看到,該文件里面加載了處理器映射器、處理器適配器、視圖解析器。
SpringMVC環境搭建並不難,重要的是要看源碼。