我正在开发一个 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;
}
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> </label> <input type="text" class="form-control "
id="finishingWoodOutsideOther1" name="finishingWoodOutsideOther1"
value="${pattern1Structure.finishingWoodOutsideOther1}"
placeholder=" ">
</div>
<div class="form-group col-md-4">
<label> </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 字段是否正确填充了所选值。
当控制器中提到的行被取消注释时,什么可能导致下拉列表中的选定值在保存后不保留?有没有更好的方法来处理这种情况而不影响功能?
控制器中设置的值与 JSP 中填充的值之间可能存在冲突。
具体来说,该行 pattern1Structure.setFinishingWoodOutside(hiddenFinishingWoodOutside); 似乎覆盖了下拉列表中选定的值。
以下是处理这种情况的一些建议:
在JSP中使用模型属性: 不要直接访问 pattern1Structure.finishingWoodOutside, 考虑在 JSP 中使用模型属性。 例如,您可以在 JSP 中使用 ${modelAttribute.finishingWoodOutside} 来访问模型属性中的值。
验证隐藏字段人口: *仔细检查 JSP 中是否正确填充了 hiddenFinishingWoodOutside 隐藏字段。 *使用浏览器开发者工具检查生成的HTML并确保隐藏字段具有预期值。
检查 JavaScript 干扰: 如果您有操作下拉列表或隐藏字段的 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 中插入调试语句,以打印表单提交和呈现的不同阶段的值。 *检查数值是否一致,是否有意外变化。