春天表单没有提交

时间:2010-01-07 23:01:48

标签: java spring google-app-engine spring-mvc

我正在使用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”字符串而不是“成功视图是......”字符串而且:“这是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>

我在谷歌应用引擎上运行btw。也许问题出在那里?

更新:问题似乎与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 个答案:

答案 0 :(得分:1)

我在想和axtavt一样思考。您只会在更新时有一个id请求参数,因此您应该为创建表单添加一些代码:

FYI,formBackingObject需要返回一个非null对象。要节省一些内存,可以使用最终常量成员变量作为默认返回值。您的代码满足了这一点,因为您正在传输对象,但是当您不使用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);
}

您不需要隐藏ID输入字段。您可以使用formBackingObject()初始化表单输入字段进行更新(通过导航到page.jsp?id = 111)。

答案 1 :(得分:0)

查看String id = request.getParameter("id");。您的表单中没有此类字段,因此在提交过程中可能会出现错误,可能getProjectByOutsideId会返回null

P.S。很奇怪,当你按提交时你的formBackingObject正在执行,如果你真的设置setSessionForm(true)则不应该这样。

答案 2 :(得分:0)

尝试打开弹簧调试。它提供了许多有用的信息。通过编辑log4j.properties文件来完成此操作。

log4j.logger.org.springframework=DEBUG

您是否添加了日志记录以确保formBackingObject正在返回某些内容?

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

它将确保返回某些内容。通常,formBackingObject应该总是返回一些东西。

编辑:

在代码段中提交期间未传递ID。也许是在负载期间,例如/page.do?id=4,但它没有出现在表单中。

在提交期间向表单添加<form:hidden path="id"/>。否则,id将不是参数,getProjectByOutsideId将失败。