在 Spring MVC 中保存后下拉值不持久

问题描述 投票:0回答:1

问题:

我正在开发一个 Spring MVC 应用程序,我遇到了保存表单后下拉值不保留的问题。下面是代码的简化版本以及一些上下文:

控制器代码:

@RequestMapping(value = "/pattern1Save", method = RequestMethod.POST)
    public ModelAndView savePattern1Data(@ModelAttribute("pattern1Structure") Pattern1Structure pattern1Structure,
            @RequestParam("hiddenFinishingWoodOutsideOther2") String hiddenFinishingWoodOutsideOther2,
            @RequestParam("hiddenFinishingWoodInsideOther2") String hiddenFinishingWoodInsideOther2,
            @RequestParam("hiddenFinishingWoodOutside") String hiddenFinishingWoodOutside,
            @RequestParam("hiddenFinishingWoodInside") String hiddenFinishingWoodInside,
            @RequestParam("hiddenrunnerFixCompOther2") String hiddenrunnerFixCompOther2,
            @RequestParam("hiddenrunnerFixComp") String hiddenrunnerFixComp,

            ModelAndView model, HttpSession httpSession) {

        isResult = false;
        // getting office id for IraishoMainStructure
        String officeId = (String) session.getAttribute(Constants.SESSION_USER_OFFICE_ID);
        // getting userId form session
        String userId = (String) httpSession.getAttribute(Constants.SESSION_USER_ID);
        int transactionDefaultId = pattern1Structure.getTransactionStructure().getIraishoMainId();
        int patternNumber = pattern1Structure.getTransactionStructure().getIraishoPatternNum();
        // pattern1Structure.setFinishingWoodOutside(hiddenFinishingWoodOutside);

        // pattern1Structure.setFinishingWoodOutside(hiddenFinishingWoodOutside);
        pattern1Structure.setFinishingWoodOutsideOther2(hiddenFinishingWoodOutsideOther2);
        pattern1Structure.setFinishingWoodInsideOther2(hiddenFinishingWoodInsideOther2);
        pattern1Structure.setFinishingWoodInside(hiddenFinishingWoodInside);
        pattern1Structure.setRunnerFixCompOther2(hiddenrunnerFixCompOther2);
        pattern1Structure.setRunnerFixComp(hiddenrunnerFixComp);

        // pattern1Structure.setFinishingWoodInsideOther2("0");
        System.out.println(pattern1Structure.getFinishingWoodOutside());
        System.out.println(hiddenFinishingWoodOutside);
        // Uncommenting the line below causes the issue
        pattern1Structure.setFinishingWoodOutside(hiddenFinishingWoodOutside);

        if (CommonLogic.isEmpty(pattern1Structure.getFinishingWoodInsideOther2())) {
            pattern1Structure.setFinishingWoodInsideOther2("0");
        }
        if (CommonLogic.isEmpty(pattern1Structure.getFinishingWoodOutsideOther2())) {
            pattern1Structure.setFinishingWoodOutsideOther2("0");
        }
        Object fieldValue = null;
        Class<Pattern1Structure> aClass = Pattern1Structure.class;
        // IraishoMainStructure transactionStructure = new IraishoMainStructure();
        // ArrayList<IraishoDetailStructure> transactionDataStructureL = new
        // ArrayList<IraishoDetailStructure>();
        // changes done by Ravi on 2022-01-04 instead of creating new object usind the
        // available
        IraishoMainStructure transactionStructure = pattern1Structure.getTransactionStructure();
        ArrayList<IraishoDetailStructure> transactionDataStructureL = new ArrayList<IraishoDetailStructure>();
        // following method call for updating the t_iraisho_data on existing details ID
        HashMap<String, Integer> map = transactionFacade.getIraishoDetailsIds(transactionDefaultId);

        try {
            // get all the fields in array form Pattern1Structure
            Field field[] = aClass.getDeclaredFields();

            for (int i = 0; i < aClass.getDeclaredFields().length; i++) {
                // set accessibility to the filed
                field[i].setAccessible(true);
                // get data of the the field
                fieldValue = field[i].get(pattern1Structure);
                IraishoDetailStructure transactionDataStructure = new IraishoDetailStructure();

                // use if block for ignore unusable fields add into the structure
                if (!field[i].getName().contains("transactionStructure")
                        && !field[i].getName().contains("serialVersionUID")
                        && !field[i].getName().contains("backbtn")) {
                    transactionDataStructure.setFieldName(field[i].getName());

                    if (fieldValue != null) {
                        transactionDataStructure.setFieldValue(fieldValue.toString());
                    } else {
                        transactionDataStructure.setFieldValue(null);
                    }
                    // this condtion will add detail id to structure for update
                    if (map != null && map.size() > 0) {
                        int detailId = map.get(field[i].getName());
                        transactionDataStructure.setIraishoDetailId(detailId);
                    }
                    transactionDataStructureL.add(transactionDataStructure);

                }
            }

        } catch (SecurityException | IllegalArgumentException | IllegalAccessException e) {

            e.printStackTrace();
        }

        List<IraishoDetailStructure> transactionStructureList = transactionDataStructureL;
        // set data into the transactionStructure which is necessary for insert into
        // t_iraisho_data table
        transactionStructure.setIraishoPatternNum(patternNumber);
        transactionStructure.setIraishoDetailList(transactionStructureList);
        transactionStructure.setIraishoMainId(pattern1Structure.getTransactionStructure().getIraishoMainId());
        transactionStructure.setOfficeId(Integer.parseInt(officeId));

        // here we update the user data if transactionDefaultId is > 0 it means that the
        // recored is not new it is already exist in database so we update the here
        if (transactionDefaultId > 0) {
            try {
                int transactionId = transactionStructure.getIraishoMainId();

                // delete the t_transaction_data table record before update
                // transactionDataFacade.deleteByCondition(" tbl1.iraishoMainId = " +
                // transactionId + " ");
                String addedBy = pattern1Structure.getTransactionStructure().getAddedBy();
                String addedOn = pattern1Structure.getTransactionStructure().getAddedDate();
                // here we add the added by means the use who added this record
                transactionStructure.setAddedBy(addedBy);
                transactionStructure.setUpdatedBy(addedBy);
                // here we add the added date when the record first time inserted
                transactionStructure.setAddedDate(addedOn);
                transactionStructure.setUpdatedDate(addedOn);
                // pass the structure and userId to update
                transactionFacade.update(transactionStructure, userId);
                // added the update messages key in result
                result = Constants.PATTERN1_RESULT_UPDATE;
                isResult = true;
                log.info("Pattern1 with head id=" + transactionStructure.getIraishoMainId() + " is Updated.");
            } catch (DBException | InvalidInputException | PessimisticLockException e) {
                log.error(e);
                e.printStackTrace();
            }
        } else {
            try {
                // here we insert new record and get the saved record structure for again load
                // data the saved on the page so user can update it
                transactionStructure = (IraishoMainStructure) transactionFacade.insertAndGet(transactionStructure,
                        userId);
                // set save structure into pattern structure
                pattern1Structure.setTransactionStructure(transactionStructure);
                // added the save messages key in result
                result = Constants.PATTERN1_RESULT_SAVE;
                isResult = true;
                log.info("Pattern1 with head id=" + transactionStructure.getIraishoMainId() + " is Saved.");
            } catch (DBException | InvalidInputException | PessimisticLockException e) {
                log.error(e);
                e.printStackTrace();

            }
        }

        // getting dropdowns lists
        model = getDropdownListModel();
        model.addObject("result", result);
        model.addObject("pattern1Structure", pattern1Structure);
        model.addObject("transactionStructure", transactionStructure);
        if (pattern1Structure.getBackbtn() != null) {

            if (pattern1Structure.getBackbtn().equals("back")) {
                model.addObject("backbutton", true);
            }
        }
        model.setViewName("pettern1Controller");
        model.addObject("result", result);
        return model;

    }

JSP代码:

function updateOtherField() {
        var dropdown = document.getElementById("finishingWoodOutside");
        var selectedOption = dropdown.options[dropdown.selectedIndex];

        // Assuming that the value attribute of the option contains //MasterStructureObj.getActualValue()
        var actualValue = selectedOption.value;
        var labelName = selectedOption.label;
        // Update the value of the text input field
        var finishingWoodOutsideOther2 = document
                .getElementById("finishingWoodOutsideOther2");
        finishingWoodOutsideOther2.value = actualValue;

        // Set the value to the hidden field for later use in the form submission
        var hiddenField = document
                .getElementById("hiddenFinishingWoodOutsideOther2");
        hiddenField.value = actualValue;

        if (labelName === "その他(○○)") {
            finishingWoodOutsideOther2.value = "";

        } else {
            finishingWoodOutsideOther2.value = actualValue;
            var hiddenFields = document
                    .getElementById("hiddenFinishingWoodOutside");

            hiddenFields.value = labelName;
        }

        console.log("hiddenFields:" + hiddenFields.value);
    }


<div class="row">

                    <div class="form-group col-md-4">
                        <label><spring:message
                                code="lbl.pattern1.finishMaterialSurface" /></label>
                        <frm:select path="finishingWoodOutside" id="finishingWoodOutside"
                            onchange="disableTextField() , updateOtherField()"
                            class="form-control">
                            <frm:option value="">
                                <spring:message code="lbl.userDetails.select" />
                            </frm:option>
                            <frm:options items="${finishingWoodOutsideList}"
                                itemValue="labelValue" itemLabel="labelName" />
                        </frm:select>

                        <input type="hidden" name="hiddenFinishingWoodOutside"
                            id="hiddenFinishingWoodOutside"
                            value="${pattern1Structure.finishingWoodOutside}">
                    </div>
                    <div class="form-group col-md-4">
                        <label>&nbsp;</label> <input type="text" class="form-control "
                            id="finishingWoodOutsideOther1" name="finishingWoodOutsideOther1"
                            value="${pattern1Structure.finishingWoodOutsideOther1}"
                            placeholder=" ">
                    </div>

                    <div class="form-group col-md-4">
                        <label>&nbsp;</label>
                        <div class="input-group">
                            <input type="text" name="finishingWoodOutsideOther2"
                                id="finishingWoodOutsideOther2" oninput="handleInputs(event)"
                                onkeypress="checkNumber(this, event)" style="text-align: right;"
                                class="form-control "
                                value="${pattern1Structure.finishingWoodOutsideOther2}">
                            <div class="input-group-prepend">
                                <div class="input-group-text">kg/㎡</div>
                            </div>
                        </div>
                    </div>

                </div>

背景:

在提供的控制器代码中,我有一行pattern1Structure.setFinishingWoodOutside(hiddenFinishingWoodOutside);。如果取消注释此行,则保存表单后,finishingWoodOutside 下拉列表中的选定值不会保留。

在 JSP 代码中,所选值已正确填充到hiddenFinishingWoodOutside 隐藏字段中。

问题:

当我从 finishWoodOutside 下拉列表中选择一个值并提交表单时,所选值在保存后不会保留。但是,如果我注释掉控制器中提到的行,则所选值确实会保留。不幸的是,我需要这条线来实现某些特定功能。

附加信息:

该问题似乎与控制器中提到的线路有关。 我已检查 JSP 中的hiddenFinishingWoodOutside 字段是否正确填充了所选值。

问题:

当控制器中提到的行被取消注释时,什么可能导致下拉列表中的选定值在保存后不保留?有没有更好的方法来处理这种情况而不影响功能?

javascript java spring spring-mvc jsp
1个回答
0
投票

控制器中设置的值与 JSP 中填充的值之间可能存在冲突。

具体来说,该行 pattern1Structure.setFinishingWoodOutside(hiddenFinishingWoodOutside); 似乎覆盖了下拉列表中选定的值。

以下是处理这种情况的一些建议:

  1. 检查控制器逻辑:
  • 验证使用“pattern1Structure.setFinishingWoodOutside(hiddenFinishingWoodOutside);”设置的值是否确实是您想要保留的值。
  • 确保代码的不同部分没有设置冲突的值。
  1. 在JSP中使用模型属性: 不要直接访问 pattern1Structure.finishingWoodOutside, 考虑在 JSP 中使用模型属性。 例如,您可以在 JSP 中使用 ${modelAttribute.finishingWoodOutside} 来访问模型属性中的值。

  2. 验证隐藏字段人口: *仔细检查 JSP 中是否正确填充了 hiddenFinishingWoodOutside 隐藏字段。 *使用浏览器开发者工具检查生成的HTML并确保隐藏字段具有预期值。

  3. 检查 JavaScript 干扰: 如果您有操作下拉列表或隐藏字段的 JavaScript 函数,请确保它们不会干扰预期行为。

  4. 替代方法:

  • 根据您的具体要求,考虑使用不同的方法在控制器中设置 finishingWoodOutside 值。
  • 检查浏览器控制台中是否有任何 JavaScript 错误。

这是在 JSP 中使用模型属性的示例:

jspCopy code<frm:select path="finishingWoodOutside" id="finishingWoodOutside" onchange="disableTextField(), updateOtherField()" class="form-control">
<frm:option value="">
<spring:message code="lbl.userDetails.select" />
</frm:option>    
<frm:options items="${finishingWoodOutsideList}" itemValue="labelValue" itemLabel="labelName" />
</frm:select>

<input type="hidden" name="hiddenFinishingWoodOutside"id="hiddenFinishingWoodOutside" value="${modelAttribute.finishingWoodOutside}">

记住将 modelAttribute 替换为您在 JSP 中使用的实际模型属性。

如果问题仍然存在,可能需要对整个代码库进行进一步调试和分析,以确定根本原因。

*在控制器和 JSP 中插入调试语句,以打印表单提交和呈现的不同阶段的值。 *检查数值是否一致,是否有意外变化。

© www.soinside.com 2019 - 2024. All rights reserved.