Java Hibernate中如何从JSP select表单获取两个值存入目标表
实现方案说明
现有JSP下拉框默认配置下,<form:select>只会提交itemValue指定的字段值,无法原生同时提交同一项的多个属性,可通过以下三种方式实现需求,按推荐优先级排序:
方案1:后端基于已加载的分类列表匹配名称(优先选用,一致性最高)
该方案完全不需要修改前端现有select逻辑,也不需要额外发起数据库查询:渲染页面前你已经查询到了全部分类数据存在${categoryList}中,将这个列表暂时存在模型上下文里,表单提交拿到选中的category.id后,直接遍历列表匹配对应id的分类名称,赋值给表A对应的持久化字段即可,从根源避免前端传值被篡改、数据不一致的问题。
核心逻辑代码示例:// 拿到表单提交的分类ID Long submitCategoryId = bizForm.getCategory().getId(); // 从已加载的分类列表中匹配对应数据,无需二次查库 Category currentCategory = categoryList.stream() .filter(item -> item.getId().equals(submitCategoryId)) .findFirst() .orElseThrow(() -> new IllegalArgumentException("提交的分类ID非法")); // 给表A实体的分类名称字段赋值 bizForm.setCategoryName(currentCategory.getName()); // 后续正常执行持久化操作即可方案2:自定义option值拼接双字段,提交后拆分
放弃自动渲染option的写法,手动遍历分类列表生成选项,把id和name用特殊分隔符拼接成value值绑定到临时字段,后端收到后拆分出两个值分别赋值。
修改后的JSP代码:category <%-- 绑定到临时接收字段,不要直接绑定category.id --%> <form:select path="categoryComboValue"> <c:forEach items="${categoryList}" var="catItem"> <option value="${catItem.id}|||${catItem.name}">${catItem.name}</option> </c:forEach> </form:select>后端拆分逻辑:
String[] comboArr = bizForm.getCategoryComboValue().split("\\|\\|\\|"); Long categoryId = Long.parseLong(comboArr[0]); String categoryName = comboArr[1]; // 分别赋值给表A对应字段即可注意:分隔符不要选择分类名称里可能出现的字符,避免拆分错误。
方案3:JS联动赋值隐藏域(不推荐)
新增绑定category.name的隐藏表单域,给select加change监听事件,用户选中选项时,把对应选项的名称同步赋值到隐藏域,提交时随表单一起传到后端。该方案依赖前端JS运行,用户禁用JS会导致名称字段丢失,且传入值可被恶意篡改,数据一致性无法保障。
问题对应的原始JSP代码片段:
category <form:select itemLabel="name" itemValue="id" path="category.id" items="${categoryList}"/>
内容的提问来源于stack exchange,提问作者Krzysztof XL-WAY
相关产品推荐
相关产品推荐

