使用Spring Web MVC構建helloworld Web應用案例。html
解決本案例的方案以下:前端
1. 建立Web工程,導入Spring Web MVC相關開發包。java
2. 在src下添加Spring Web MVC的XML配置文件。web
3. 在web.xml中配置DispatcherServlet前端控制器組件。spring
<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接口及約定方法,代碼以下:spring-mvc
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使用示例代碼以下:mvc
<bean id="jspViewResolver" class="org.springframework.web.servlet.view.
InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
步驟一: 新建web工程,並配置Spring-MVC ,並導入相關jar包。app
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世界!