1

我正在编写一个操作类,我想在其中使用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"总是出现,而我希望在用户直接单击提交按钮而不选择任何状态时打印它。

4

1 回答 1

0

只需使用两个动作(可以是同一个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(), XML, annotations...)。

与您使用的最相似的是validate()方法(为了防止前面解释的问题再次出现,只能应用于某些方法,而不是应用于类的所有操作方法,使用validateXXX()or @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;
}
于 2016-03-03T23:26:21.297 回答