1.1 問題
使用Spring Web MVC構建helloworld Web應用案例。
1.2 方案
解決本案例的方案如下:
1. 創建Web工程,導入Spring Web MVC相關開發包。
- Spring API、web、webmvc等開發包。
2. 在src下添加Spring Web MVC的XML配置文件。
- 名稱可以自定義,例如spring-mvc.xml。
3. 在web.xml中配置DispatcherServlet前端控制器組件。
- DispatcherServlet組件在spring mvc中已提供,只需要配置即可。
- 配置DispatcherServlet時,同時指定XML配置文件。
<servlet> <servlet-name>springmvc</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
4. 配置HandlerMapping組件, 通過HandlerMapping組件,DispatcherServlet控制器可以將客戶HTTP請求映射到Controller組件上。 使用如下配置可以實現 當客戶發出hello.form請求時,會調用HelloController組件進行處理。
<bean class="org.springframework.web.servlet.handler.
SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/hello.form“>helloController</prop>
</props>
</property>
</bean>
5.編寫Controller組件,它負責執行具體的業務處理,可調用DAO等組件,編寫時需要實現Controller接口及約定方法,代碼如下:
public class HelloController implements Controller { public ModelAndView handleRequest( HttpServletRequest request, HttpServletResponse response) throws Exception { System.out.println("接受到請求"); return new ModelAndView("hello"); } }
Controller組件約定的handleRequest方法執行后返回一個ModelAndView對象,該對象可封裝模型數據和視圖名響應信息。並且將HelloController配置到spring-mvc.xml, 代碼如下:
<bean id="helloController" class="com.souvc.web.HelloController"/>
6. 配置視圖解析器ViewResolver。所有Controller組件都返回一個ModelAndView實例,封裝了視圖名。 Spring中的視圖以名字為標識,視圖解析器ViewResolver通過名字來解析視圖。 InternalResourceViewResolver使用示例代碼如下:
<bean id="jspViewResolver" class="org.springframework.web.servlet.view.
InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
1.3 步驟
步驟一: 新建web工程,並配置Spring-MVC ,並導入相關jar包。
http://yunpan.cn/cQwC6VXRtPjG7 訪問密碼 11a6
2. 在src下添加Spring Web MVC的XML配置文件,文件名為spring-mvc.xml。
代碼如下所示:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jpa="http://www.springframework.org/schema/data/jpa" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd" > </beans>
3. 在web.xml中配置DispatcherServlet前端控制器組件
代碼如下所示:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <!-- 指定Spring的配置文件 --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>*.form</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
4. 部署項目到Tomcat中, 並且啟動Tomcat,控制台輸出:
溫馨提示,xml 文件需要頂格,不然會報錯。
將 <?xml version="1.0" encoding="UTF-8"?> 頭部的空格刪除掉,那么重新啟動。
輸出結果分析:輸出結果中包含Spring MVC 初始化信息以及加載配置文件spring-mvc.xml的信息。這個結果說明Spring MVC配置正確成功。如果有異常輸出就要檢查配置文件是否正確。
步驟二:配置Spring HandlerMapping 組件
1. Spring HandlerMapping用於分發Web請求到Controller的映射,這個類來自Spring MVC API, 只需要配置到Spring中即可。修改spring-mvc.xml添加HandlerMapping配置。配置代碼如下:
<!-- 定義請求處理映射HandlerMapping -->
<bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<!-- 指定請求和Controller對應關系 -->
<property name="mappings" ref="urlMappings" />
</bean>
<!-- 定義請求映射表 map -->
<util:properties id="urlMappings">
<prop key="/hello.form">helloController</prop>
</util:properties>
其中HandlerMapping實現類是Spring提供的SimpleUrlHandlerMapping。SimpleUrlHandlerMapping的mappings屬性引用了id為urlMappings的Properties集合。
2. 為當前項目增加JUnit4 API,並且在項目中添加測試案例類TestCase。在TestCase類中添加測試方法testHandlerMapping(), 測試HandlerMapping配置結果, 測試代碼如下所示:
package com.souvc.test; import java.util.Properties; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.web.servlet.HandlerMapping; public class TestCase { /** HandlerMapping 映射測試 */ @Test public void testHandlerMapping(){ String cfg = "spring-mvc.xml"; ApplicationContext ac = new ClassPathXmlApplicationContext(cfg); HandlerMapping obj = ac.getBean("handlerMapping", HandlerMapping.class); Properties map = ac.getBean("urlMappings", Properties.class); System.out.println(obj); System.out.println(map); } }
測試結果如下:
org.springframework.web.servlet.handler.SimpleUrlHandlerMapping@62402af3
{/hello.form=helloController}
步驟三:新建控制器處理類HelloController,並且配置
1. 控制用於處理Web URL請求,負責執行具體的業務處理,控制器需要實現Controller接口,並且實現業務處理方法。控制器要返回ModelAndView對象,這個 對象表示控制處理結果選擇了那個View(JSP頁面作為View)用於顯示。控制器實現代碼如下所示:
package com.souvc.controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.Controller; public class HelloController implements Controller { public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse res) throws Exception { System.out.println("處理hello.form請求"); ModelAndView mv = new ModelAndView("hello"); return mv;// 調用hello.jsp } }
2. 修改spring-mvc.xml文件,將控制器HelloController配置為一個bean。這里要注意bean的ID要與urlMappings中的映射名字對應,如下:
<!-- 定義請求處理映射HandlerMapping --> <bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <!-- 指定請求和Controller對應關系 --> <property name="mappings" ref="urlMappings" /> </bean> <!-- 定義url請求映射表 map --> <util:properties id="urlMappings"> <prop key="/hello.form">helloController</prop> </util:properties> <!-- 控制器bean配置 --> <bean id="helloController" class="com.souvc.controller.HelloController" />
3. 在TestCase類中添加測試方法testHelloController() 方法測試配置bean結果,測試方法代碼如下所示:
/** 控制器測試 */ @Test public void testHelloController(){ String cfg = "spring-mvc.xml"; ApplicationContext ac = new ClassPathXmlApplicationContext(cfg); Controller obj = ac.getBean("helloController", Controller.class); System.out.println(obj); }
4. 執行測試方法,執行結果
信息: Loading XML bean definitions from class path resource [spring-mvc.xml] 2015-8-29 15:12:24 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons 信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@e4865ce: defining beans [handlerMapping,urlMappings,helloController,viewResolver]; root of factory hierarchy 2015-8-29 15:12:24 org.springframework.web.servlet.handler.AbstractUrlHandlerMapping registerHandler 信息: Mapped URL path [/hello.form] onto handler 'helloController' com.souvc.controller.HelloController@44908881
如果配置正確,將在控制台輸出helloController對象。
步驟四:添加ViewResolver組件配置
1. 在spring-mvc.xml文件中增加ViewResolver組件的配置,ViewResolver用於視圖的顯示結果處理。代碼如下所示:
<!-- 定義視圖解析器ViewResolver -->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
2. 在TestCase類中增加testViewResolver()方法,用於測試ViewReolver的配置結果, 測試方法代碼如下所示:
/** 測試ViewResolver配置 */ @Test public void testViewResolver(){ String cfg = "spring-mvc.xml"; ApplicationContext ac = new ClassPathXmlApplicationContext(cfg); ViewResolver obj = ac.getBean("viewResolver", ViewResolver.class); System.out.println("OK"+obj); }
測試結果如下:OKorg.springframework.web.servlet.view.InternalResourceViewResolver@39697b67
如果配置正確,將在控制台輸出viewResolver對象。
步驟五:新建視圖組件hello.jsp
在viewResolver聲明的前綴文件夾/WEB-INF/jsp中, 創建hello.jsp頁面。JSP代碼如下:
<%@page pageEncoding="utf-8" contentType="text/html;charset=utf-8"%>
<!DOCTYPE html>
<html>
<head>
<title>Spring Hello World!</title>
</head>
<body>
歡迎進入Spring Web MVC世界!
</body>
</html>
步驟六:測試Spring MVC流程
部署SpringMVC項目到Tomcat6中,在瀏覽器地址欄中輸入URL “http://localhost:8080/工程名/hello.form”發起請求,會得到結果如圖-7所示:
提示:發現還是會報404錯誤。可以查看一下是否是 是 /WEB-INF/jsp/ 目錄不對,並且文件名字大小寫要正確。
小結:
1. 瀏覽器向Tomcat6服務器發起Web請求“hello.form”。
2. Tomcat6 會根據web.xml的配置將 “hello.form”請求交給Spring核心控制器DispatcherServlet處理。
3. DispatcherServlet根據HandlerMapping中的urlMappings將"/hello.form"請求轉給helloController處理。
4. helloController執行handlerRequest()方法,處理請求,並且返回ModelAndView對象代表處理結果, ModelAndView對象中包含了目標視圖“hello”。
5. Spring核心控制器收到ModelAndView中包含的視圖“hello”。
6. Spring核心控制器利用ViewResolver中的前后綴應用“hello”到/WEB-INF/jsp/hello.jsp文件。
7. 執行hello.jsp 作為響應結果發送到瀏覽器。
8. 瀏覽器收到hello.jsp的執行結果: 歡迎進入Spring Web MVC世界!