Spring Forms: элемент выбора: при обновлении значения «путь» для выбора все еще сохраняется старое значение после мягкого обновления?

Изменить: эта проблема, по-видимому, изолирована от Firefox - в Chrome / IE она работает точно так, как ожидалось. Это ошибка Firefox или я просто чего-то не понимаю?

Имею пружинную форму. Форма содержит, среди прочего, элемент <select>, который привязан к соответствующему элементу в ModelMap с помощью свойства path в JSP.

Однако кажущееся значение элемента <select> не обновляется при программном обновлении страницы, даже если значение в карте-модели изменяется. Другие ссылки на значение модели обновляются (например, если я просто добавлю $ {MyModelMapValue} - тогда значение будет обновляться при мягком обновлении - так что кеширования или чего-то еще не происходит).

После жесткого обновления (CTRL + F5) выберите обновления. Как я могу обновить выбор при мягком обновлении?

Пример использования:

  • Я впервые перехожу на страницу и вижу правильные значения, правильно привязанные к полям формы, включая мой элемент <select>, который привязан к элементу на карте модели, например: MyModelMapValue = 'order'

  • В фоновом режиме (скажем, в браузере другого пользователя), пока у меня открыта страница в моем браузере, значение MyModelMapValue изменяется и сохраняет это изменение в БД. MyModelMapValue = 'отправлено'

  • Первоначально значения на моей вкладке не меняются - чего я и ожидал, поскольку значения не обновляются постоянно из БД.

  • Теперь я нажимаю F5 в своем браузере.

  • Я вижу, что сгенерирован нормальный вызов GET и попадает в мой контроллер, новая модель правильно сгенерирована (с MyModelMapValue = 'shipped') и обслуживается вместе с представлением в браузере.

  • Все другие ссылки на значение модели (например, $ {MyModelMapValue} будут отображаться как "отправлено"

  • элемент <select> по-прежнему привязан к MyModelMapValue, но в качестве значения отображается «упорядоченный».

Вопрос:

Так ли должна работать привязка Spring Forms, или я что-то делаю не так?

Код:

Spring Form JSP definition:
<form:form commandName="productHolder" id="productForm" method="post">

        <form:input path="product.blah" placeholder="blah" class="blah-blah" />

        <br>

        ... a bunch of other fields ... 

        <br> 

        Supplier Status: 
        <form:select path="product.supplierStatusObjectFromListOfStatusObjects.currentSatus">
                <form:options items="${allProductSupplierStatuses}"/>
        </form:select>

        <br>

        Printing the value as a test: ${product.getSupplierStatusFromListOfStatusObjects.currentSatus}

        <br>

        <button class="btn btn-success" type="submit">Save</button>

</form:form>
Stripped back Java Controller:
@RequestMapping(method=RequestMethod.GET)
public String showProductStatusScreen(ModelMap model, @RequestParam(value = "productId", required=false) Long productId){
    this.checkAccess(this.getCaller());
    Product product = productBusinessObject.getProductById(productId);      
    ProductHolder productHolder = this.generateProductHolder(product); 
    model.put("productHolder", productHolder); 
    //printing it out as a test: 
    System.out.println(productHolder.GetProduct.getSupplierStatusObjectFromListOfStatusObjects.getCurrentSatus);// <- Prints out the correct value
    return "/WEB-INF/jsp/productStatusScreen.jsp"; 
}

person Paul    schedule 04.02.2019    source источник


Ответы (1)


Ответьте, если кто-то поищет в Google то же самое, что и я ...

Это действительно проблема браузера - и не имеет никакого отношения конкретно к Spring Forms. Я был слишком далеко от абстракции, чтобы поначалу осознать.

Он уже работал по умолчанию в chorome (v71) / IE (11), только firefox (v64.0) вёл себя странно.

Firefox намеренно не обновляет свойство selected="selected" текущего выбранного элемента option. Похоже, это позволяет автоматически заполнять поля. Это особенность, а не ошибка.

Быстрое исправление заключалось в том, чтобы просто добавить autocomplete="off"property к элементу select, что отключает это поведение в текущей версии Firefox, например:

<select id="myBindingPath" name="myBindingPath" autocomplete="off"> 
    <option value = "fizz">fizz</option>
    <option value = "buzz">buzz</option>
    <option value = "bang" selected="selected">bang</option>
</selected>

Но кто знает, как будущие версии firefox будут обрабатывать autocomplete = "off" - так что это не самое надежное решение в мире. Я также мог бы написать Javascript для обновления элемента при загрузке страницы - что, вероятно, было бы более надежным решением.

Ссылки: 1, 2

person Paul    schedule 04.02.2019