Весенняя форма не отправляется - PullRequest
0 голосов
/ 08 января 2010

Я использую 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 object method", но не строку "view success is ..." и строку: "this is pr ...". Я вижу строку "@formback .." в консоли, но не последние два, когда я нажимаю "Отправить". Я не знаю, где проблема.

Это мой JSP

<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;
}

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

Ответы [ 3 ]

1 голос
/ 12 января 2010

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

К вашему сведению, 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).

0 голосов
/ 08 января 2010

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

log4j.logger.org.springframework=DEBUG

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

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

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

EDIT:

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

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

0 голосов
/ 08 января 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...