springMVC配置

作爲一個J2EE的開發者,我們基本上是開發基於WEB的應用系統。事實上,工作流,狀態管理以及驗證都是需要解決的重要功能。而HTTP協議的無狀態性決定了這些功能都不容易實現。Spring的WEB框架就是來幫助我們解決這些問題的。使用Spring,我們可以讓WEB框架自動將傳遞進來的請求參數填充到模型對象中,同時提供驗證和錯誤處理。還可以管理用戶在WEB表單中創建的對象的狀態。在瞭解SpringMVC之前,我們先來複習下MVC.

MVC從邏輯上把應用分爲模型組件,視圖組件和控制器組件。其中控制器組件又可以細分爲:前端控制器組件和後端控制器組件。

 

我們來看一下MVC的基本工作流程:

 

首先是客戶端(通常是瀏覽器)發出一個請求。第一個接受這個請求的組件一般是一個前端控制器。它將不同的請求交給不同的後端控制器來處理,而在後端控制器裏面又可以調用相應的模型對象來處理具體的業務邏輯,最後再返回一個特定的視圖響應給客戶端。

 

怎麼理解MVC呢?我們舉一個現實的例子,前段時間地震太可怕了,全國人民都在上下一心抗震救災。我們敬愛的溫總理給武警司令下命令讓他完成抗震救災的艱鉅任務,於是武警司令就根據各地情況派遣不同類型的特種兵到不同的地區去,然後特種兵使用大大小小的工具完成了任務,最後上交給司令一份統計圖表,司令再上交給溫總理。我們就來分析一下,這符不符合MVC的設計模式。這裏呢,溫總理就是客戶端,武警司令就是前端控制器,特種兵就是後端控制器,特種兵所使用的工具就是模型,最後上交的統計圖表就是視圖。

 

現在大家應該可以理解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工程,導入springjar包。

 

(2)配置DispatcherServlet

 

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,做核心配置文件,並配置urlController的映射

 

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>

InternalResourceViewResolverModelAndView返回的視圖名前加上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對照着學習,那樣效果會更好。與人分享,集思廣益。希望大家都能夠學習快樂,工作順心。下次再見。


轉自:http://blog.csdn.net/lenotang/article/details/2562348

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章