我正在使用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;
}
现在我真的很困惑。哈哈。
答案 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将失败。