如何在 Struts2 中验证下拉列表



我正在编写一个操作类,我想在其中使用 Struts2 打印错误。在我的 JSP 页面中,我得到了一个下拉菜单,其中有 10 个状态。当我部署应用程序时,Null字段错误总是显示出来,甚至没有单击任何按钮。我希望打印该错误,以防用户未从下拉列表中选择任何状态。

操作类:

public String modifyState() {
        CatastropheDataTO catDataTo = new CatastropheDataTO();
        try {
            catDataTo.setState(this.state);
            catDataTo.setActive(Boolean.valueOf(this.active));
            catDataTo.setStartDate(this.startDate);
            if( getState() != null ||  getActive() != null || getStartDate() != null ) {
                getCatastropheManager().updateCatastropheData(catDataTo);
                addActionMessage(this.getErrorMessageFactory().generateMessage(Constants.ERROR_CODE_7).getMessageText());
            } else if(getState() == null){
                addFieldError("state", "Please select a state");
            }
        } catch (Exception ex) {
            addActionError(this.getErrorMessageFactory().generateMessage(Constants.ERROR_CODE_3028).getMessageText());
        }
        return SUBMIT;
    }

不知何故,getState()总是为空,因此"Please select a state"总是显示,而我希望如果用户直接单击提交按钮而不选择任何状态,则打印它。

只需使用两个操作(可以是同一 Java 类的两个方法),第一个用于呈现页面,第二个用于执行按下按钮后应执行的业务。

在您的情况下:

public String showStates() {
    return SUCCESS;
}
public String modifyState() {
    CatastropheDataTO catDataTo = new CatastropheDataTO();
    try {
        catDataTo.setState(this.state);
        catDataTo.setActive(Boolean.valueOf(this.active));
        catDataTo.setStartDate(this.startDate);
        if( getState() != null ||  getActive() != null || getStartDate() != null ) {
            getCatastropheManager().updateCatastropheData(catDataTo);
            addActionMessage(this.getErrorMessageFactory().generateMessage(Constants.ERROR_CODE_7).getMessageText());
        } else if(getState() == null){
            addFieldError("state", "Please select a state");
        }
    } catch (Exception ex) {
        addActionError(this.getErrorMessageFactory().generateMessage(Constants.ERROR_CODE_3028).getMessageText());
    }
    return SUBMIT;
}

也就是说,您的方法绕过了框架的机制,这些机制为您提供了几种内置方法来执行验证(validate()XMLannotations...

与您正在使用的方法最相似的是 validate() 方法(为了防止前面解释的问题再次出现,只能应用于某个方法,而不是应用于类的所有操作方法,带有 validateXXX()@SkipValidation .

结果将是这样的:

@SkipValidation
public String showStates() { // call this the first time
    return SUCCESS; // or INPUT, or whatever
}
public void validate(){
    if(getState() == null){
        addFieldError("state", "Please select a state");
    }
}
public String modifyState() {
    CatastropheDataTO catDataTo = new CatastropheDataTO();
    try {
        catDataTo.setState(this.state);
        catDataTo.setActive(Boolean.valueOf(this.active));
        catDataTo.setStartDate(this.startDate);
        if( getActive() != null || getStartDate() != null ) {
            getCatastropheManager().updateCatastropheData(catDataTo);
            addActionMessage(this.getErrorMessageFactory().generateMessage(Constants.ERROR_CODE_7).getMessageText());
        } 
    } catch (Exception ex) {
        addActionError(this.getErrorMessageFactory().generateMessage(Constants.ERROR_CODE_3028).getMessageText());
    }
    return SUBMIT;
}

最新更新