Как настроить результаты динамического ввода в Struts2

Предположим, я настраиваю проверку «для каждого метода» в своем действии, используя структуру проверки Struts2 (в моем примере с аннотациями, но и с xml это то же самое). Предположим, у меня есть три общедоступных открытых метода в моем действии:

public class MyAction extends ActionSupport {

    @Override
    public String execute() throws Exception {

        //some code here...
    }

    @Validations(
        customValidators = {@CustomValidator(type="myCostomValidator", fieldName="myFieldName", shortCircuit=true, message="")}         
    )
    public String info() {

        //some code here...
    }

    @Validations(
        customValidators = {@CustomValidator(type="myCostomValidator", fieldName="anotherFieldName", shortCircuit=true, message="")},
        visitorFields = {@VisitorFieldValidator(context="update_context", fieldName="anObjectField", message="", shortCircuit=true)}            
    )
    public String update() {

        //some code here...
    }

    //getters, setters and other...
}

Теперь каждый из трех методов может быть вызван и имеет различную проверку. Если проверка не пройдена, платформа устанавливает результат «ввод», который необходимо настроить в файле struts.xml:

<action name="myAction_*" method="{1}" class="com.test.gui.action.test.MyAction">
    <result name="success">result1.jsp</result>
    <result name="edit">result2.jsp</result>
    <result name="input">result3.jsp</result>
</action>

Как я могу иметь разные результаты «ввода» для каждого метода действия? Например, я хотел бы открыть одну страницу, если проверка не пройдена для метода info(), и другую страницу, если проверка не пройдена для метода update(). Спасибо.


person Perelum    schedule 30.03.2015    source источник
comment
Результаты могут принимать выражение OGNL, но... как есть это свяжет сторону Java непосредственно с уровнем представления. Моей первой мыслью было посмотреть, можно ли настроить перехватчик рабочего процесса по умолчанию через OGNL, чтобы он возвращал другое имя результата, отличное от "input", но я не уверен, что это будет правильно оценено, но я все же попробую, чтобы увидеть что случается.   -  person Dave Newton    schedule 30.03.2015
comment
Я бы разделил его на три действия, в конечном итоге разделив базовое действие с обычными вещами (prepare() или что-то в этом роде). Затем каждый из них может вернуть свой собственный результат INPUT. Больше методов действий в одном классе действий имеет смысл, если методы разделяют почти все, но если даже общие результаты должны быть разными, то было бы лучше использовать разные действия с одним методом каждый, ИМХО   -  person Andrea Ligios    schedule 16.04.2015


Ответы (2)


Я нашел это решение: использование аннотации @InputConfig.

С помощью этой аннотации вы можете установить имя результата «для каждого метода» для ошибок проверки. Таким образом, в struts.xml вы можете настроить для каждого имени результата страницу, на которую вы хотите попасть.

Примеры:

@InputConfig(resultName="input_update")
public String update() {
    // perform action
    return SUCCESS;
}

и в struts.xml: <result name="input_update">jsp/input_update.jsp</result>

or:

@InputConfig(methodName="inputMethod")
public String update() {
    // perform action
    return SUCCESS;
}
public String inputMethod() {
    // perform some data filling
    return INPUT;
}

struts.xml: <result name="input">jsp/myInput.jsp</result>

См. документацию по адресу struts.apache.org/docs/inputconfig-annotation.html.

Также можно установить имя результата ввода в struts.xml, установив параметр для перехватчика «рабочий процесс», но это влияет на все методы в действии:

<interceptor-ref name="workflow">
    <param name="inputResultName">custom_input_result</param>
</interceptor-ref>

см. документ здесь struts.apache.org/docs/default-workflow-interceptor.html< /а>

person Perelum    schedule 03.04.2015

Вам не нужно изменять имя возвращаемого результата. Вы используете сопоставление с подстановочными знаками для своего действия, поэтому используйте его и для имени файла JSP.

<action name="myAction_*" method="{1}" class="com.test.gui.action.test.MyAction">
    <result name="success">success.jsp</result>
    <result name="input">result_{1}.jsp</result>
</action>
person Aleksandr M    schedule 30.03.2015
comment
Оно работает! Но это немного ограничивает, потому что в этом случае невозможно убедиться, что два разных метода действия имеют одну и ту же страницу результатов для ввода. Например, предположим, что у меня есть три метода для одного и того же действия: search(), create(), update(), и в случае ошибок проверки я хочу, чтобы search() заканчивался на test_search.jsp, а create() и update() каждый заканчивается на одной странице, например, test_edit.jsp. Как настроить файл struts.xml? - person Perelum; 03.04.2015
comment
@Perelum: Самый простой способ - создать две страницы и включить форму редактирования. - person Aleksandr M; 06.04.2015