2010-10-30 47 views
6

我對Spring MVC相當陌生,並試圖弄清楚如何在不刷新整個頁面的情況下呈現局部視圖。我以爲在Spring MVC中呈現部分JSP片段?

  • ,如果我可以張貼到後端的請求,在這種情況下,一個Spring控制器方法

  • 如果這種方法在模型屬性罷了,然後返回與ModelAndView對象指定的視圖名稱映射到JSP文件,並且JSP能夠生成必要的HTML片段。

  • 返回的HTML片段將被插入到DIV佔位符中。

這可能不會奏效,但我不確定它有什麼問題嗎?我儘可能地調用了JSP來呈現視圖,但由於某種原因,我在會話中放置的模型似乎並不存在。

如果有相似經歷的人可以提供關於此主題的一些示例,或者指出可能出錯的地方,我將不勝感激。

我從Spring web流中讀取了一些東西來處理帶有碎片視圖的Ajax請求,但我不確定我是否知道它是如何實際工作的。

在此先感謝。

奧利弗

+0

從你的控制器提供一些代碼。 – heikkim 2010-11-26 09:34:12

回答

-1

當你以爲你需要Ajax獲得新的HTML內容,並在當前的HTML頁面插入。要加載它的這個內容,你可以使用jQuery庫,特別是它的功能load()。在這個鏈接中有它的使用的例子。

您還需要一個控制器方法,它可以像您一樣從JSP返回HTML代碼。該方法必須映射到您應該在ajax的load()函數中使用的url。如果您在使用Spring對JSP中的屬性進行細化時遇到問題,請在問題中添加一些代碼以查看可能出現的錯誤。

8

我不會說我的回答下面一定回答你的問題,但我通過谷歌在此網頁,而我試圖複製春AjaxEventDecoration(只加載一個頁面的片段),所以這裏是我現在發現,以防萬一有人到達這裏:

快速的答案是確保您將XMLHttpRequest的'接受'屬性設置爲'text/html; type = ajax',然後告訴Spring MVC只有(逗號應該返回由URL參數'fragments'指定的片段。

我使用Tiles服務器端和jQuery客戶端,這是我設置的粗略概述:

一個例子webmvc-配置。XML

... 
<bean id="tilesViewResolver" class="org.springframework.js.ajax.AjaxUrlBasedViewResolver"> 
    <property name="viewClass" value="org.springframework.js.ajax.tiles2.AjaxTilesView" /> 
</bean> 
... 

一個例子頁的瓷磚配置

<!DOCTYPE tiles-definitions PUBLIC 
     "-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN" 
     "http://tiles.apache.org/dtds/tiles-config_2_0.dtd"> 

<tiles-definitions> 

    <definition name="eventPage" extends="twoColumnLayout"> 
     <put-attribute name="title" value="My Event Page" /> 
     <put-attribute name="view" value="/WEB-INF/jsp/viewText.jsp" /> 
     <put-attribute name="objectViewer" value="/WEB-INF/jsp/viewEvent.jsp" /> 
    </definition> 

</tiles-definitions> 

我有一個返回的被映射到該請求 '賽事頁面'(ModelMap實例的Java的控制器類.html在我的情況)。

@Controller 
public class EventPageController 
{ 
    /** 
    * Method to handle main my events page. 
    */ 
    @RequestMapping(value = "/eventPage.html", method = RequestMethod.GET) 
    public ModelMap pageDisplayHandlerForEvents(ModelMap model, HttpServletRequest req) 
    { 
     ... 
    } 
} 

然後我的JavaScript客戶端代碼(即用於例子的緣故總是加載「objectViewer」片段):

注:您的HTML元素加載的片段必須有一個ID屬性匹配片段ID的ID屬性。

$(".springFragmentLoader").click(function() 
{ 
    $.ajax(__contextRoot + "/eventPage.html?fragments=objectViewer", { 
     beforeSend: function(req) { 
      req.setRequestHeader("Accept", "text/html;type=ajax"); 
     }, 
     complete : function(jqXHR) 
     { 
      $("#objectViewer").html(jqXHR.responseText); 
     } 
    }); 
} 

詳情請參閱Handling Ajax Requests

希望有所幫助。

0

加成埃德的答案: 添加以下到我的layouts.xml,其配置佈局

<tiles-definitions> 
.... 

    <definition name="partial" template="/WEB-INF/layouts/partial.jspx"> 
    </definition> 
.... 
</tiles-definitions> 

partial.jspx是局部視圖

<div xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:tiles="http://tiles.apache.org/tags-tiles"> 
    <jsp:directive.page contentType="text/html;charset=UTF-8"/> 
    <jsp:directive.page pageEncoding="UTF-8"/> 
    <jsp:output omit-xml-declaration="yes"/> 
    <tiles:insertAttribute name="partialView"/> 
</div> 

配置:

<tiles-definitions> 
    <definition extends="partial" name="partial/listOfProcessesPartial"> 
     <put-attribute name="partialView" value="/WEB-INF/views/partial/listOfProcessesPartial.jspx"/> 
    </definition> 

然後你只是從你的控制器返回一些視圖,並得到唯一的HTML片段作爲迴應