日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

spring的ModelAndView

發布時間:2024/4/17 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的參數:

ModelAndView(View view)

ModelAndView(View view, Map model)

ModelAndView(View view, String modelName, Object modelObject)


 一個例子是org.springframework.web.servlet.view.RedirectView,ModelAndView預設是使 用forward來轉發請求結果至視圖,使用RedirectView的話,則會使用redirect將請求重導至視圖,例如:

public ModelAndView handleRequest(....) … {

??? ....

???

??? return?new ModelAndView(new RedirectView(this.getViewPage()));

}

....


 在這邊,viewPage的地址是從服務器網頁根目錄開始指定,而不是Web應用程序的根目錄,所以您的getViewPage()傳回的地址必須像是 /springapp/pages/index.htm這樣的地址,其中springapp是您的Web應用程序目錄。
 使用forward的話,網址列上并不會出現被轉發的目標地址,而且forward是在Web應用程序之內進行,可以訪問Web應用程序的隱藏目錄,像是WEB-INF,然而forward只能在Web應用程序中進行,不能指定至其它的Web應用程序地址。
 使用redirect的話,是要求客戶端瀏覽器重新發出一個指定的請求地址,因此網址列上會出現被重導的目錄地址,重導的請求是由瀏覽器發出,所以不能 訪問Web應用程序中的隱藏目錄,像是WEB-INF,然而重導是重新要求一個網頁,所以可以指定至其它的Web應用程序地址。
 DispatcherServlet會根據傳回的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等等的實作,分別進行不同的表現展處理。

==============http://frederick.iteye.com/blog/44463

Spring學習日記 - ModelAndView的構造

  • 博客分類:
  • Spring和持久層
SpringJSP ModelAndView的構造方法有7個。但是它們都是相通的。這里使用無參構造函數來舉例說明如何構造ModelAndView實例。
???
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()生成名字的規則是使用對象的類名的小寫模式來作model名字。當這個model是集合或數組的時候,使用集合的第一個元素的類名加s來作model的名字。
ModelAndView也可以接收Map類型的對象,ModelAndView將這個Map中的元素視為model,而不是把這個Map本身視為model。但是其他的集合類可以用本身作為model對象。

實際上,ModelAndView對model的支持來自于類ModelMap,這個類繼承自HashMap。

?

==============

http://blog.csdn.net/wangyaoheng/article/details/2465834

Spring MVC的實現原理

分類: spring 2008-05-21 13:53 3997人閱讀 評論(11) 收藏 舉報 Spring提供了DispatcherServlet,這個類不僅負責實現請求轉發,還負責啟動一個WebApplicationContext容器。 按照Spring一貫的IoC哲學,所有的Controller都是JavaBean,并由IoC容器統一管理。對于View,則采取了更靈活的處理方 式,Spring MVC允許使用不同的View實現,除了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框架來實現這個Web應用程序。在Eclipse中創建一個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的實現更為簡單,每個Controller的URL與其name屬性對應,因此,只需要對每個Controller以URL作為name,就可以實現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規范不允許在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關聯起來,由于這種方式靈活性欠佳,實際使用 較少。

也可以混合使用多種 UrlHandlerMapping,但是必須為每個UrlHandlerMapping指定order屬性來表示優先級,order值越小優先級越高, Spring會先查詢優先級高的UrlHandlerMapping。若找到了對應的Controller,就不再繼續查詢,否則,按照優先級依次查詢, 直到找到為止。若所有的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)使得視圖文件無論放在何處都可以通過修改前綴來實現位置無關性(當然,必須在web目錄內),許多應用程序將其放在/WEB-INF 目錄下,使得用戶無法通過URL直接訪問視圖文件以保證視圖文件的安全;定義后綴(suffix)可以在將來用另一種視圖技術(例如,Velocity) 取代現在的JSP視圖,只需將后綴從“.jsp”更改為“.vm”即可,而不必更改源代碼中的邏輯視圖名。總之,一切目標都是為了實現最大限度的解耦。

二、實現Controller

實現了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的概念自定義接口。在現在的SpringMVC項目中,我們沒有自定義任何接口,而是直接使用Spring MVC框架來實現Web應用程序,這一點請讀者務必區分清楚。

另外需要注意的是,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。

三、? 實現View

到目前為止,我們已經編寫了 Controller的實現和配置文件,最后一步是編寫一個JSP文件作為視圖。由于采用了MVC架構,視圖的任務只有一個,就是將Controller 返回的Model渲染出來。Spring MVC會將Model中的所有數據全部綁定到HttpServlet Request中,然后將其轉發給JSP,JSP只需將數據顯示出來即可。

通過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>

現在,Spring MVC所需的所有組件都已編寫并配置完畢,我們先來回顧一下Spring MVC的處理流程,如圖7-22所示。

將SpringMVC工程的編譯輸出目錄設置為/web/WEB-INF/classes,然后編譯工程,打開瀏覽器,測試我們編寫的SpringMVC,結果如圖7-23所示。

圖7-23

現在,讀者對Spring的MVC框架應該有了一個初步的認識。實際上,除了基本的MVC標準流程外,Spring MVC還提供了相當多的功能,下面我們將逐一介紹Spring MVC提供的各種豐富的Controller、攔截器和異常處理機制。

?

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的spring的ModelAndView的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。