Я думаю, вы неправильно понимаете некоторые понятия и термины Struts2.Почему вы называете свои действия «входом» и «результатом»?Это плохая практика и вводит в заблуждение, особенно потому, что «input» - это название стандартного Struts2 «result».
Действия должны вызываться в соответствии с действием , которое они выполняют.
Основной шаблон прост.URL (HTTP-запрос, GET или POST) соответствует пользователю (браузеру, клиенту), запрашивающему сервер (webapp, с Struts2 вверху) выполнить какое-либо действие .Действие может дать несколько результатов , каждый из которых вернет пользователю некоторую информацию (представление) (обычно HTML, сгенерированный через страницу JSP).
Простой пример.Предположим, я хочу добавить 2 числа и отобразить результат.(Я перезапишу свой ответ с здесь .
URL: http://...../addnumbers.action
Здесь имя действия «addnumbers» - этот запрос будет выполнять сложение (необманывают и думают, что он покажет также форму ввода - пока она будет , а не , - он просто выполняет сложение, как следует из его названия)
Типичная реализация. В struts.xmlВы указываете отображение :
<action name="addnumbers" class="example.AddNumbersAction">
<result name="success">/AddNumbersResult.jsp</result> <!-- 'success' can be omitted here -->
</action>
Ваше действие Java:
public class AddNumbersAction extends ActionSupport {
private int x;
private int x;
private int z;
public String execute() {
z = x + y;
return SUCCESS;
}
// getters and setters ommited
}
И ваше AddNumbersResult.jsp
:
<div>
Result of addition:
<s:property value="x"> + <s:property value="y"> = <s:property value="z">
</div>
Вы можете(вам следует!) убедитесь, что ввод url http://.../mywebapp/addnumbers.action?x=10&y=20
работает должным образом.
В сценах Struts2 (с конфигурацией по умолчанию, стеком перехватчиков по умолчанию) создает экземпляр AddNumbersAction
и вызываетотражение сеттеров, соответствующих параметрам http (прилагая все усилия для преобразования типов - от строки к целому числу здесь). Затем вызывается метод действия по умолчанию («execute»), результатом является «success», и AddNumbersResult.jsp
используется для создания HTML-страницы; вна этом этапе объект Action находится в «стеке значений» (своего рода области видимости), поэтому теги вызывают его получатели.
Как только вы это выясните, остаются две проблемы: как отобразить предыдущую HTML-страницудля пользователя, чтобы ввести числа («форма ввода»), и как обращаться с неверными или неполными аргументами.Эти вопросы связаны между собой.
Существует несколько (несколько) подходов.Одна возможность: добавить другое сопоставление действий:
<action name="addnumbersForm"> <!-- no action specified - will use ActionSupport -->
<result>/AddNumbersInputForm.jsp</result>
</action>
И ваш /AddNumbersInputForm.jsp
:
<div>
Please type two integer numbers to be added<p>
<s:actionerrors /> <!-- see below -->
<s:form action="addnumbers">
<s:textfield name="x" label="X value" />
<s:textfield name="y" label="Y value" />
<s:submit />
</s:form>
</div>
Поскольку мы не указываем класс Action, будет использоваться фиктивная по умолчанию (и "успех "будет возвращен).Вид действия «ничего не делать».
На самом деле, здесь было бы достаточно простой HTML-страницы, но с помощью тегов struts2 мы получаем «связывание» элементов ввода с полями действия, и поэтому мыможет иметь дело с ошибками и повторными попытками.По (простому) соглашению, действие Struts2 будет возвращать «ввод» (вместо «успех»), когда аргументы недостаточны или недействительны (идея состоит в том, что действие говорит: «Вы дали мне указание выполнить это действие X, но я не былУспешно, мне нужно, чтобы вы дали мне правильный ввод , пожалуйста - возможно, вы хотите повторить попытку? ").Итак, в нашем случае мы получаем это полное отображение struts.xml для сценария:
<action name="addnumbersForm">
<result>/AddNumbersInputForm.jsp</result>
</action>
<action name="addnumbers" class="example.AddNumbersAction">
<result name="input">/AddNumbersInputForm.jsp</result>
<result name="success">/AddNumbersResult.jsp</result>
</action>
И в нашем AddNumbersInputForm.jsp мы можем добавить тег, чтобы показать ошибки проверки (генерируемые внутри Struts2 илинаш код).
Затем, если мы нажмем кнопку отправки с недопустимыми аргументами, Struts обнаружит это в перехватчике параметров (плюс проверка, если вы его настроите) и вернет «input» перед вызовом метода execute ().Затем будет отображено AddNumbersInputForm.jsp
, но теперь текстовые поля будут заполнены предыдущими значениями.Отсюда?От действия, если поле может быть установлено, или от самого запроса.Эта небольшая магия необходима для любой удобной формы ввода html (и это важно понимать).
Есть несколько других способов, но существенным моментом является разграничение: «вариант использования» здесь только один (добавьте два числа), но действий (концептуально) два: первый просто представляет пользователю вводформа, вторая на самом деле делает сложение.Эта концепция должна быть отражена в названии действий / URL.