spring的ModelAndView
http://blog.csdn.net/chho/article/details/279145
Spring入門19 - ModelAndView類別
分類: Spring 2005-02-03 14:07 4283人閱讀 評論(5) 收藏 舉報入門 19 - ModelAndView類別
ModelAndView類別就如其名稱所示,是代表了MVC Web程序中Model與View的對象,不過它只是方便您一次返回這兩個對象的holder,Model與View兩者仍是分離的概念。
最簡單的ModelAndView是持有View的名稱返回,之后View名稱被view resolver,也就是實作org.springframework.web.servlet.View接口的實例解析,例如 InternalResourceView或JstlView等等:
ModelAndView(String viewName)
如果您要返回Model對象,則可以使用Map來收集這些Model對象,然后設定給ModelAndView,使用下面這個版本的ModelAndView:
ModelAndView(String viewName, Map model)
Map對象中設定好key與value值,之后可以在視圖中取出,如果您只是要返回一個Model對象,則可以使用下面這個ModelAndView版本:
ModelAndView(String viewName, String modelName, Object modelObject)
藉由modelName,您可以在視圖中取出Model并顯示。
ModelAndView類別提供實作View接口的對象來作View的參數(shù):
ModelAndView(View view)
ModelAndView(View view, Map model)
ModelAndView(View view, String modelName, Object modelObject)
一個例子是org.springframework.web.servlet.view.RedirectView,ModelAndView預設是使 用forward來轉發(fā)請求結果至視圖,使用RedirectView的話,則會使用redirect將請求重導至視圖,例如:
…
public ModelAndView handleRequest(....) … {
??? ....
???
??? return?new ModelAndView(new RedirectView(this.getViewPage()));
}
....
在這邊,viewPage的地址是從服務器網(wǎng)頁根目錄開始指定,而不是Web應用程序的根目錄,所以您的getViewPage()傳回的地址必須像是 /springapp/pages/index.htm這樣的地址,其中springapp是您的Web應用程序目錄。
使用forward的話,網(wǎng)址列上并不會出現(xiàn)被轉發(fā)的目標地址,而且forward是在Web應用程序之內進行,可以訪問Web應用程序的隱藏目錄,像是WEB-INF,然而forward只能在Web應用程序中進行,不能指定至其它的Web應用程序地址。
使用redirect的話,是要求客戶端瀏覽器重新發(fā)出一個指定的請求地址,因此網(wǎng)址列上會出現(xiàn)被重導的目錄地址,重導的請求是由瀏覽器發(fā)出,所以不能 訪問Web應用程序中的隱藏目錄,像是WEB-INF,然而重導是重新要求一個網(wǎng)頁,所以可以指定至其它的Web應用程序地址。
DispatcherServlet會根據(jù)傳回的ModelAndView來解析View名稱,并處理給予的Model。View名稱的解析是委托給實 作org.springframework.web.servlet.ViewResolver接口的實例,ViewResolver接口定義如下:
public?interface ViewResolver {
??? public view resolveViewName(String, Locale locale) throws ServletException;
}
ViewResolver的一個實例是InternalResourceViewResolver,名稱解析完之后,實際的View繪制與Model轉 換處理是交給實作org.springframework.web.servlet.View的實例,View接口如下:
public?interface View {
??? public void render(Map model, HttpServletResquest resquest, HttpServletResponse response) throws ServletException, IOException;
}
View的實作之前用過org.springframework.web.servlet.view.InternalResourceView,另外也還有JstlView、TilesView、VelocityView等等的實作,分別進行不同的表現(xiàn)展處理。
==============http://frederick.iteye.com/blog/44463
Spring學習日記 - ModelAndView的構造
- 博客分類:
- Spring和持久層
???
ModelAndView()
??? 這個構造方法構造出來的ModelAndView不能直接使用,應為它沒有指定view,也沒有綁定對應的model對象。當然,model對象不是必須的,但是view確實必須的。
??? 用這個構造方法構造的實例主要用來在以后往其中加view設置和model對象。
???
??? 給ModelAndView實例設置view的方法有兩個:setViewName(String viewName) 和 setView(View view)。前者是使用view name,后者是使用預先構造好的View對象。其中前者比較常用。事實上View是一個接口,而不是一個可以構造的具體類,我們只能通過其他途徑來獲取View的實例。對于view name,它既可以是jsp的名字,也可以是tiles定義的名字,取決于使用的ViewNameResolver如何理解這個view name。
??? 如何獲取View的實例以后再研究。
而對應如何給ModelAndView實例設置model則比較復雜。有三個方法可以使用:
addObject(Object modelObject)
addObject(String modelName, Object modelObject)
addAllObjects(Map modelMap)
ModelAndView可以接收Object類型的對象,ModelAndView將它視為其眾多model中的一個。當使用Object類型的對象的時候,必須指定一個名字。ModelAndView也可以接收沒有明顯名字的對象,原因在于ModelAndView將調用spring自己定義的Conventions 類的.getVariableName()方法來為這個model生成一個名字。顯然,對model而言,名字是必須的。
Conventions.getVariableName()生成名字的規(guī)則是使用對象的類名的小寫模式來作model名字。當這個model是集合或數(shù)組的時候,使用集合的第一個元素的類名加s來作model的名字。
ModelAndView也可以接收Map類型的對象,ModelAndView將這個Map中的元素視為model,而不是把這個Map本身視為model。但是其他的集合類可以用本身作為model對象。
實際上,ModelAndView對model的支持來自于類ModelMap,這個類繼承自HashMap。
?
==============
http://blog.csdn.net/wangyaoheng/article/details/2465834
Spring MVC的實現(xiàn)原理
分類: spring 2008-05-21 13:53 3997人閱讀 評論(11) 收藏 舉報 Spring提供了DispatcherServlet,這個類不僅負責實現(xiàn)請求轉發(fā),還負責啟動一個WebApplicationContext容器。 按照Spring一貫的IoC哲學,所有的Controller都是JavaBean,并由IoC容器統(tǒng)一管理。對于View,則采取了更靈活的處理方 式,Spring MVC允許使用不同的View實現(xiàn),除了JSP外,還可以使用Velocity、Freemaker、XSLT等多種View技術。總的來講,要使用Spring MVC框架,需要以下步驟。
① 在web.xml中配置DispatcherServlet及URL映射。
② 編寫IoC容器需要的XML配置文件,命名為<servlet-name>-servlet.xml,放到/WEB-INF目錄下。例如,如果DispatcherServlet在web.xml中的配置名稱為dispatcher,則Spring將尋找dispatcher- servlet.xml配置文件。
③ 在XML配置文件中定義URL映射方式和使用哪種View技術。
我們仍以SimpleMVC為基礎,用Spring MVC框架來實現(xiàn)這個Web應用程序。在Eclipse中創(chuàng)建一個SpringMVC項目,結構如圖7-21所示。
/web/WEB-INF/lib目錄下的jstl.jar和standard.jar是JSP標準標簽庫,將在JSP視圖中用到,/web/WEB-INF/c.tld是標簽庫的聲明文件,稍后我們會在JSP視圖文件中用到它們。
一、? 配置DispatcherServlet
首先,在web.xml中配置DispatcherServlet,并將所有以“.html”結尾的URL全部映射到DispatcherServlet上,這樣,用戶僅從URL地址上無法得知服務器端后臺使用了何種技術。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
??? <!-- spring dispatch servlet -->
??? <servlet>
??????? <servlet-name>dispatcher</servlet-name>
??????? <servlet-class>org.springframework.web.servlet.DispatcherServlet</ servlet-class>
??????? <load-on-startup>0</load-on-startup>
??? </servlet>
??? <servlet-mapping>
??????? <servlet-name>dispatcher</servlet-name>
??????? <url-pattern>*.html</url-pattern>
??? </servlet-mapping>
??? <!-- 申明taglib,將在JSP中使用 -->
??? <taglib>
??????? <taglib-uri>http://java.sun.com/jsp/jstl/core</taglib-uri>
??????? <taglib-location>/WEB-INF/c.tld</taglib-location>
??? </taglib>
</web-app>
和普 通的Spring應用程序稍有不同,對于Web應用程序,Spring的ApplicationContext是由DispatcherServlet加 載的,它會在/WEB-INF/下查找一個名稱為<servletName> -servlet.xml的XML配置文件來初始化Spring Web應用程序的ApplicationContext。對于上例,我們在web.xml中定義DispatcherServlet的名稱為 dispatcher,因此,相應的XML配置文件就必須是/WEB-INF/dispatcher-servlet.xml。
下一步便是編寫dispatcher-servlet.xml配置文件,首先定義URL的映射方式(HandlerMapping)。Spring提供了幾種常用的HandlerMapping。
1.使用SimpleUrlHandlerMapping
SimpleUrlHandlerMapping提供了最簡單的URL映射,通過Properties將URL和Controller對應起來,配置示例如下。
<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的配置類似。當用戶請求一個URL時,Spring就在SimpleUrl HandlerMapping注入的Properties中查找對應的Controller。
2.使用BeanNameUrlHandlerMapping
BeanNameUrlHandlerMapping的實現(xiàn)更為簡單,每個Controller的URL與其name屬性對應,因此,只需要對每個Controller以URL作為name,就可以實現(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,是因為XML規(guī)范不允許在id標識中使用特殊字符“/”。當用戶請求一個URL時,Spring將直接查找name為URL的Controller。
使用 SimpleUrlHandlerMapping的麻煩之處在于,添加或刪除Controller時必須要對 SimpleUrlHandlerMapping做相應的修改,而BeanNameUrlHandlerMapping則無需手工編寫映射,只需要在每個 Controller中仔細定義name屬性。如果使用XDoclet自動生成配置文件,則可以將name在Controller的注釋中定義,維護起來 更加方便。因此,我們推薦首先考慮使用BeanNameUrlHandlerMapping。事實上,如果沒有在XML配置文件中定義任何 UrlHandlerMapping,則Spring MVC默認使用BeanNameUrlHandlerMapping。
Spring還提供了一個 ControllerClassNameHandlerMapping,它和BeanName UrlHandlerMapping類似,不過是將Controller的ClassName和對應的URL關聯(lián)起來,由于這種方式靈活性欠佳,實際使用 較少。
也可以混合使用多種 UrlHandlerMapping,但是必須為每個UrlHandlerMapping指定order屬性來表示優(yōu)先級,order值越小優(yōu)先級越高, Spring會先查詢優(yōu)先級高的UrlHandlerMapping。若找到了對應的Controller,就不再繼續(xù)查詢,否則,按照優(yōu)先級依次查詢, 直到找到為止。若所有的UrlHandlerMapping都無法返回一個合適的Controller,并且沒有設置默認的Controller時,就會 返回給客戶端一個“404 Not Found”錯誤,表示不存在這個URL。
下一步需要為Spring MVC指定一個ViewResolver(視圖解析器),指示使用何種視圖技術,以及如何解析ModelAndView返回的邏輯視圖名稱。
這里我們直接給出使用JSP視圖的配置,對于其他的視圖技術將會在后面講到。
<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將和邏輯視圖名稱一起組合成為實際視圖的路徑。例如,對于上例,若返回一個new ModelAndView("test", model),則實際的視圖路徑由prefix+邏輯視圖名+suffix這3部分構成。
/test.jsp
定義 前綴(prefix)使得視圖文件無論放在何處都可以通過修改前綴來實現(xiàn)位置無關性(當然,必須在web目錄內),許多應用程序將其放在/WEB-INF 目錄下,使得用戶無法通過URL直接訪問視圖文件以保證視圖文件的安全;定義后綴(suffix)可以在將來用另一種視圖技術(例如,Velocity) 取代現(xiàn)在的JSP視圖,只需將后綴從“.jsp”更改為“.vm”即可,而不必更改源代碼中的邏輯視圖名。總之,一切目標都是為了實現(xiàn)最大限度的解耦。
二、實現(xiàn)Controller
實現(xiàn)了org.springframework.web.servlet.mvc.Controller接口的Bean都可以作為有效的Controller來處理用戶請求。例如,一個最簡單的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框架中定義的,這和SimpleMVC項目中我們自己定義的 Controller接口和ModelAndView類所在的包是不同的。在SimpleMVC項目中,我們并沒有使用Spring MVC,而是借用Spring MVC的概念自定義接口。在現(xiàn)在的SpringMVC項目中,我們沒有自定義任何接口,而是直接使用Spring MVC框架來實現(xiàn)Web應用程序,這一點請讀者務必區(qū)分清楚。
另外需要注意的是,ModelAndView返回的邏輯視圖是“test”,還記得在viewResolver中定義的prefix和suffix嗎?實際的視圖名稱由這3部分構成便是“/test.jsp”。
最后將這個TestController作為Bean定義在dispatcher-servlet.xml中,由于我們準備使用默認的BeanNameUrlHandlerMapping,因此,需要在Bean的name中指定URL。
<bean name="/test.html" class="example.chapter7.TestController" />
完整的dispatcher-servlet.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"
?????? xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/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>
注意,我們沒有指定UrlHandlerMapping,Spring會自動使用默認的BeanNameUrl HandlerMapping。
三、? 實現(xiàn)View
到目前為止,我們已經編寫了 Controller的實現(xiàn)和配置文件,最后一步是編寫一個JSP文件作為視圖。由于采用了MVC架構,視圖的任務只有一個,就是將Controller 返回的Model渲染出來。Spring MVC會將Model中的所有數(shù)據(jù)全部綁定到HttpServlet Request中,然后將其轉發(fā)給JSP,JSP只需將數(shù)據(jù)顯示出來即可。
通過JSTL標簽庫能進一步簡化顯示邏輯,我們看看如何顯示TestController返回的Model。test.jsp文件的內容如下。
<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/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所需的所有組件都已編寫并配置完畢,我們先來回顧一下Spring MVC的處理流程,如圖7-22所示。
將SpringMVC工程的編譯輸出目錄設置為/web/WEB-INF/classes,然后編譯工程,打開瀏覽器,測試我們編寫的SpringMVC,結果如圖7-23所示。
圖7-23
現(xiàn)在,讀者對Spring的MVC框架應該有了一個初步的認識。實際上,除了基本的MVC標準流程外,Spring MVC還提供了相當多的功能,下面我們將逐一介紹Spring MVC提供的各種豐富的Controller、攔截器和異常處理機制。
?
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的spring的ModelAndView的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spring的view
- 下一篇: Spring CommonsMultip