Рендеринг частичных фрагментов JSP в Spring MVC? - PullRequest
6 голосов
/ 30 октября 2010

Я новичок в Spring MVC и пытаюсь понять, как визуализировать частичное представление, не обновляя всю страницу.Я думал :

  • , если я могу опубликовать запрос к бэкэнду, в этом случае метод контроллера Spring

  • И если этот метод заполняет атрибут модели, а затем возвращает объект ModelAndView с указанным именем представления, отображающимся в файл JSP, и JSP может генерировать необходимый фрагмент HTML.

  • ВозвращенныйHTML-фрагмент будет вставлен в заполнитель DIV.

Возможно, это не сработает, но я не уверен, что с ним не так?Я дошел до того, что JSP вызывается для рендеринга представления, но по какой-то причине атрибуты модели, которые я вставил в сеанс, похоже, не присутствуют.опыт может дать некоторые примеры на эту тему или указать мне, где это могло пойти не так.

Я прочитал что-то из веб-потока Spring для обработки запроса Ajax с фрагментированным представлением, но я не уверен, что понял идеюкак это на самом деле работает.

Ответы [ 3 ]

8 голосов
/ 27 мая 2011

Я бы не сказал, что мой ответ ниже обязательно отвечает на ваш вопрос, но я попал на эту страницу через Google, когда пытался скопировать Spring AjaxEventDecoration (который загружает только фрагменты страницы), поэтомувот что я сейчас обнаружил на случай, если кто-нибудь еще придет сюда:

Быстрый ответ - убедиться, что вы установили свойство 'Accept' для XMLHttpRequest в 'text / html; тип= ajax ', который затем сообщает Spring MVC, что должны быть возвращены только фрагменты (разделенные запятыми), указанные параметром URL «фрагменты».

Я использую Tiles на стороне сервераи jQuery на стороне клиента, это приблизительный обзор моей установки:

Пример webmvc-config.xml

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

Пример конфигурации страницы Tiles

<!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>

У меня есть класс контроллера Java, который возвращает экземпляр ModelMap , которыйсопоставлен с запросом 'eventPage' (.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, совпадающий с атрибутом идентификатора фрагмента.

$(".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);
        }
    });
}

Подробнее см. Обработка запросов Ajax .

Надеюсь, это поможет.

0 голосов
/ 02 октября 2013

Дополнение к ответу Эда: я добавил в свой файл layouts.xml следующее, в котором настраиваются макеты

<tiles-definitions>
....

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

part.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-фрагмент

0 голосов
/ 25 ноября 2010

Как вы и думали, вам понадобится Ajax, чтобы получить новый HTML-контент и вставить его в вашу текущую HTML-страницу.Для загрузки этого контента вы можете использовать библиотеку jquery, особенно ее функцию load () .В этой ссылке есть примеры его использования.

Вам также необходим метод контроллера, который возвращает HTML-код из JSP, как вы это делали.Метод должен быть сопоставлен с URL-адресом, который вы должны использовать в функции load () ajax.Если у вас есть проблемы с передачей атрибутов в JSP с помощью Spring, добавьте код в вопрос, чтобы увидеть, что может быть не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...