Spring Web MVC огромные проблемы с производительностью при рендеринге представления - PullRequest
3 голосов
/ 09 марта 2011

Я делаю проект с помощью Spring Framework и использую Spring MVC Framework для построения своих представлений.

Теперь все работает нормально и работает гладко, за исключением этой простой страницы GET, которая занимает 2 секунды, а иногда и больше, для загрузки на localhost.

Как вы можете видеть в журналах (ссылка), этот очень медленный GenericConversionService пытается найти конвертеры для привязки свойств.

Помощь будет очень признательна!

Заранее спасибо (извинения за мои орфографические ошибки):)

UPDATE:

Вначале служба конвертации запускается для каждого (связанного с атрибутом Path) тега формы в пространстве имен "http://www.springframework.org/tags/form". Чем больше тегов формы я использую, тем медленнее загружается моя страница. Должен ли я использовать обычные HTML-теги формы для повысить производительность или есть способ остановить поиск «правильного» конвертера?

Дополнительная информация:

Журналы: Ссылка (Прокрутите около 1/3, там вы увидите огромный кусок журналов GenericConversionService

Информация о профилировании Spring Insight: Profile information

Код контроллера (небрежный):

@RequestMapping(value = "/route/create", method = RequestMethod.GET)
public ModelAndView getCreateRoute(){
    RouteCreateUpdateViewModel result = new RouteCreateUpdateViewModel();
    User u = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
    u = us.get(u.getId());

    ModelAndView mav = new ModelAndView("route/create", "routeCreateUpdateModel", result);
    mav.addObject("favLocations", u.getLocations());
    mav.addObject("cars", u.getCars());

    result.setDateDay(Calendar.getInstance().get(Calendar.DAY_OF_MONTH) + 1); // January = 0
    result.setDateMonth(Calendar.getInstance().get(Calendar.MONTH));
    result.setDateYear(Calendar.getInstance().get(Calendar.YEAR));

    mav.addObject("nextYear", result.getDateYear() + 1);

    return mav;
}

Посмотреть код:

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %>


<!-- //TODO I18N -->

<style type="text/css">
    li:focus {
        background-color:green;
    }
</style>

<script>
    var highlightedElement = null;
    $(document).ready(function(){
        $("input,select").click(function() {
            if(highlightedElement != null)
            {
                $(highlightedElement).removeClass("curFocus");
                if(highlightedElement.hasClass("location"))
                {
                    checkLocation(highlightedElement);
                }
            }
            var newHighlightedElement = $(this).parent().parent();
            $(newHighlightedElement).addClass("curFocus");
            highlightedElement = newHighlightedElement;
        });
    });

    function checkLocation(highlightedElement)
    {
        var parameters = {
        zipcode: $(highlightedElement).find(".zipcode").val(),
        street: $(highlightedElement).find(".street").val(),
        streetNr: $(highlightedElement).find(".streetNr").val()
        };

        $.getJSON('/location/validate.php', parameters, function(data) {
            if(data.result != null)
            {
                $(highlightedElement).removeClass("badData");
                $(highlightedElement).addClass("goodData");
            }
            else {
                $(highlightedElement).removeClass("goodData")
                $(highlightedElement).addClass("badData");
            }
        });
    }

</script>

<div>
    <h1><fmt:message key="route.create.header"/></h1>
    <div class="form-container">
        <c:url value="/route/create.php" var="actUrl"/>
        <form:form method="POST" action="${actUrl}" modelAttribute="routeCreateUpdateModel">
            <ul>
                <li class="location">
                    <form:label path="fromZipcode" cssClass="title">Van<span class="required">*</span></form:label>
                <span>
                    <form:input path="fromZipcode" cssClass="zipcode"/>
                    <form:label path="fromZipcode" cssClass="desc">Gemeente</form:label>
                </span>
                <span>
                    <form:input path="fromStreet" cssClass="street"/>
                    <form:label path="fromStreet" cssClass="desc">Straat</form:label>
                </span>
                <span>
                    <form:input path="fromStreetNr" cssClass="streetNr"/>
                    <form:label path="fromStreetNr" cssClass="desc">Nr</form:label>
                </span>
                </li>
                <li class="location">
                    <form:label path="toZipcode" cssClass="title">Naar<span class="required">*</span></form:label>
                <span>
                    <form:input path="toZipcode" cssClass="zipcode"/>
                    <form:label path="toZipcode" cssClass="desc">Gemeente</form:label>
                </span>
                <span>
                    <form:input path="toStreet" cssClass="street"/>
                    <form:label path="toStreet" cssClass="desc">Straat</form:label>
                </span>
                <span>
                    <form:input path="toStreetNr" cssClass="streetNr"/>
                    <form:label path="toStreetNr" cssClass="desc">Nr</form:label>
                </span>
                </li>
                <li>
                    <form:label path="dateDay" cssClass="title">Datum<span class="required">*</span></form:label>
                <span>
                   <tags:showDayPicker path="dateDay" currentDay="${routeCreateUpdateModel.dateDay}"/>
                    <form:label path="dateDay" cssClass="desc">dd</form:label>
                </span>
                <span>
                   <tags:showMonthPicker path="dateMonth" currentMonth="${routeCreateUpdateModel.dateMonth}"/>
                    <form:label path="dateMonth" cssClass="desc">mm</form:label>
                </span>
                <span>
                   <tags:showYearPicker path="dateYear" startYear="${routeCreateUpdateModel.dateYear}"
                                        stopYear="${nextYear}"/>
                    <form:label path="dateYear" cssClass="desc">yyyy</form:label>
                </span>
                </li>
                <li>
                     <form:label path="days" cssClass="title">Dagen<span class="required">*</span></form:label>
                    <span>
                        <form:checkbox path="days" value="1"/>
                        <form:label path="days" cssClass="desc">Ma</form:label>
                    </span>
                    <span>
                        <form:checkbox path="days" value="2"/>
                        <form:label path="days" cssClass="desc">Di</form:label>
                    </span>
                    <span>
                        <form:checkbox path="days" value="3"/>
                        <form:label path="days" cssClass="desc">Wo</form:label>
                    </span>
                    <span>
                        <form:checkbox path="days" value="4"/>
                        <form:label path="days" cssClass="desc">Do</form:label>
                    </span>
                    <span>
                        <form:checkbox path="days" value="5"/>
                        <form:label path="days" cssClass="desc">Vrij</form:label>
                    </span>
                    <span>
                        <form:checkbox path="days" value="6"/>
                        <form:label path="days" cssClass="desc">Za</form:label>
                    </span>
                    <span>
                        <form:checkbox path="days" value="7"/>
                        <form:label path="days" cssClass="desc">Zo</form:label>
                    </span>
                </li>
                <li>
                    <form:label path="stopDateDay" cssClass="title">Herhalen tot<span class="required">*</span></form:label>
                <span>
                   <tags:showDayPicker path="stopDateDay" currentDay="${routeCreateUpdateModel.dateDay}"/>
                    <form:label path="stopDateDay" cssClass="desc">dd</form:label>
                </span>
                <span>
                   <tags:showMonthPicker path="stopDateMonth" currentMonth="${routeCreateUpdateModel.dateMonth}"/>
                    <form:label path="stopDateMonth" cssClass="desc">mm</form:label>
                </span>
                <span>
                   <tags:showYearPicker path="stopDateYear" startYear="${routeCreateUpdateModel.dateYear}"
                                        stopYear="${nextYear}"/>
                    <form:label path="stopDateYear" cssClass="desc">yyyy</form:label>
                </span>
                </li>
                <li>
                    <form:label path="departureTime" cssClass="title">Vertrek uur<span class="required">*</span></form:label>
                    <span>
                        <tags:showHourPicker path="departureTime"/>
                        <form:label path="departureTime" cssClass="desc">uu</form:label>
                    </span>
                    <span>
                        <tags:showMinutePicker path="departureTime"/>
                        <form:label path="departureTime" cssClass="desc">mm</form:label>
                    </span>
                </li>
                <li>
                    <form:label path="arrivalTime" cssClass="title">Aankomst uur<span class="required">*</span></form:label>
                    <span>
                        <tags:showHourPicker path="arrivalTime"/>
                        <form:label path="arrivalTime" cssClass="desc">uu</form:label>
                    </span>
                    <span>
                        <tags:showMinutePicker path="arrivalTime"/>
                        <form:label path="arrivalTime" cssClass="desc">mm</form:label>
                    </span>
                </li>
                <li>
                    <form:label path="car" cssClass="title">Auto</form:label>
                    <span>
                        <form:select path="car">
                            <form:options items="${cars}" itemLabel="carName" itemValue="Id" />
                        </form:select>
                    </span>
                </li>
            </ul>
            <input type="submit" value="Route toevoegen"/>
        </form:form>
    </div>
</div>

Если вам нужна дополнительная информация, просто спросите, и я предоставлю ее сразу.

Еще раз спасибо:)

Ответы [ 2 ]

1 голос
/ 16 марта 2011

Я из разработчиков Spring MVC ... не могли бы вы рассказать, какую версию Spring Framework вы используете?В последних версиях обслуживания был введен ряд оптимизаций службы преобразования.

Также вы пытались отключить ведение журнала DEBUG для org.springframework.core.convert и посмотреть, улучшит ли это что-то?Спасибо, Кит

1 голос
/ 09 марта 2011

Возможно, проблема вызвана чрезмерным количеством преобразований типов в тегах <form:option>.

Для простых значений, не требующих преобразования типов, можно использовать тег HTML <option> как:

<form:select path="${path}">
    <c:forEach var="i" begin="0" end="59" step="${interval}">
      <option value="${i}"><fmt:formatNumber value="${i}" minIntegerDigits="2" /></option>
    </c:forEach>
</form:select>

В качестве более агрессивной оптимизации вы можете избавиться от <c:forEach> и <fmt:formatNumber> и заполнить тело <form:select> предварительно сгенерированным HTML.

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