You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 10:52:35