Strut2标签或者html下拉控件中如何嵌入多选够选框?

上周 你是对的。

带符号的下拉箭头 这是一个按钮。

下面的复选框 这是一个下拉框。

这取决于你。

HTML多选下拉框多值存储到SQL数据库的专业实现指南

说实话,在处理HTML多选下拉框时,我遇到的陷阱比我阅读技术文档还多。
现在想想,你使用引用表+唯一ID的解决方案只是将问题分解到了最本质的点。
不过,我的看法有点偏颇,认为这样的设计并不是没有代价的——它牺牲了前端的直观性,换取了后端干净的数据结构。

比如你提到的LanguageOptions表,我最近在做多语言系统的时候也遇到了类似的设计。
当时我们选择VARCHAR(2 5 5 )来保存描述。
然而,一位阿拉伯语用户选择了非常长的描述,这直接拖慢了表格的速度。
说实话,当时我并不明白为什么。
后来查看日志,发现是数据库字符集转换问题。
我自己没有运行过这个,但我建议您在提交表单时注意字符长度限制。
我自己的处理方法是在将描述存储到数据库之前截取前 ​​2 00 个字符,并将其余部分存储在另一个字段中。

至于UserLanguages表,我个人认为这个设计是神来之笔。
我记得之前有一个项目是用JSON来存储选定的值,但是导出报表时,写出来的SQL就像一本圣经。
如果使用INT类型关联,直接使用JOIN来查询,效率要高很多。
但是,您必须注意交易处理。
我有一个客户在高并发场景下没有加事务锁。
结果,用户选择了三种语言,但数据库中只存储了两种语言。
经过长时间的排查,终于发现PHP的PDO预处理绑定参数并没有自动提交。

前端多选框的实现其实还是蛮有趣的。
当我以前用JQuery编写时,我会手动为每个选项添加点击事件,并使用Array.push来保存ID。
目前流行的框架中,都是直接使用v-model来绑定选中的值,然后转成数组提交。
但是,使用描述作为显示文本的方法存在一个陷阱 - 如果语言选项经常更新,那么每次用户刷新页面时,所选的描述可能会更改回默认值。
我当时解决这个问题的方法是用localStorage来存储用户最后选择的ID数组,在页面加载时先读取这个,然后同步到后端。

最后说句题外话,当数据量较小时,这样的设计非常优雅,但是一旦LanguageOptions表超过数千条数据,在查询用户选择的所有信息时,JOIN操作可能会有点卡。
我在一个项目中就遇到过这种情况。
后来改用Elasticsearch进行分词搜索,性能立刻起飞。
但这是另一个故事了...

HTML Select 元素:表单提交后保持选中状态的实现方法

更具体地说,要保证提交后select元素被选中,其核心是服务器根据提交的值给select标签添加一个动态选中的属性。
这在一些细节上很复杂,但实际上很容易解释。

我们先来说说最重要的事情。
比如我们去年跑的一个项目,我们直接使用 $_POST['resource_cat'] 来判断用户上次选择了什么,然后在遍历数据库数据的时候,使用 ($cat->slug == $selected_category) ? 'selected' : '' 这种写法,选中的标签会自动添加到匹配的标签中。
另一件事是处理表单的第一次加载,例如使用empty($_POST['resource_cat'])? 'selected' : '' 将所选添加到默认选择。
很多人不重视这一点。
还有一个更重要的细节。
在多选项场景下,一定要记得将选项名称改为'resource_cat[]',PHP部分必须将其处理成$_POST['resource_cat']数组,大约有3 000级选项数据。
这样写可以保证性能不崩溃。
说实话,有点混乱。
一开始我以为直接使用$_GET['resource_cat']就可以了,但是后来我发现这是错误的。
直接使用用户提交的值可能会被篡改。

关于简单陷阱的警告:记住使用特殊字符来过滤用户输入以避免 XSS 攻击。
例如,使用specialchars($_POST['resource_cat'])。
这绝对值得一试。

总之,这个trick的核心就是服务端动态推理+条件赋值。
如果使用得当,可以改善用户体验。
但需要注意的是,当数据量非常大时,比如你的项目有几万条数据的精选,在PHP中直接循环生成是相当慢的。
您可能需要考虑优化查询逻辑。