当前位置:首页 > 问答 > 正文

Struts2里怎么用下拉列表来操作数据库数据,简单点说就是动态加载和提交选项的那些事儿

在Struts2里弄一个下拉列表,并且让这个列表里的选项是从数据库里动态抓取的,选中的值还能在提交表单后传到后台去处理,这事儿说白了就是几个步骤的配合,咱们不用那些复杂的术语,就一步步把它说清楚。

你得有个地方存数据,也就是数据库。 你想做一个员工信息表单,里面要选择员工所在的部门,那么数据库里肯定得有一张部门表,里面至少有两个字段:部门的ID(唯一标识,通常是个数字)和部门的名称(销售部”、“技术部”),这就是我们下拉列表选项的数据来源。

关键角色登场:Action 和拦截器。 你可以把Action理解成后台的一个“管事员”,专门处理某个页面的请求,而拦截器呢,就像公司前台或者秘书,在请求到达“管事员”之前,可以先做一些准备工作,动态加载下拉列表这个事,很多时候就是在“秘书”(拦截器)这个环节完成的。

具体怎么做呢?分两大步:一是把数据从数据库拿出来塞进下拉列表(动态加载),二是把用户选中的值拿回后台(提交)。

第一部分:动态加载选项(页面打开时)

Struts2里怎么用下拉列表来操作数据库数据,简单点说就是动态加载和提交选项的那些事儿

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

这样一来,当页面加载时,流程是这样的:用户请求打开页面 -> Struts2拦截器先调用Action的 loadDepartments() 方法 -> 方法从数据库查出数据存入 departmentList -> 页面被渲染,<s:select> 标签读取 departmentList,循环生成一堆 <option value="部门的ID">部门的名称</option> -> 用户看到了一个充满动态数据的下拉框。

第二部分:提交选中的值(用户选择后)

这部分反而相对简单。

Struts2里怎么用下拉列表来操作数据库数据,简单点说就是动态加载和提交选项的那些事儿

  1. 用户选择并提交: 用户在下拉列表里选了一个部门,技术部”,其ID是2,然后点击了提交按钮。
  2. 自动封装数据: 表单提交后,Struts2框架会接手,它一看 <s:select> 标签的 name="selectedDeptId",就知道要把选中的值(也就是option的value,也就是2)设置到Action的 selectedDeptId 这个属性上,这个过程是自动完成的,你不需要写任何代码去获取请求参数。
  3. 在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中下拉列表动态加载和提交数据的基本过程,抛开那些复杂的配置细节,其核心思想就是这么一个前后台配合的流程。