做爲一個J2EE的開發者,咱們基本上是開發基於WEB的應用系統。事實上,工做流,狀態管理以及驗證都是須要解決的重要功能。而HTTP協議的無狀態性決定了這些功能都不容易實現。Spring的WEB框架就是來幫助咱們解決這些問題的。使用Spring,咱們可讓WEB框架自動將傳遞進來的請求參數填充到模型對象中,同時提供驗證和錯誤處理。還能夠管理用戶在WEB表單中建立的對象的狀態。在瞭解SpringMVC以前,咱們先來複習下MVC.html
MVC從邏輯上把應用分爲模型組件,視圖組件和控制器組件。其中控制器組件又能夠細分爲:前端控制器組件和後端控制器組件。前端
咱們來看一下MVC的基本工做流程:java
首先是客戶端(一般是瀏覽器)發出一個請求。第一個接受這個請求的組件通常是一個前端控制器。它將不一樣的請求交給不一樣的後端控制器來處理,而在後端控制器裏面又能夠調用相應的模型對象來處理具體的業務邏輯,最後再返回一個特定的視圖響應給客戶端。web
怎麼理解MVC呢?咱們舉一個現實的例子,前段時間地震太可怕了,全國人民都在上下一心抗震救災。咱們敬愛的溫總理給武警司令下命令讓他完成抗震救災的艱鉅任務,因而武警司令就根據各地狀況派遣不一樣類型的特種兵到不一樣的地區去,而後特種兵使用大大小小的工具完成了任務,最後上交給司令一份統計圖表,司令再上交給溫總理。咱們就來分析一下,這符不符合MVC的設計模式。這裏呢,溫總理就是客戶端,武警司令就是前端控制器,特種兵就是後端控制器,特種兵所使用的工具就是模型,最後上交的統計圖表就是視圖。spring
如今你們應該能夠理解MVC的設計思想了。拿咱們比較熟悉的struts框架來講,前端控制器就是ActionServlet,後端控制器就是Action.請求的URL和後端控制器的映射關係在struts-config.xml上的<action-mappings>裏面配置,模型對象就是咱們日常寫的DAO/DTO,返回的視圖類型通常就是jsp了。後端
那麼,在spring MVC中又是怎樣的呢?,咱們先按上面對號入座地說一下。第一個接受這個請求的前端控制器叫DispatcherServlet,後端控制器叫Controller。負責處理請求URL和後端控制器映射的叫HandMapping,它有多種類型,比較靈活,也是在一個xml文件上進行配置。負責業務邏輯處理的模型對象通常也是咱們日常寫的DAO/DTO組件。只是它最後的返回更靈活,Controller返回一個ModelAndView對象給DispatcherServlet,ModelAndView能夠攜帶一個視圖對象,也能夠攜帶一個視圖對象的邏輯名。若是攜帶的是一個視圖對象的邏輯名,那DispatcherServlet須要一個ViewResolver來查找用於渲染迴應的視圖對象。最後,DispatcherServlet將請求分派給ModelAndView對象指定的視圖對象。視圖對象負責渲染返回給客戶的迴應。設計模式
咱們學習知識,同樣要注意運用類比遷移的方法。有人說,我學會了struts,但學不會springMVC。這是說不過去的。由於兩者的思想徹底一致。因此,咱們只須要學習它們不同的地方就能夠啦。好,咱們如今先跑一個最簡單的例子,讓你們對構建SpringMVC的基本步驟有個直觀的認識。你們要邊跑邊跟struts作比較。瀏覽器
(1)創建動態web工程,導入spring的jar包。服務器
(2)配置DispatcherServletmvc
DispatcherServlet是SpringMVC的核心,將下面Servlet的註冊信息登記在web.xml中。必定要記住:Servlet跟伴侶同樣,要結婚,先得註冊登記!
<servlet>
<servlet-name>test</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>test</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
(3)編寫Controller,作核心配置文件,並配置url和Controller的映射
package com.wepull.test;
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 request,
HttpServletResponse response) throws Exception {
request.setAttribute("hello", "welcome to spring!");
return new ModelAndView("welcome");
}
}
咱們知道Struts有個XML格式的核心配置文件,springMVC固然也有,在WEB-INF下新建一XML文件:test-servlet.xml.注意,這裏的test取決於servlet的名字.當DispatcherServlet載入後,它將試圖從這個文件中載入應用上下文。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN""http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!--缺省映射處理器,不須要明確聲明,但聲明後就很是清楚使用的是哪一個映射處理器 --> <beanid="beanNameUrlMapping"
class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
</bean>
<!-- 這裏的name屬性有兩個職責,既定義Bean的名字,也定義須要這個控制器處理的URL樣式 -->
<bean name="/hello.do"
class="com.wepull.test.HelloController">
</bean>
</beans>
上面可能有人奇怪,爲何不用id屬性,而設置name屬性。這裏是由於URL中含有XML id屬性非法字符——特別是斜槓(/);
(4)配置一個視圖解析器將控制器與JSP結合起來。
將解析器的配置片斷加到上面的test-servlet.xml中。
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
InternalResourceViewResolver在ModelAndView返回的視圖名前加上prefix屬性配置的前綴,再在最後加上suffix屬性配置的後綴。因爲HelloController返回的ModelAndView中視圖名爲welcome,因此InternalResourceViewResolver將在/WEB-INF/jsp/welcome.jsp處查找視圖。
(5)編寫呈現給用戶的jsp文件。
/WEB-INF/jsp/welcome.jsp
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page isELIgnored="false" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Hello World!</title>
</head>
<body>
<h2>
${hello}
</h2>
</body>
</html>
完成後啓動服務器,在瀏覽器地址欄上輸入http://locahost:8080/projectName/hello.do 就能夠訪問了。
對照一下,咱們發現SpringMVC跟Struts大同小異。只是有兩處映射,SpringMVC作的相對靈活。哪兩處呢?
(1) url和動做(後端控制器)的映射。
springMVC裏有個映射處理器(HandlerMapping)的概念。它其實是一個處理器映射Bean,用來將一個控制器指定到一個URL上。Spring提供了三種有用的HandlerMapping的實現:
—— BeanNameUrlHandlerMapping
根據控制器的名字將控制器映射到URL
—— SimpleUrlHandlerMapping
用上下文配置文件中定義的屬性集合將控制器映射到URL
—— CommonsPathMapHandlerMapping
使用控制器代碼中的元數據將控制器映射到URL
(2) 邏輯視圖名和視圖對象的映射。
springMVC裏還有個視圖解析器(ViewResolver)的概念。它決定了ModelAndView對象的邏輯視圖名如何解析成一個用於將結果渲染給用戶的視圖Bean..Spring有四種ViewResolver實現:
—— InternalResourceViewResolver
將邏輯視圖名解析成一個用模板文件(如JSP和Velocity模板)渲染的視圖對象
—— BeanNameViewResolver
將邏輯視圖名解析成一個DispatcherServlet應用上下文中的視圖Bean
—— ResourceBundleViewResolver
將邏輯視圖名解析成一個ResourceBundler中的視圖對象
—— XmlViewResolver
從一個XML文件中解析視圖Bean,這個文件是從DispatcherServlet應用上下文中分離出來的。
好啦,今天就算是SpringMVC的一個入門。建議你們將Struts和SpringMVC對照着學習,那樣效果會更好。與人分享,集思廣益。但願你們都可以學習快樂,工做順心。下次再見。