关于selectpicker的多选问题
刚开始拿到这个需要求的时候,我时很没有头绪的,再前期做的时候是将这个多选的作为一个数组,传入到后端,然后再插入数据库中,然后根据关系表查询,因为但是考虑显示的问题,不知道怎么将多选的数据显示出来,我就将每个多选的值都一条条显示出来,导致了本来就是需要一条记录的,最终显示了多条,结果嘛,当时半夜就被臭了一顿,最后还是靠别人的解释,才写了一遍,就写下这个来记录下我这多选的问题:
前端的jsp页面
<%@ taglib prefix="from" uri="http://www.springframework.org/tags/form" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="com.fasterxml.jackson.databind.ObjectMapper" %>
<%@ page import="im.lsn.framework.springmvc.StringJspWriter" %>
<%@ page import="im.lsn.framework.springmvc.json.JsonDialog" %>
<%@ page import="im.lsn.framework.springmvc.json.JsonObject" %>
<%@ include file="/WEB-INF/include/taglib.jsp" %>
<%
out = new StringJspWriter();
pageContext.pushBody(out);
%>
<div class="modal fade">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">编辑</div>
<div class="modal-body">
<form:form action="${ctxRoot}/admin/organizer/save_exhibitorInfo.do" class="form-horizontal es-form"
commandName="editForm" method="post">
<from:hidden path="id"/>
<div class="form-group">
<form:label path="name" class="control-label">展会名称:</form:label>
<div class="control-input">
<form:input path="name" cssClass="form-control"/>
</div>
</div>
<div class="form-group">
<form:label path="createTime" class="control-label">开始时间:</form:label>
<div class="control-input">
<form:input class="form-control es-datepicker required startDate"
data-format="yyyy-mm-dd"
path="createTime"/>
</div> </div>
<div class="form-group">
<form:label path="endTime" class="control-label">结束时间:</form:label>
<div class="control-input">
<form:input class="form-control es-datepicker required returnDate"
data-format="yyyy-mm-dd"
path="endTime"/>
</div>
</div>
<div class="form-group">
<form:label path="venueId" class="control-label">场馆:</form:label>
<div class="control-input">
<form:select path="venueId" cssClass="form-control required">
<form:options items="${venueDtos}" itemLabel="name"
itemValue="id"/>
</form:select>
</div>
</div>
<div class="form-group">
<form:label path="venueBranchIds" class="control-label">分馆:</form:label>
<div class="control-input">
<form:select path="venueBranchIds"
cssClass="form-control selectpicker show-tick show-menu-arrow my-select-alert-venue-branch required"
data-live-search-placeholder="搜索"
data-live-search="true"
data-none-Selected-Text="请选择"
multiple="true">
<c:forEach items="${venueBranchDtos}" var="item">
<option value="${item.id}">${item.name}</option>
</c:forEach>
</form:select>
</div>
</div>
<div class="form-group">
<form:label path="exhibitorInfoTypeIds" class="control-label">展会类型:</form:label>
<div class="control-input">
<form:select path="exhibitorInfoTypeIds"
cssClass="form-control selectpicker show-tick show-menu-arrow my-select-alert-type required"
data-live-search-placeholder="搜索"
data-live-search="true"
data-none-Selected-Text="请选择"
multiple="true">
<c:forEach items="${exhibitorTypeDtos}" var="item">
<option value="${item.id}">${item.type}</option>
</c:forEach>
</form:select>
</div>
</div>
<div class="form-group">
<form:label path="description" class="control-label">描述:</form:label>
<div class="control-input">
<from:textarea path="description" cssClass="form-control text-area"/>
</div>
</div>
<div>
<button type="submit" id="submit" class="btn btn-primary" style="margin-left: 150px;">
<i class="icon-save icon-large"></i>提交
</button>
<button type="button" class="btn btn-default" data-dismiss="modal">
<i class="icon-arrow-left icon-large"></i>取消
</button>
</div>
</form:form>
<link rel="stylesheet" href="${ctxRoot}/static/vendor/bootstrap-select/css/bootstrap-select.min.css"/>
<script src="${ctxRoot}/static/vendor/bootstrap-select/js/bootstrap-select.js"></script>
<script src="${ctxRoot}/static/vendor/bootstrap-select/js/i18n/defaults-zh_CN.js"></script>
<script type="text/javascript">
$('.my-select-alert-venue-branch').on('loaded.bs.select', function (e) {
let errorMsg = "${editForm.venueBranchIds}";
if (errorMsg != null && errorMsg != '') {
var arr = errorMsg;
if (arr.indexOf(",") != -1) {
arr = errorMsg.split(",");
}
$('.my-select-alert-venue-branch').selectpicker('val', arr);
}
}); $('.my-select-alert-type').on('loaded.bs.select', function (e) {
let errorMsg = "${editForm.exhibitorInfoTypeIds}";
if (errorMsg != null && errorMsg != '') {
var arr = errorMsg;
if (arr.indexOf(",") != -1) {
arr = errorMsg.split(",");
}
$('.my-select-alert-type').selectpicker('val', arr);
}
}); $('.startDate').datepicker({
language: 'zh-CN',
format: "yyyy-mm-dd",
autoclose: true,
clearBtn: true,
minuteStep: 10,
minView: 5,
startDate: new Date(),
}).on('changeDate', function (ev) {
var startDate = $('.startDate').val();
$(".returnDate").datepicker('setStartDate', startDate);
$(".startDate").datepicker('hide');
}); $('.returnDate').datepicker({
language: 'zh-CN',
format: "yyyy-mm-dd",
autoclose: true,
clearBtn: true,
minuteStep: 10,
minView: 5,
startDate: new Date(),
}).on('changeDate', function (ev) {
var returnDate = $(".returnDate").val();
$(".startDate").datepicker('setEndDate', returnDate);
$(".returnDate").datepicker('hide');
});
</script>
</div>
</div>
</div>
</div>
<%
response.setHeader("Content-Type", "text/plain");
JsonDialog dialog = new JsonDialog();
dialog.setHtml(out.toString());
JsonObject json = JsonObject.dialog(dialog);
ObjectMapper mapper = new ObjectMapper();
mapper.writeValue(response.getWriter(), json);
%>
controller层代码:
@RequestMapping("edit_exhibitorInfo")
public void editExhibitorsInfo(Long id, ExhibitorInfoEditForm editForm, Model model) {
if (id != null) {
model.addAttribute("editForm", organizerService.queryExhibitorInfo(id));
} else {
model.addAttribute("editForm", editForm);
}
//查询场馆的信息
List<VenueDto> venueDtos = new ArrayList<VenueDto>();
venueDtos.add(new VenueDto(organizerService.getVenue()));
model.addAttribute("venueDtos", venueDtos);
//查询展会类型的信息
List<ExhibitorTypeDto> exhibitorTypeDtos = organizerService.getTbExihibitorTypes();
//查询分馆的信息
List<VenueBranchDto> venueBranchDtos = organizerService.getVenueBranch();
model.addAttribute("exhibitorTypeDtos", exhibitorTypeDtos);
model.addAttribute("venueBranchDtos", venueBranchDtos);
}
@RequestMapping("save_exhibitorInfo")
public String saveOrganizer(ExhibitorInfoEditForm editForm, HttpSession session) {
try {
organizerService.saveExhibitorInfo(editForm);
saveSuccess(session, "保存成功");
} catch (BusinessLogicException e) {
saveError(session, e.getMessage());
}
return redirect("/organizer/exhibitorInfoListing.do?type=organizer");
}
service层:
public void saveExhibitorInfo(ExhibitorInfoEditForm editForm) {
TbExhibitorInfo exhibitorInfo = null;
if (editForm.getId() != null) {
exhibitorInfo = exhibitorInfoJpaRepository.findOne(editForm.getId());
if (!exhibitorInfo.getExhibitorInfoTypeIds().equals(editForm.getExhibitorInfoTypeIds())) {
QTbExhibitorInfoExhTypeRel qTbExhibitorInfoExhTypeRel = QTbExhibitorInfoExhTypeRel.tbExhibitorInfoExhTypeRel;
List<TbExhibitorInfoExhTypeRel> tbExhibitorInfoExhTypeRels = exhibitorInfoExhTypeRelLongJpaRepository.query()
.from(qTbExhibitorInfoExhTypeRel)
.where(qTbExhibitorInfoExhTypeRel.exhibitorInfo.id.eq(exhibitorInfo.getId()))
.select(qTbExhibitorInfoExhTypeRel)
.fetch();
if (tbExhibitorInfoExhTypeRels.size() != 0) {
for (TbExhibitorInfoExhTypeRel exhibitorInfoExhTypeRel : tbExhibitorInfoExhTypeRels) {
exhibitorInfoExhTypeRelLongJpaRepository.delete(exhibitorInfoExhTypeRel);
}
}
List<String> typeIdList = Arrays.asList(editForm.getExhibitorInfoTypeIds().split(","));
for (String typeId : typeIdList) {
TbExhibitorInfoExhTypeRel exhibitorInfoExhTypeRel = new TbExhibitorInfoExhTypeRel();
TbExhibitorType exhibitorType = exhibitorTypeLongJpaRepository.findOne(Long.parseLong(typeId));
exhibitorInfoExhTypeRel.setExhibitorInfo(exhibitorInfo);
exhibitorInfoExhTypeRel.setExhibitorType(exhibitorType);
exhibitorInfoExhTypeRelLongJpaRepository.save(exhibitorInfoExhTypeRel);
}
}
if (!exhibitorInfo.getVenueBranchIds().equals(editForm.getVenueBranchIds())) {
QTbExhibitorInfoVenueBranchRel qTbExhibitorInfoVenueBranchRel = QTbExhibitorInfoVenueBranchRel.tbExhibitorInfoVenueBranchRel;
List<TbExhibitorInfoVenueBranchRel> tbExhibitorInfoVenueBranchRels = exhibitorInfoVenueBranchRelLongJpaRepository.query()
.from(qTbExhibitorInfoVenueBranchRel)
.where(qTbExhibitorInfoVenueBranchRel.exhibitorInfo.id.eq(exhibitorInfo.getId()))
.select(qTbExhibitorInfoVenueBranchRel)
.fetch();
if (tbExhibitorInfoVenueBranchRels.size() != 0) {
for (TbExhibitorInfoVenueBranchRel exhibitorInfoVenueBranchRel : tbExhibitorInfoVenueBranchRels) {
exhibitorInfoVenueBranchRelLongJpaRepository.delete(exhibitorInfoVenueBranchRel);
}
}
List<String> branchIdList = Arrays.asList(editForm.getVenueBranchIds().split(","));
for (String branchId : branchIdList) {
TbExhibitorInfoVenueBranchRel exhibitorInfoVenueBranchRel = new TbExhibitorInfoVenueBranchRel();
TbVenueBranch venueBranch = venueBranchLongJpaRepository.findOne(Long.parseLong(branchId));
exhibitorInfoVenueBranchRel.setExhibitorInfo(exhibitorInfo);
exhibitorInfoVenueBranchRel.setVenueBranch(venueBranch);
exhibitorInfoVenueBranchRelLongJpaRepository.save(exhibitorInfoVenueBranchRel);
}
}
if (null != editForm.getName()) {
exhibitorInfo.setName(editForm.getName());
}
if (null != editForm.getCreateTime()) {
exhibitorInfo.setCreateTime(editForm.getCreateTime());
}
if (null != editForm.getDescription()) {
exhibitorInfo.setDescription(editForm.getDescription());
}
if (null != editForm.getEndTime()) {
exhibitorInfo.setEndTime(editForm.getEndTime());
}
if (null != editForm.getVenueId()) {
TbVenue venue = venueLongJpaRepository.findOne(editForm.getVenueId());
exhibitorInfo.setVenue(venue);
}
if (null != editForm.getExhibitorInfoTypeIds()) {
exhibitorInfo.setExhibitorInfoTypeIds(editForm.getExhibitorInfoTypeIds());
}
if (null != editForm.getVenueBranchIds()) {
exhibitorInfo.setVenueBranchIds(editForm.getVenueBranchIds());
}
TbAuditStatus tbAuditStatus = getTbAuditStatus(1l);
exhibitorInfo.setAuditState(tbAuditStatus);
exhibitorInfoJpaRepository.save(exhibitorInfo);
} else {
exhibitorInfo = new TbExhibitorInfo();
if (null != editForm.getName()) {
exhibitorInfo.setName(editForm.getName());
}
if (null != editForm.getCreateTime()) {
exhibitorInfo.setCreateTime(editForm.getCreateTime());
}
if (null != editForm.getDescription()) {
exhibitorInfo.setDescription(editForm.getDescription());
}
if (null != editForm.getEndTime()) {
exhibitorInfo.setEndTime(editForm.getEndTime());
}
if (null != editForm.getVenueId()) {
TbVenue venue = venueLongJpaRepository.findOne(editForm.getVenueId());
exhibitorInfo.setVenue(venue);
}
if (null != editForm.getExhibitorInfoTypeIds()) {
exhibitorInfo.setExhibitorInfoTypeIds(editForm.getExhibitorInfoTypeIds());
}
if (null != editForm.getVenueBranchIds()) {
exhibitorInfo.setVenueBranchIds(editForm.getVenueBranchIds());
}
TbAuditStatus tbAuditStatus = getTbAuditStatus(1l);
TbExhibitorStatus tbExhibitorStatus = getTbExhibitorStatus(1l);
exhibitorInfo.setAuditState(tbAuditStatus);
exhibitorInfo.setExhibitorState(tbExhibitorStatus);
exhibitorInfoJpaRepository.save(exhibitorInfo);
TbOrganizer organizer = userService.findOrganizerByUserId(securityService.getLoginUser().getId());
exhibitorInfo.setOrganizer(organizer);
if (null != editForm.getExhibitorInfoTypeIds()) {
List<String> typeIdList = Arrays.asList(editForm.getExhibitorInfoTypeIds().split(","));
for (String typeId : typeIdList) {
TbExhibitorInfoExhTypeRel exhibitorInfoExhTypeRel = new TbExhibitorInfoExhTypeRel();
TbExhibitorType exhibitorType = exhibitorTypeLongJpaRepository.findOne(Long.parseLong(typeId));
exhibitorInfoExhTypeRel.setExhibitorInfo(exhibitorInfo);
exhibitorInfoExhTypeRel.setExhibitorType(exhibitorType);
exhibitorInfoExhTypeRelLongJpaRepository.save(exhibitorInfoExhTypeRel);
}
}
if (null != editForm.getVenueBranchIds()) {
List<String> branchIdList = Arrays.asList(editForm.getVenueBranchIds().split(","));
for (String branchId : branchIdList) {
TbExhibitorInfoVenueBranchRel exhibitorInfoVenueBranchRel = new TbExhibitorInfoVenueBranchRel();
TbVenueBranch venueBranch = venueBranchLongJpaRepository.findOne(Long.parseLong(branchId));
exhibitorInfoVenueBranchRel.setExhibitorInfo(exhibitorInfo);
exhibitorInfoVenueBranchRel.setVenueBranch(venueBranch);
exhibitorInfoVenueBranchRelLongJpaRepository.save(exhibitorInfoVenueBranchRel);
}
}
}
}
数据库中是添加了多选的类型的字段,作为一个string类型的存储,存进去也是字符串,每个不同的值是以逗号隔开
关于selectpicker的多选问题的更多相关文章
- Bootstrap++:bootstrap-select 使用
效果图: HTML: <!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.or ...
- selectpicker下拉多选框ajax异步或者提前赋值=》默认值
Bootstrap select多选下拉框赋值 success: function (data) { var oldnumber = new Array(); $.each(data, functio ...
- Bootstrap selectpicker 下拉框多选获取选中value和多选获取文本值
1.页面代码: 页面引入: bootstrap-select.min.css和 bootstrap-select.min.js. defaults-zh_CN.min.js文件,并初始化下拉选项框. ...
- 【Bootstrap】Bootstrap-select多选下拉框实现
目录 前言 需要引用的它们 核心选项 核心方法 实例应用 回到顶部 前言 项目中要实现多选,就想到用插件,选择了bootstrap-select. 附上官网api链接,http://silviomor ...
- bootstrap selectpicker
mark 一下使用 bootstrap selectpicker 遇到的一个小issue,作为下次查错使用 $('.selectpicker').selectpicker('val', 'Mustar ...
- bootstrap-select多选下拉列表插件使用小记
下载插件 插件地址:http://silviomoreto.github.io/bootstrap-select/ 下载好后引用css和js文件 <!-- 因为是jquery插件,所以引用前先引 ...
- Bootstrap3级联多选下拉框
<!DOCTYPE html> <html> <head> <title>Bootstrap3级联多选下拉框</title> <met ...
- web实现下拉列表多选加搜索
实现如图所示的下拉多选还能带有搜索功能. <!DOCTYPE html> <html> <head> <title></title> < ...
- bootstrap-select插件 多选框
HeBeiTianQi.jsp页面 1 <!--bootstrap-select .css引用--> 2 <link rel="stylesheet" href= ...
随机推荐
- linux _文件目录与权限
1. 目录相关 . 代表次层目录 .. 代表上一层目录 - 代表前一个工作目录 ~ 代表目前使用者身份所在home目录 ~account 代表account这个使用者的home目录 cd 切换目录(c ...
- 用Java编程能给物联网(IoT)带来什么优势与不同?
用Java编程能给物联网(IoT)带来什么优势与不同? 这是一个不太容易回答的问题,也是一个适合拿出来与大家讨论的一个话题~首先需要聊聊物联网硬件与嵌入式设备有什么不同.嵌入式设备通常是一个软件一体的 ...
- SpringMVC-方法四种类型返回值总结,你用过几种?
SpringMVC 现在算是 Java 领域的一个基础性框架了,很多人天天用,可是对于 SpringMVC 方法的返回值,你又是否完全清楚呢?今天松哥就来和大家聊一聊 SpringMVC 中四种不同类 ...
- KVM学习
获取镜像目前大小 # qemu-img info debian.img 添加额外的10G空间到镜像中 # qemu-img resize -f raw debian.img +10GB 注意:并不是所 ...
- 深入V8引擎-初始化之InitPlatform
上一篇其实想讲初始化的第二步,但是内容比较无聊,所以换了一个话题,谈了谈v8的命名空间和宏,稍微轻松一下. 在这里还是接着说说初始化过程,毕竟写博客的初衷是对自己努力的记录,不是为了吸粉,这篇没图,对 ...
- 2019-11-29-WPF-依赖属性绑定不上调试方法
原文:2019-11-29-WPF-依赖属性绑定不上调试方法 title author date CreateTime categories WPF 依赖属性绑定不上调试方法 lindexi 2019 ...
- MVC+Ninject+三层架构+代码生成 -- 总结(五、Ninject)
1.在寫邏輯層前,需要弄好反轉控制,因框架沒有寫接口,所以Ninject只負責返回當前實例,有點類似共享設計模式. public sealed class IOCHelper { private st ...
- Markdown温故知新(4):更多扩展语法及HTML
1.强调(删除 & 高亮) 2.脚注(注脚) 3.数学公式 4.更多扩展语法 5.终极扩展之内嵌 HTML 5.1.文本修饰类标签 5.2.内容排版类标签 5.3.图片及多媒体标签 5.4.锚 ...
- Java中assert(断言)的使用
Java中assert(断言)的使用 1.Eclipse中默认assert(断言)是关闭,开启方式如下: 简单来说:就是设置一下jvm的参数,参数是-enableassertions或者-ea(推荐) ...
- Android源码分析(九)-----如何修改Android系统默认时间
一 : 修改Android系统默认时间 源码路径:frameworks/base/services/java/com/android/server/SystemServer.java 主要变量EARL ...