как подготовить вид в стойках 1.x - PullRequest
0 голосов
/ 19 января 2011

Я новичок в стойках.У меня есть Form, Action и jsp view.

<form-beans>
    <form-bean name="bookEventForm" type="com.example.BookEventForm" />
</form-beans>

<action path="/bookEvent"
        type="com.example.BookEventAction"
        name="bookEventForm"
        input="/WEB-INF/jsp/bookEvent.jsp"
        scope="request">
    <forward name="success" path="/WEB-INF/jsp/bookEvent.jsp" />
</action>

. Одним из свойств формы события является Country, поэтому первое, что я делаю в Action, это:

request.setAttribute("countries", countriesDao.getAll());

в представлении, которое я визуализирую для элемента select, используя:

<html:select property="..." >
    <html:optionsCollection name="countries" ... />
</html:select>

Это прекрасно работает, пока я не добавлю ActionForm # validate для выполнения некоторых проверок валидации (не связанныхв страны, например, фамилия! = ноль).

По спецификации Struts, как только возникает ошибка, Action#execute никогда не выполняется.Таким образом, коллекция countries больше не находится в запросе, и представление отображается с пустым элементом select.

Я знаю, что, скорее всего, мне не хватает некоторой базовой концепции стоек.Друг предложил сделать дао доступным в представлении, чтобы я мог выбрать страны в любое время, но в целом я предпочитаю подготовить представление (предварительную выборку данных из базы данных) до того, как будет выполнен любой JSP-код.

Есть идеи?

Ответы [ 4 ]

0 голосов
/ 29 июля 2011

На самом деле в Struts 1 встроен механизм, который позволяет вам то, что вам нужно: метод сброса ActionForm.

Он предназначен для сброса полей формы до значений по умолчанию, но так, как он выполняется до заполненияформа, т. е. до вызова метода validate, он также хорошо работает для хранения коллекций или других объектов в сеансе:

@Override
public void reset(ActionMapping mapping, HttpServletRequest request) {
    request.setAttribute(SITES, siteDao.findAll());
    request.setAttribute(SERVICES, serviceDao.findAll());
}
0 голосов
/ 20 января 2011

Насколько мне известно, в случае сбоя проверки, элемент управления возвращается на экран с ошибками ActionErrors, заполненными в методе validate.И прежде чем вызывать validate, форма заполняется.

0 голосов
/ 24 января 2011

Что я сделал, чтобы преодолеть распорки * Проблема 1001 * состояла в том, чтобы обойти распорки и добавить собственный метод validate в Form:

public ActionErrors validate() {
    ActionErrors errors = new ActionErrors();
    if (...) errors.add("name", new ActionError("error.field.mandatory"));
    if (...) errors.add("surname", new ActionError("error.field.mandatory"));
    return errors;
}

И позвони из Action:

saveErrors(request, ((BookEventForm)form).validate());

Прекрасно работает и отвечает моим требованиям. Теперь действие всегда выполняется перед представлением представления, страницы об ошибке или страницы успеха и содержит код, который подготавливает представление.

0 голосов
/ 20 января 2011

Я думаю, что самый простой способ - использовать метод препопуляции, описанный здесь .Я никогда лично не использовал этот подход (я использовал формы сессий).

Кроме того, вы можете включить настройку списка стран в метод validate () вашей формы (но это немного хак).

...