Spring提供了DispatcherServlet,,這個(gè)類(lèi)不僅負(fù)責(zé)實(shí)現(xiàn)請(qǐng)求轉(zhuǎn)發(fā),,還負(fù)責(zé)啟動(dòng)一個(gè) WebApplicationContext容器。按照Spring一貫的IoC哲學(xué),,所有的Controller都是JavaBean,,并由IoC容器統(tǒng)一管理。對(duì)于View,,則采取了更靈活的處理方式,,Spring MVC允許使用不同的View實(shí)現(xiàn),除了JSP外,,還可以使用Velocity,、Freemaker、XSLT等多種View技術(shù),。
總的來(lái)講,,要使用Spring MVC框架,需要以下步驟,。 ① 在web.xml中配置DispatcherServlet及URL映射,。
<!-- springMVC配置文件 -->
<servlet> <servlet-name>ideawu</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>ideawu</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> ② 編寫(xiě)IoC容器需要的XML配置文件,命名為<servlet-name>-servlet.xml,,放到/WEB-INF目錄下,。例如,如果DispatcherServlet在web.xml中的配置名稱(chēng)為dispatcher,,則Spring將尋找dispatcher- servlet.xml配置文件,。按上面代碼中則xml文件名為:ideawu-servlet.xml 。對(duì)于Web應(yīng)用程序,,Spring的ApplicationContext是由DispatcherServlet加載的,,它會(huì)在/WEB-INF/下查找一個(gè)名稱(chēng)為<servletName> -servlet.xml的XML配置文件來(lái)初始化Spring Web應(yīng)用程序的ApplicationContext。對(duì)于上例,,我們?cè)趙eb.xml中定義DispatcherServlet的名稱(chēng)為 dispatcher,,因此,相應(yīng)的XML配置文件就必須是/WEB-INF/dispatcher-servlet.xml,。
③ 在dispatcher- servlet.xml XML配置文件中定義訪問(wèn)URL映射方式和使用哪種View技術(shù)。/web/WEB-INF/lib目錄下的jstl.jar和standard.jar是JSP標(biāo)準(zhǔn)標(biāo)簽庫(kù),,將在JSP視圖中用到,,/web/WEB-INF/c.tld是標(biāo)簽庫(kù)的聲明文件,稍后我們會(huì)在JSP視圖文件中用到它們。
下一步便是編寫(xiě)dispatcher-servlet.xml配置文件,,首先定義URL的映射方式(HandlerMapping),。Spring提供了幾種常用的HandlerMapping。 1.使用SimpleUrlHandlerMapping SimpleUrlHandlerMapping提供了最簡(jiǎn)單的URL映射,,通過(guò)Properties將URL和Controller對(duì)應(yīng)起來(lái),,配置示例如下。 <bean id="simpleUrlHandlerMapping" class="org.springframework.web.servlet. handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="/a.html">controllerA</prop> <prop key="/b.html">controllerB</prop> </props> </property> </bean> 這種方式和Struts的配置類(lèi)似,。當(dāng)用戶請(qǐng)求一個(gè)URL時(shí),,Spring就在SimpleUrl HandlerMapping注入的Properties中查找對(duì)應(yīng)的Controller。 2.使用BeanNameUrlHandlerMapping BeanNameUrlHandlerMapping的實(shí)現(xiàn)更為簡(jiǎn)單,,每個(gè)Controller的URL與其name屬性對(duì)應(yīng),,因此,只需要對(duì)每個(gè)Controller以URL作為name,,就可以實(shí)現(xiàn)URL映射,。配置示例如下。 <bean id="beanNameUrlHandlerMapping" class="org.springframework.web.servlet. handler.BeanNameHandlerMapping" /> <bean name="/a.html" class="example.chapter7.ControllerA" /> <bean name="/a.html" class="example.chapter7.ControllerB" /> 之所以用Bean的name作為URL而不是id,,是因?yàn)閄ML規(guī)范不允許在id標(biāo)識(shí)中使用特殊字符“/”,。當(dāng)用戶請(qǐng)求一個(gè)URL時(shí),Spring將直接查找name為URL的Controller,。 使用 SimpleUrlHandlerMapping的麻煩之處在于,,添加或刪除Controller時(shí)必須要對(duì) SimpleUrlHandlerMapping做相應(yīng)的修改,而B(niǎo)eanNameUrlHandlerMapping則無(wú)需手工編寫(xiě)映射,,只需要在每個(gè) Controller中仔細(xì)定義name屬性,。如果使用XDoclet自動(dòng)生成配置文件,則可以將name在Controller的注釋中定義,,維護(hù)起來(lái)更加方便,。因此,我們推薦首先考慮使用BeanNameUrlHandlerMapping,。事實(shí)上,,如果沒(méi)有在XML配置文件中定義任何 UrlHandlerMapping,則Spring MVC默認(rèn)使用BeanNameUrlHandlerMapping,。 Spring還提供了一個(gè) ControllerClassNameHandlerMapping,,它和BeanName UrlHandlerMapping類(lèi)似,不過(guò)是將Controller的ClassName和對(duì)應(yīng)的URL關(guān)聯(lián)起來(lái),,由于這種方式靈活性欠佳,,實(shí)際使用較少。 也可以混合使用多種 UrlHandlerMapping,,但是必須為每個(gè)UrlHandlerMapping指定order屬性來(lái)表示優(yōu)先級(jí),,order值越小優(yōu)先級(jí)越高,,Spring會(huì)先查詢優(yōu)先級(jí)高的UrlHandlerMapping。若找到了對(duì)應(yīng)的Controller,,就不再繼續(xù)查詢,,否則,按照優(yōu)先級(jí)依次查詢,,直到找到為止,。若所有的UrlHandlerMapping都無(wú)法返回一個(gè)合適的Controller,并且沒(méi)有設(shè)置默認(rèn)的Controller時(shí),,就會(huì)返回給客戶端一個(gè)“404 Not Found”錯(cuò)誤,,表示不存在這個(gè)URL。
下一步需要為Spring MVC指定一個(gè)ViewResolver(視圖解析器),,指示使用何種視圖技術(shù),,以及如何解析ModelAndView返回的邏輯視圖名稱(chēng)。 這里我們直接給出使用JSP視圖的配置,,對(duì)于其他的視圖技術(shù)將會(huì)在后面講到,。 <bean id="viewResolver" class="org.springframework.web.servlet.view. InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet. view.JstlView" /> <property name="prefix" value="/" /> <property name="suffix" value=".jsp" /> </bean> prefix和suffix將和邏輯視圖名稱(chēng)一起組合成為實(shí)際視圖的路徑。例如,,對(duì)于上例,,若返回一個(gè)new ModelAndView("test", model),則實(shí)際的視圖路徑由prefix+邏輯視圖名+suffix這3部分構(gòu)成,。 /test.jsp 定義前綴(prefix)使得視圖文件無(wú)論放在何處都可以通過(guò)修改前綴來(lái)實(shí)現(xiàn)位置無(wú)關(guān)性(當(dāng)然,,必須在web目錄內(nèi)),許多應(yīng)用程序?qū)⑵浞旁?WEB-INF 目錄下,,使得用戶無(wú)法通過(guò)URL直接訪問(wèn)視圖文件以保證視圖文件的安全,;定義后綴(suffix)可以在將來(lái)用另一種視圖技術(shù)(例如,Velocity)取代現(xiàn)在的JSP視圖,,只需將后綴從“.jsp”更改為“.vm”即可,,而不必更改源代碼中的邏輯視圖名??傊?,一切目標(biāo)都是為了實(shí)現(xiàn)最大限度的解耦。
實(shí)現(xiàn)Controller
實(shí)現(xiàn)了org.springframework.web.servlet.mvc.Controller接口的Bean都可以作為有效的Controller來(lái)處理用戶請(qǐng)求,。例如,,一個(gè)最簡(jiǎn)單的TestController。 public class TestController implements Controller { public ModelAndView handleRequest(HttpServletRequest request, HttpServlet Response response) throws Exception { String name = request.getParameter("name"); if(name==null) name = "spring"; Map model = new HashMap(); model.put("name", name); model.put("time", new Date()); return new ModelAndView("test", model); } }
注意,,上例的Controller接口和返回值ModelAndView都是在Spring框架中定義的
另外需要注意的是,,ModelAndView返回的邏輯視圖是“test”,還記得在viewResolver中定義的prefix和suffix嗎,?實(shí)際的視圖名稱(chēng)由這3部分構(gòu)成便是“/test.jsp”,。 最后將這個(gè)TestController作為Bean定義在dispatcher-servlet.xml中,,由于我們準(zhǔn)備使用默認(rèn)的BeanNameUrlHandlerMapping,,因此,,需要在Bean的name中指定URL。 <bean name="/test.html" class="example.chapter7.TestController" /> 完整的dispatcher-servlet.xml配置文件的內(nèi)容如下,。 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www./schema/beans" xmlns:xsi="http://www./2001/XMLSchema-instance" xsi:schemaLocation="http://www./schema/beans http://www./schema/beans/spring-beans.xsd"> <bean name="/test.html" class="example.chapter7.TestController" /> <bean id="viewResolver" class="org.springframework.web.servlet.view. InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet. view.JstlView" /> <property name="prefix" value="/" /> <property name="suffix" value=".jsp" /> </bean> </beans> 注意,,我們沒(méi)有指定UrlHandlerMapping,Spring會(huì)自動(dòng)使用默認(rèn)的BeanNameUrl HandlerMapping,。
實(shí)現(xiàn)View
到目前為止,,我們已經(jīng)編寫(xiě)了 Controller的實(shí)現(xiàn)和配置文件,最后一步是編寫(xiě)一個(gè)JSP文件作為視圖,。由于采用了MVC架構(gòu),,視圖的任務(wù)只有一個(gè),就是將Controller 返回的Model渲染出來(lái),。Spring MVC會(huì)將Model中的所有數(shù)據(jù)全部綁定到HttpServlet Request中,,然后將其轉(zhuǎn)發(fā)給JSP,JSP只需將數(shù)據(jù)顯示出來(lái)即可,。 通過(guò)JSTL標(biāo)簽庫(kù)能進(jìn)一步簡(jiǎn)化顯示邏輯,,我們看看如何顯示TestController返回的Model。test.jsp文件的內(nèi)容如下,。 <%@ page contentType="text/html; charset=utf-8" %> <%@ taglib prefix="c" uri="http://java./jstl/core" %> <html> <head> <title>SpringMVC</title> </head> <body> <h3>Hello, <c:out value="${name}" />, it is <c:out value="${time}" /></h3> </body> </html>
現(xiàn)在,,Spring MVC所需的所有組件都已編寫(xiě)并配置完畢,我們先來(lái)回顧一下Spring MVC的處理流程,,如圖7-22所示,。 |
|
來(lái)自: rui5327 > 《springmvc》