Struts2里怎么用下拉列表来操作数据库数据,简单点说就是动态加载和提交选项的那些事儿
- 问答
- 2026-01-04 23:55:59
- 30
在Struts2里弄一个下拉列表,并且让这个列表里的选项是从数据库里动态抓取的,选中的值还能在提交表单后传到后台去处理,这事儿说白了就是几个步骤的配合,咱们不用那些复杂的术语,就一步步把它说清楚。
你得有个地方存数据,也就是数据库。 你想做一个员工信息表单,里面要选择员工所在的部门,那么数据库里肯定得有一张部门表,里面至少有两个字段:部门的ID(唯一标识,通常是个数字)和部门的名称(销售部”、“技术部”),这就是我们下拉列表选项的数据来源。
关键角色登场:Action 和拦截器。 你可以把Action理解成后台的一个“管事员”,专门处理某个页面的请求,而拦截器呢,就像公司前台或者秘书,在请求到达“管事员”之前,可以先做一些准备工作,动态加载下拉列表这个事,很多时候就是在“秘书”(拦截器)这个环节完成的。
具体怎么做呢?分两大步:一是把数据从数据库拿出来塞进下拉列表(动态加载),二是把用户选中的值拿回后台(提交)。
第一部分:动态加载选项(页面打开时)

- 写一个“管事员”(Action): 这个Action要负责两件事,第一件事,是在页面显示之前,先去数据库把所有的部门列表查出来,你会写一个方法,比如叫做
loadDepartments(),这个方法里通过JDBC或者Hibernate之类的工具,执行一句SQL(SELECT * FROM department),把结果存到一个列表里,比如叫departmentList,第二件事,这个Action还得有一个属性,用来临时存放后面用户选中部门的ID,比如叫selectedDeptId,并给它配上getter和setter方法。 - 让“秘书”自动干活(使用拦截器): 你不可能每次都在浏览器里输入一个地址去手动调用那个
loadDepartments()方法,Struts2提供了一个很聪明的机制,就是在你的Action配置里,可以指定在调用主要业务方法之前,先执行哪些方法,你可以在struts.xml配置文件里,或者通过注解,告诉Struts2:“在进入那个显示表单页面的方法之前,先帮我执行一下loadDepartments这个方法。” 这样,每当用户打开那个包含下拉列表的页面时,“秘书”(拦截器)就会自动先调用loadDepartments(),把部门列表从数据库查出来备好。 - 在页面上显示下拉列表(JSP页面使用Struts2标签): 到了显示给用户看的页面(通常是JSP),就用Struts2的标签来生成下拉列表,主要用
<s:select>这个标签,它有几个关键属性:name:这个最重要!它要和你Action里那个用来接收选中值的属性名(selectedDeptId)一致,提交表单后,Struts2会自动把选中的选项值塞到这个属性里。list:这里就填你Action里准备好的那个部门列表departmentList。listKey:告诉标签,用你列表里每个对象的哪个属性作为选项的“值”(value),这里就是部门的ID,"id"。listValue:告诉标签,用哪个属性作为显示给用户看的“文本”(text),这里就是部门的名称,"name"。- 还可以加一个
headerKey和headerValue,用来生成第一个选项,请选择部门”。
这样一来,当页面加载时,流程是这样的:用户请求打开页面 -> Struts2拦截器先调用Action的 loadDepartments() 方法 -> 方法从数据库查出数据存入 departmentList -> 页面被渲染,<s:select> 标签读取 departmentList,循环生成一堆 <option value="部门的ID">部门的名称</option> -> 用户看到了一个充满动态数据的下拉框。
第二部分:提交选中的值(用户选择后)
这部分反而相对简单。

- 用户选择并提交: 用户在下拉列表里选了一个部门,技术部”,其ID是2,然后点击了提交按钮。
- 自动封装数据: 表单提交后,Struts2框架会接手,它一看
<s:select>标签的name="selectedDeptId",就知道要把选中的值(也就是option的value,也就是2)设置到Action的selectedDeptId这个属性上,这个过程是自动完成的,你不需要写任何代码去获取请求参数。 - 在Action里使用值: 在你的Action处理提交的方法(比如叫
saveEmployee())里,你就可以直接使用this.selectedDeptId这个属性了,它的值就是用户选择的部门ID(2),你想干嘛都行,比如把这个ID和员工的其他信息一起保存到数据库的员工表里。
总结一下核心要点:
- 数据来源: 一个Action方法(如
loadDepartments)负责从数据库查询数据,存入一个List。 - 加载时机: 利用Struts2的拦截器机制,在显示页面之前自动调用数据查询方法。
- 页面展示: 使用
<s:select>标签,将其list属性指向准备好的List,并配置好“值”(listKey)和“显示文本”(listValue)。 - 数据回传: 将
<s:select>标签的name属性与Action中的一个属性(如selectedDeptId)绑定,提交后框架会自动赋值。
有时候你可能会看到一种做法,是把加载下拉列表数据的方法直接放在Action的构造函数或者一个叫 prepare() 的方法里,然后配合一个叫 @Prepare 的注解或者实现 Preparable 接口,这其实和上面说的原理一样,只是换了一种方式告诉“秘书”:“在干正事之前,先帮我准备(prepare)一下数据。” 这都是实现同一目标的不同途径。
为了代码清晰和重用,通常会把操作数据库的代码单独封装到一个所谓的“服务层(Service)”或“数据访问层(DAO)”的类里,然后在Action中调用这个类的方法,而不是把数据库代码直接写在Action里,这样Action就只负责流程控制,显得更干净。
就是Struts2中下拉列表动态加载和提交数据的基本过程,抛开那些复杂的配置细节,其核心思想就是这么一个前后台配合的流程。
本文由邝冷亦于2026-01-04发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://www.haoid.cn/wenda/74622.html
