【问题标题】:Spring Forms: Select element: When 'path' value is updated, select still appears to have the old value after soft refresh?Spring Forms:选择元素:更新“路径”值时,选择软刷新后仍然显示旧值?
【发布时间】:2019-06-28 07:44:10
【问题描述】:

编辑:此问题似乎与 Firefox 无关 - 在 Chrome/IE 中,它的工作方式与预期完全一致。这是一个 Firefox 错误,还是只是我不理解的东西?

我有一个弹簧表。除其他外,该表单包含一个<select> 元素,它使用JSP 中的“路径”属性绑定到ModelMap 中的相应元素。

但是,<select> 元素的表观值不会在软页面刷新时更新,即使模型映射中的值发生更改。对模型值的其他引用会更新(例如,如果我只是添加 ${MyModelMapValue } - 那么该值将在软刷新时更新 - 因此不会发生缓存或任何事情)。

硬刷新 (CTRL+F5) 后,选择更新。如何在软刷新时更新选择?

用例:

  • 我第一次浏览到该页面,我看到正确绑定到表单字段的正确值 - 包括我的 <select> 元素 - 它绑定到模型映射中的一个元素,例如:MyModelMapValue = '有序'

  • 在后台(例如,其他人的浏览器)中,当我在浏览器中打开页面时,MyModelMapValue 的值会发生变化,并将该更改保存到数据库中。 MyModelMapValue = '已发货'

  • 最初,我的选项卡中的值不会更改 - 这是我所期望的,因为这些值不会从数据库中不断更新。

  • 现在我在浏览器中按 F5。

  • 我可以看到生成了一个正常的 GET 调用,并点击了我的控制器,新模型正确生成(使用 MyModelMapValue = 'shipped')并与视图一起提供给浏览器。

  • 对模型值的所有其他引用(例如 ${MyModelMapValue} 将显示为“已发货”

  • <select> 元素仍绑定到 MyModelMapValue,但显示为“有序”作为它的值。

问题:

这是 Spring Forms 绑定的工作方式,还是我做错了什么?

代码:

Spring Form JSP 定义:
<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>
剥离 Java 控制器:
@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"; 
}

【问题讨论】:

    标签: java spring jsp firefox spring-form


    【解决方案1】:

    如果有人在谷歌上搜索我将来做的相同事情,请回答...

    这确实是一个浏览器问题 - 与 Spring Forms 没有任何关系。起初,我离抽象的步骤太多了,无法实现。

    默认情况下它已经在 chorome(v71)/IE(11) 中工作,只有 firefox(v64.0) 行为异常。

    Firefox 故意不刷新当前选中的option 元素的selected="selected" 属性。这似乎是为了允许自动完成字段。这是一个功能,而不是一个错误。

    快速解决方法是简单地将 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-24
      • 2013-09-05
      • 1970-01-01
      • 1970-01-01
      • 2020-07-30
      相关资源
      最近更新 更多