如何在Struts2中验证Dropdown

时间:2016-03-03 23:04:49

标签: java validation struts2 struts-action interceptorstack

我正在编写一个动作类,我希望使用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"始终为空,而如果用户直接点击提交按钮而未选择任何状态,我希望打印此{{1}}。

1 个答案:

答案 0 :(得分:0)

只需使用两个操作(that can be two methods of the same Java class),第一个用于呈现页面,第二个用于执行按下按钮后应执行的业务。

在你的情况下:

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;
}