У меня проблема с установщиком struts2 (im new в struts2).
У меня есть две кнопки на моей странице, и каждый из них проверяет 2 правила общего доступа, а второй добавляет другое конкретное правило.
Вот моя конфигурация:
мое действие - VPJ001Action.java
struts.xml
конфигурации struts.xml
выглядит следующим образом:
<action name="VPJ001" class="VPJ001Action">
<result>/jsp/test.jsp</result>
</action>
<action name="VPJ001ValidationAction" method="validation" class="VPJ001Action">
<result name="PAGE_VPJ002" type="chain">VPJ002!execute</result>
<result>/jsp/test1.jsp</result>
</action>
<action name="VPJ001DiffusionMailAction" method="diffusionMail" class="VPJ001Action">
<result>/jsp/test.jsp</result>
</action>
моя первая кнопка вызывает VPJ001ValidationAction
а вторая вызывает VPJ001DiffusionMailAction
моя настройка валидатора:
VPJ001Action-validation.xml
содержит 2 общих правила:
<validators>
<field name="bassin">
<field-validator type="required">
<message key="validation.bassin.requis"/>
</field-validator>
</field>
<field name="moisAValider">
<field-validator type="required">
<message key="validation.mois.requis"/>
</field-validator>
</field>
</validators>
а также
VPJ001Action-VPJ001DiffusionMailAction-validation.xml
содержит специальное правило:
<validators>
<field name="moisAValider">
<field-validator type="regex" short-circuit="true">
<param name="expression">.*[\*]$</param>
<message key="validation.mois.valide"/>
</field-validator>
</field>
</validators>
Вот результат:
когда я нажимаю на 2 кнопки, у меня есть всплывающее окно с правилом 2 общих прав, потому что я ничего не выбираю на странице, его работа прекрасна.
когда я выбираю басина и moisAValider, если я нажимаю кнопку подтверждения, все в порядке, im redirect на хорошей странице
когда я выбираю басина и moisAValider, если я нажимаю на diffusionMailbutton, страница обновляется, и всплывающее окно открыто с моим конкретным правилом (регулярное выражение не соблюдается), но страница была перезагружена!
Я хочу иметь этот сценарий:
Если я нажимаю кнопку подтверждения, не выбирая ничего, я хочу, чтобы всплывающее окно с двумя правилами общего пользования не соблюдалось
и если я нажимаю на diffusionMailButton без выбора чего-либо, я хочу, чтобы всплывающее окно с 2 правилами общего пользования не соблюдалось и конкретное правило,
это возможно?
Я хочу, чтобы проверка для конкретного правила выполнялась на стороне клиента, а не на стороне сервера, потому что если его сделать на стороне сервера, страница перезагружается, а весь мой список пуст... мне нужно перезагрузить весь список и его не обязательно, если все валидатор может быть выполнен на стороне клиента...
Спасибо за помощь!
Я нашел свое решение.
Поскольку валидатор не делает то, что я хочу, я добавляю только 2 валидатора для двух кнопок (эти валидаторы являются проверкой на стороне клиента), и я добавляю еще один валидатор, используя <field-validator type="expression">
для вызова метода java, Этот метод проверяет запрошенное действие и возвращает true или false, когда это необходимо.
Последнее, когда этот метод возвращает false, я перенаправлен на jsp, и все мои selectbox обновлены и пустые, потому что, когда я отправляю свою форму, все списки не переходят на сервер. Мне нужно добавить скрытый ввод в мою форму со списком. Поскольку я использую List i, я сделал конвертер, который сериализует результат, чтобы иметь только один скрытый ввод:
<input type="hidden" name="listeBassinSurveillance" id="formulaireVPJ_listeBassinSurveillance" value="H4sIAAAAAAAAAJ2WS4/bVBTHbzJ5dR5tmCmdMtMBS0gVCCWTGdJ.....">
и когда я отправляю форму, значение десериализуется, и все значения помещаются в список в действии, поэтому, когда я обновляю jsp, все мои списки не пустые!
это кажется сложным, но очень простым и понятным.
Спасибо всем!
Кажется, что вы хотите проверить на стороне клиента, почему бы вам не использовать javascript или jquery для них, и ваша проблема будет решена. Я мог бы прокомментировать, но не могу. Ниже приведены ссылки для вашей справки.
есть способ в struts2 с javascript ajax
в вашем struts.xml вы можете определить результат своего метода как: -
<result type="stream">
<param name="contentType">text/html</param>
<param name="inputName">inputStream</param>
</result>
а затем в вашем методе действий вы можете проверить все, что хотите проверить, а затем, если эта проверка правильна, установите следующим образом:
this.setInputStream(new ByteArrayInputStream(SUCCESS.getBytes()));
и если проверка не удалась, тогда
this.setInputStream(new ByteArrayInputStream(ERROR.getBytes()));
это все со стойки бок. в вашей по форме отправьте в java-script, вы можете сделать несколько как это
$.ajax({
traditional: true,
type: "POST",
url : ctxPath + "/yourActionName",
data : "yourField="+value,
dataType: "text",
success : function(data, success) {
if(data.indexOf("success")==-1){
alert("Action returned Error");
return false;
}else{
alert("Action returned Success");
}
},
});