如何用Struts2的<s:select/>创建含超量选项的下拉菜单
解决Struts2表单绑定现有Action时添加全量美国领地下拉框的问题
你不需要额外创建新Action,直接在当前绑定的inputForm类中添加美国领地数据即可,步骤如下:
1. 在inputForm类中添加美国领地映射及Getter
在现有inputForm类里,新增一个存储美国领地缩写与名称的Map属性,通过构造方法初始化全量数据,并提供Getter方法供Struts2标签调用:
public class inputForm extends ActionSupport{ // 新增美国领地映射 private Map<String, String> usTerritories; public inputForm() { // 初始化全量美国领地(包含所有州及海外领地) usTerritories = new HashMap<>(); usTerritories.put("AL", "Alabama"); usTerritories.put("AK", "Alaska"); usTerritories.put("AZ", "Arizona"); usTerritories.put("AR", "Arkansas"); usTerritories.put("CA", "California"); usTerritories.put("CO", "Colorado"); usTerritories.put("CT", "Connecticut"); usTerritories.put("DE", "Delaware"); usTerritories.put("FL", "Florida"); usTerritories.put("GA", "Georgia"); usTerritories.put("HI", "Hawaii"); usTerritories.put("ID", "Idaho"); usTerritories.put("IL", "Illinois"); usTerritories.put("IN", "Indiana"); usTerritories.put("IA", "Iowa"); usTerritories.put("KS", "Kansas"); usTerritories.put("KY", "Kentucky"); usTerritories.put("LA", "Louisiana"); usTerritories.put("ME", "Maine"); usTerritories.put("MD", "Maryland"); usTerritories.put("MA", "Massachusetts"); usTerritories.put("MI", "Michigan"); usTerritories.put("MN", "Minnesota"); usTerritories.put("MS", "Mississippi"); usTerritories.put("MO", "Missouri"); usTerritories.put("MT", "Montana"); usTerritories.put("NE", "Nebraska"); usTerritories.put("NV", "Nevada"); usTerritories.put("NH", "New Hampshire"); usTerritories.put("NJ", "New Jersey"); usTerritories.put("NM", "New Mexico"); usTerritories.put("NY", "New York"); usTerritories.put("NC", "North Carolina"); usTerritories.put("ND", "North Dakota"); usTerritories.put("OH", "Ohio"); usTerritories.put("OK", "Oklahoma"); usTerritories.put("OR", "Oregon"); usTerritories.put("PA", "Pennsylvania"); usTerritories.put("RI", "Rhode Island"); usTerritories.put("SC", "South Carolina"); usTerritories.put("SD", "South Dakota"); usTerritories.put("TN", "Tennessee"); usTerritories.put("TX", "Texas"); usTerritories.put("UT", "Utah"); usTerritories.put("VT", "Vermont"); usTerritories.put("VA", "Virginia"); usTerritories.put("WA", "Washington"); usTerritories.put("WV", "West Virginia"); usTerritories.put("WI", "Wisconsin"); usTerritories.put("WY", "Wyoming"); // 海外领地 usTerritories.put("DC", "District of Columbia"); usTerritories.put("PR", "Puerto Rico"); usTerritories.put("GU", "Guam"); usTerritories.put("VI", "Virgin Islands"); usTerritories.put("AS", "American Samoa"); usTerritories.put("MP", "Northern Mariana Islands"); } // 新增Getter方法 public Map<String, String> getUsTerritories() { return usTerritories; } // 原有代码保持不变 public String execute() { return SUCCESS; } String firstName; String lastName; String state; public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public String getState() { return state; } public void setState(String state) { this.state = state; } public void validate() { // 修正字段错误对应的key,原代码误用了"salutation" if (getFirstName() == null || getFirstName().length() == 0) { addFieldError("firstName", "First name is required."); } if (getLastName() == null || getLastName().length() == 0) { addFieldError("lastName", "Last name is required."); } if (getState() == null || getState().length() == 0) { addFieldError("state", "State is required."); } } }
2. 修改JSP中的<s:select>标签
将原来硬编码的list属性替换为Action中新增的usTerritories属性:
<s:form action="submitForm"> <s:textfield name="firstName" label="First Name"/> <s:textfield name="lastName" label="Last Name"/> <s:select name="state" label="State" list="usTerritories" headerKey="" headerValue="-- Select State --" /> </s:form>
3. 可选优化(维护性提升)
如果需要更方便维护美国领地数据,可以:
- 将领地数据存入
.properties配置文件,通过Struts2国际化机制读取 - 把初始化逻辑抽成静态工具类,避免在Action构造方法中写大量硬编码
内容的提问来源于stack exchange,提问作者user23444496
相关产品推荐
相关产品推荐

