Весенняя форма не отправляется

Я использую Spring SimpleFormController для своих форм, и по какой-то причине он не переходит к методу onSubmit.

Вот мой код:

public class CreateProjectController extends SimpleFormController {

ProjectDao projectDao;

public CreateProjectController() {
    setCommandClass(Project.class);
    setCommandName("Project");
    setSessionForm(true);
}
@Override
protected Object formBackingObject(HttpServletRequest request)
        throws Exception {
    String id = request.getParameter("id");
    Project project = projectDao.getProjectByOutsideId(id);
    System.out.println("@formbacking object method");
    System.out.println("the success view is "+getSuccessView());
    return project;
}
@Override
protected ModelAndView onSubmit(Object command) throws Exception {
    Project project = (Project) command;
    System.out.println("this is the project title: "+project.getTitle());
    System.out.println("the success view is "+getSuccessView());
    projectDao.insert(project);

    return new ModelAndView(getSuccessView());
}

Я знаю, потому что он печатает строку «метод объекта @formbacking», но не строку «успешное представление ...» и строку: «это pr ...». Я вижу строку «@formback..» в консоли, но не последние две, когда я нажимаю «Отправить». Я не знаю, где проблема.

это мой жсп

<form:form method="POST" commandName="Project">
Name: <form:input path="title"/><br/>
Description: <form:input path="description"/><br/>
Link: <form:input path="url" disabled="true"/><br/>
Tags: <form:input path="tags"/><br/>
Assessors <form:input path="assessors"/><br/><br/>
<input type="submit" value="submit"/>
</form:form>

Я работаю на Google App Engine, кстати. Может проблема в нем?

ОБНОВЛЕНИЕ: проблема, похоже, связана с методом formBackingObject. Когда я удалил его, форма теперь переходит в onSubmit, когда я нажимаю «Отправить».

Но я хотел бы иметь значения из класса команд из базы данных в моих формах.

Другой кусок кода, который не работает:

    @Override
protected Object formBackingObject(HttpServletRequest request)
        throws Exception {
    String id = request.getParameter("id");
    Project projectFromConsumer = projectDao.getProjectByOutsideId(id);
    Project project = new Project();
    String title = projectFromConsumer.getTitle();
    project.setTitle(title);
    project.setUrl("projectUrl");
    return project;
}

но это работает:

    @Override
protected Object formBackingObject(HttpServletRequest request)
        throws Exception {
    String id = request.getParameter("id");
    Project projectFromConsumer = projectDao.getProjectByOutsideId(id);
    Project project = new Project();
    String title = projectFromConsumer.getTitle();
    project.setTitle("projectTitle");
    project.setUrl("projectUrl");
    return project;
}

Теперь я действительно запутался. хаха.


person Jeune    schedule 07.01.2010    source источник


Ответы (3)


Я думал в том же направлении, что и axtavt. У вас будет только параметр запроса идентификатора при обновлениях, поэтому вам следует добавить код для форм создания:

К вашему сведению, formBackingObject требует возврата ненулевого объекта. Чтобы сэкономить немного памяти, вы можете иметь конечную постоянную переменную-член, которая является возвращаемым значением по умолчанию. Ваш код удовлетворяет этому, поскольку вы передаете объекты, но я не понимаю, почему вы передаете данные (создаете дополнительный объект), когда не используете DTO. Вы можете просто сделать это:

private final static Project PROJECT_INSTANCE = new Project();
static {
    PROJECT_INSTANCE.setTitle("defaultProjectTitle");
}

@Override
protected Project formBackingObject(HttpServletRequest request) throws Exception {
    String id = request.getParameter("id");
    if(id == null || id.trim().length() == 0 || !id.matches("\\d+")) {
       return PROJECT_INSTANCE;
    }
    return projectDao.getProjectByOutsideId(id);
}

Вам не нужно скрытое поле ввода идентификатора. Вы должны использовать formBackingObject() для инициализации полей ввода формы для обновления (путем перехода к page.jsp?id=111).

person Droo    schedule 12.01.2010
comment
Хахаха. поскольку все вы здесь пытаетесь сказать мне одно и то же, я думаю, что попробую ваше предложение. Ваше здоровье! :D - person Jeune; 12.01.2010

Посмотрите на String id = request.getParameter("id");. В вашей форме нет такого поля, поэтому, возможно, вы получаете ошибку во время процесса отправки, возможно, getProjectByOutsideId возвращает null.

P.S. Странно, что ваш formBackingObject выполняется, когда вы нажимаете кнопку «Отправить», этого не должно быть, если вы действительно установили setSessionForm(true).

person axtavt    schedule 07.01.2010
comment
getProjectByOutsideId работает, jsp показывает значения класса команды, возвращаемые getProjectByOutsideId. - person Jeune; 08.01.2010

Попробуйте включить весеннюю отладку. Он дает много информации, которая может быть полезной. Сделайте это, отредактировав файл log4j.properties.

log4j.logger.org.springframework=DEBUG

Вы добавили ведение журнала, чтобы убедиться, что formBackingObject что-то возвращает?

System.out.println("@formbacking object method is returning: " + project);

Это гарантирует, что что-то будет возвращено. В общем, formBackingObject всегда должен что-то возвращать.

РЕДАКТИРОВАТЬ:

Идентификатор не передается во время отправки в сниппете. Может быть, это во время загрузки, например. /page.do?id=4, но не отображается в форме.

Добавьте <form:hidden path="id"/> в свою форму во время отправки. В противном случае идентификатор не будет параметром, и getProjectByOutsideId завершится ошибкой.

person jon077    schedule 08.01.2010
comment
Я знаю, что formBackingObject что-то возвращает, потому что он заполняет форму в jsp значениями. Проблема в том, что когда я нажимаю кнопку отправки, он не отправляется. И это должно работать независимо от того, используете ли вы заполненные значения или те, которые вы вводите. - person Jeune; 08.01.2010
comment
Зачем мне ставить скрытое поле с формой? Если я не ошибаюсь, метод formBackingObject вызывается, когда клиент запрашивает представление формы, а не после того, как клиент нажимает кнопку «Отправить». Когда я вызываю эту форму, я, конечно же, включаю в нее идентификатор. Например, localhost:8888/createproject?id=[некоторый id здесь]. После этого форма показывает. Проблема в том, что он не будет отправлять/переходить в режим успеха, когда я нажимаю кнопку «Отправить». - person Jeune; 09.01.2010
comment
Я думаю, что поле id не передается при отправке. Без скрытого поля вы вызываете localhost:8888/createproject, а не localhost:8888/createproject... возможно, добавьте System.out.println(id: + id) ниже String id= request.getParameter(id); быть уверенным. - person jon077; 11.01.2010