Spring-MVC入門(一):入門實例
引言
1.MVC :Model-View-Control
框架性質的C 層要完成的主要工作:封裝web 請求為一個數(shù)據(jù)對象、調用業(yè)務邏輯層來處理數(shù)據(jù)對象、返回處理數(shù)據(jù)結果及相應的視圖給用戶。
2. 簡要概述springmvc
Spring C 層框架的核心是 DispatcherServlet,它的作用是將請求分發(fā)給不同的后端處理器,也即 使用了一種被稱為Front Controller 的模式(后面對此模式有簡要說明)。 Spring 的C 層框架使用了后端控制器來、映射處理器和視圖解析器來共同完成C 層框架的主要工作。并且spring 的C 層框架還真正地把業(yè)務層處理的數(shù)據(jù)結果和相應的視圖拼成一個對象,即我們后面會經(jīng)常用到的ModelAndView 對象。
一、入門實例
1. 搭建環(huán)境
在spring 的官方API 文檔中,給出所有包的作用概述,現(xiàn)列舉常用的包及相關作用:
org.springframework.aop-3.0.5.RELEASE.jar :與Aop 編程相關的包
org.springframework.beans-3.0.5.RELEASE.jar :提供了簡捷操作bean 的接口
org.springframework.context-3.0.5.RELEASE.jar :構建在beans 包基礎上,用來處理資源文件及國際化。
org.springframework.core-3.0.5.RELEASE.jar :spring 核心包
org.springframework.web-3.0.5.RELEASE.jar :web 核心包,提供了web 層接口
org.springframework.web.servlet-3.0.5.RELEASE.jar :web 層的一個具體實現(xiàn)包,DispatcherServlet也位于此包中。
后文全部在spring3.0 版本中進行,為了方便,建議在搭建環(huán)境中導入spring3.0 的所有jar 包(所有jar 包位于dist 目錄下)。
2. 編寫HelloWorld 實例
步驟一、建立名為springMVC_01_helloword ,并導入上面列出的jar 包。
步驟二、編寫web.xml 配置文件,代碼如下:
Java代碼
- "1.0" encoding="UTF-8"?>
"2.4" xmlns="http://java.sun.com/xml/ns/j2ee" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
- http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
spmvc class> class>- org.springframework.web.servlet.DispatcherServlet
1 spmvc *. do
簡要說明 :DispatcherServlet 就是一個Servlet ,也是對請求進行轉發(fā)的核心Servlet 。在這里即所有.do 的請求將首先被DispatcherServlet 處理,而DispatcherServlet 它要作的工作就是對請求進行分發(fā)(也即是說把請求轉發(fā)給具體的Controller )??梢院唵蔚卣J為,它就是一個總控處理器,但事實上它除了具備總控處理理器對請求進行分發(fā)的能力外,還與spring 的IOC 容器完全集成在一起,從而可以更好地使用spring 的其它功能。在這里還需留意 < servlet-name > spmvc ,下面步驟三會用到。
步驟三、建立 spmvc-servlet.xml 文件,它的命名規(guī)則: servlet-name-servlet.xml 。它的主要代碼如下:
Xml代碼
- xml version="1.0" encoding="UTF-8" ?>
- >
- <beans>
- <bean id="simpleUrlHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
- <property name="mappings">
- <props>
- <prop key="/hello.do">helloControl< span>prop>
- < span>props>
- < span>property>
- < span>bean>
- <bean id="helloControl" class="com.asm.HelloWord">< span>bean>
- < span>beans>
說明: hello.do 的請求將給名為 helloControl 的 bean 進行處理。
步驟四、完成 HelloWord.java 的編寫,代碼如下:
Java代碼
- package com.asm;
- 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 HelloWord implements Controller {
- public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)
- throws Exception {
- ModelAndView mav = new ModelAndView("hello.jsp");
- mav.addObject("message", "Hello World!");
- return mav;
- }
- }
說明 :ModelAndView 對象是包含視圖和業(yè)務數(shù)據(jù)的混合對象,即是說通過此對象,我們可以知道所返回的相應頁面(比如這里返回hello.jsp 頁面),也可以在相應的頁面中獲取此對象所包含的業(yè)務數(shù)據(jù)(比如這里message-hello worrld )。
步驟五、在當前項目web 根目錄下編寫hello.jsp ,主要代碼如下:
< body >
世界,你好!
獲取值: ${message }
步驟六:輸入 .../hello.do 進行測試。
4. 簡析spring mvc 工作原理
(1 )啟動服務器,根據(jù)web.xml 的配置加載前端控制器(也稱總控制器) DispatcherServlet 。在加載時、會完成一系列的初始化動作。
(2 )根據(jù)servlet 的映射請求(上面的helloWorld 實例中針對.do 請求),并參照“控制器配置文件”(即spmvc-servlet.xml 這樣的配置)文件,把具體的請求分發(fā)給特定的后端控制器進行處理(比如上例會分發(fā)給HelloWorld 控制器進行處理)
(3 )后端控制器調用相應的邏輯層代碼,完成處理并返回視圖對象( ModelAndView )給前端處理器。
(4 )前端控制器根據(jù)后端控制器返回的 ModelAndView 對象,并結合一些配置(后面有說明),返回一個相應的頁面給客戶端。
小結 :這種Front Controller 模式常應用在主流的web 框架中,比如典型的struts1.x 框架.Front Controller 模式:所有請求先交給一個前端處理器(總控處理器)處理,然后前端處理器會參照一些配置文件再把具體的請求交給相應的后端處理器。后端處理器調用邏輯層代碼,并根據(jù)邏輯返回相應的視圖對象給前端控制器。然后前端控制器再根據(jù)視圖對象返回具體的頁面給客戶端(提示:和spring mvc 一樣,在struts1.x 中前端控制器是Servlet, 而在struts2 中前端控制器是Filter )。 概述 Front Controller 模式:前端控制器預處理并分發(fā)請求給后端控制器,后端控制器進行真正的邏輯處理并返回視圖對象,前端控器器根據(jù)視圖對象返回具體頁面給客戶端。
5. 初識spring mvc 的視圖
在前面的HelloWorld 實例中,在HelloWorld.java 中返回 ModelAndView mav = new ModelAndView( "hello.jsp" ) 參數(shù)為 hello.jsp ,它會對應于當前項目根目錄下的 hello.jsp 頁面。但 spring mvc 為我們提供了一個特別的視圖定位方式,下面改進前面的 HelloWord 實例:
改進一 :在 spmvc-servlet.xml 中增加如下代碼:
Xml代碼
- <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
- <property name="prefix" value="/WEB-INF/page/" />
- <property name="suffix" value=".jsp" />
- < span>bean>
改進二 :在HelloWorld.java 重新定義返回的 ModelAndView 對象,即把 ModelAndView mav = new ModelAndView( "hello.jsp" ) 改為 ModelAndView mav = new ModelAndView( "hello" )
改進三 :在/WEB-INF/page 目錄下建立hello.jsp 頁面
進行上面三個改進操作后,重新訪問hello.do 會訪問到WEB-INF/page/hello.jsp 頁面。
簡析視圖定位 :當返回 ModelAndView 對象名稱為hello 時,會給hello 加上前后綴變成
/WEB-INF/page/hello.jsp 。因此在給前后綴賦值時,應特別注意它和返回的 ModelAndView 對象能否組成一個正確的文件全路徑。在前面的“簡析spring mvc 工作原理(4) ”點中提到在根據(jù)ModelAndView 對象返回頁面時,會結合一些配置。這里就是結合了視圖定位方式,給viewName 加上前后綴進行定位。
【編輯推薦】