SpringMVC, jquery, тайлы и частичное рендеринг - PullRequest
5 голосов
/ 13 февраля 2012

Я пытаюсь сделать частичный рендеринг своего веб-сайта, используя spring mvc 3.1, плитки 2 и jquery.

Вот мой весенний конф:

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

Мои плиткиconf:

<definition name="productSearch" extends="baseLayout">
    <put-attribute name="mainSection">
        <definition template="/WEB-INF/views/productSearch.jsp">
            <put-attribute name="productSearchResults" value="/WEB-INF/views/productSearchResults.jsp" />
        </definition>
    </put-attribute>
</definition>

Как видите, есть вложенный атрибут с именем "productSearchResults".Это страница результатов, и я хочу, чтобы эта страница повторно отображалась с помощью ajax.

Мой контроллер:

@RequestMapping(params = "search=true", value = "/", method = RequestMethod.POST)
public String searchHandler(@Valid final SearchFormBean searchformBean, final Model model) {
    model.addAttribute("productsList", productsService.findProducts(searchformBean.getSearchCriteria()));
    return "productsSearch";
}

Мой jsps:

productsSearch.jsp:

<form:form id="product-search-form" method="post" modelAttribute="productSearchFormBean">
    <input type="hidden" name="search" value="" />
    <form:input path="searchCriteria.name" />
    // AND SOME OTHER FIELDS...
    <button type="submit" onclick="this.form.search.value='true';">Search</button>
</form>

productSearchResults.jsp:

<div id="products-result">
    <div id="search-results-info" class="section-content">
            Order results :
        <form:select path="searchCriteria.resultsSort">
            <form:option value="orderByName">Name</form:option>
            <form:option value="orderByDame">Date</form:option>
        </form:select>
    </div>

    <div id="products-content" class="section-content">                 
        <c:forEach var="product" items="${productsList}">
            <article>
                // PRODUCT INFORMATIONS DISPLAYED HERE...
            </article>
        </c:forEach>
    </div>
</div>

и, наконец, файл .js, включенный в productSearch.jsp:

$('select[id="searchCriteria.resultsSort"]').change(function() {
    $.ajax({
        type : "POST",
        url : "/myapp/product/search/",
        data : "search=true&fragments=productSearchResults",
        success : function(response) {
            $("#search-results").html(response);
        },
        error : function(e) {
            alert('Error : ' + e);
        }
    });
});

Так что вот что: каждыйКогда я изменяю значение селектора searchCriteria.resultsSort на странице productsSearchResults.jsp, я хочу перезагрузить плитку результатов (без перезагрузки всей страницы).

С помощью приведенного выше кода мне удаетсяперерисовать всю страницу (включая тег html ...), а не только ту часть, которая меня интересует.

Любой намек на то, как достичь моей цели?Это действительно возможно, или я неправильно понял принцип частичного рендеринга?

1 Ответ

4 голосов
/ 15 февраля 2012

Я обнаружил, что случилось, поэтому я отвечаю на свой вопрос ...

Я просто изменил код JavaScript на это:

$('select[id="searchCriteria.resultsSort"]').change(function() {
$.ajax({
    type : "POST",
    beforeSend : function(req) {
        req.setRequestHeader("Accept", "text/html;type=ajax");
    },
    url : "/myapp/product/search/",
    data : "search=true&fragments=productSearchResults",
    success : function(response) {
        $("#search-results").html(response);
    },
    error : function(e) {
        alert('Error : ' + e);
    }
});
});

И теперь это работает!

Из-за частичного повторного рендеринга создается впечатление, что селектор searchCriteria.resultsSort больше не отображается на форме после перезагрузки страницы на экране, поэтому мне пришлось добавить эту строку в мой контроллер :

model.addAttribute("searchCriteria", searchformBean.getSearchCriteria());

Вот и все! Надеюсь, что это помогает другим людям.

...