首先,我想说我在SO(以及其他地方)上已经阅读了很多关于此错误的问题和答案,但对于这个特定情况没有帮助。
我简单的Spring MVC Web应用程序的场景是:用户根据String属性indexNumber搜索学生(searchStudent.jsp)。 indexNumber由用户输入的3个其他属性组成:programId,rollNumber,rollYear。例如,如果programId =“M5”,rollNumber =“10”且rollYear =“2013”,则indexNumber将为“M5 10/13”。这在视图中完成。 indexNumber是每个学生的唯一标识符,但不是PK。重要提示:搜索学生并加载适当的页面可以自行完成。
如果学生不存在,addAfterSearchStudent.jsp页面假设加载用户在searchStudent.jsp(programId,rollNumber,indexNumber)中输入的预填充值 - 我不想让用户输入此数据两次。我写了下面的代码,我认为它将完全按照我在这里描述的那样做,但是我得到了上面提到的错误。当我对这些属性进行硬编码并尝试保存数据时,这也可以正常工作。我认为问题在于将一个jsp传递给另一个jsp。
这些是我的控制器的处理程序方法:
/**
* Handles and retrieves the search student page
*/
@RequestMapping(value="/search", method = RequestMethod.GET)
public String getSearchStudent(Model model) {
logger.debug("Received request to show search student page");
model.addAttribute("index", new Student());
model.addAttribute("programList", programService.getAll());
return "searchStudent";
}
/**
* Searches for a student by delegating the processing to StudentService.
*/
@RequestMapping(value="/search", method = RequestMethod.POST)
public String postSearchStudent(@RequestParam(value = "program.programId") String programId,
@RequestParam(value = "rollNumber") String rollNumber,
@RequestParam(value = "rollYear") String rollYear,
@RequestParam(value = "indexNumber") String indexNumber,
Model model) {
logger.debug("Received request to search for a student");
model.addAttribute("program.programId", programId);
model.addAttribute("rollNumber", rollNumber);
model.addAttribute("rollYear", rollYear);
model.addAttribute("indexNumber", indexNumber);
// Call StudentService to do the actual searching
Student student = studentService.search(indexNumber);
// if student isn't in the db load addAfterSearchStudent.jsp, else load student.jsp
if (student == null)
return "addAfterSearchStudent";
else
return "student";
}
/**
* Handles and retrieves the add (after search) student page
*/
@RequestMapping(value="/addSearch", method = RequestMethod.GET)
public String getAddSearchStudent(@RequestParam(value = "program.programId") String programId,
@RequestParam(value = "rollNumber") String rollNumber,
@RequestParam(value = "rollYear") String rollYear,
@RequestParam(value = "indexNumber") String indexNumber,
Model model) {
logger.debug("Received request to show add (after search) student page");
Student student = new Student();
student.setRollNumber(rollNumber);
student.setRollYear(rollYear);
student.setIndexNumber(indexNumber);
Program program = programService.get(programId);
student.setProgram(program);
model.addAttribute("student", student);
return "addAfterSearchStudent";
}
/**
* Adds a new student after search by delegating the processing to StudentService.
* Displays a confirmation JSP page
*/
@RequestMapping(value="/addSearch", method = RequestMethod.POST)
public String postAddSearchStudent(@ModelAttribute("student") Student student) {
logger.debug("Received request to add new student after search");
// Call StudentService to do the actual adding
studentService.addAfterSearch(student);
// resolves to /WEB-INF/jsp/success/addStudentSuccess.jsp
return "/success/addStudentSuccess";
}
这是searchStudent.jsp:
<c:url var="searchUrl" value="/essays/main/student/search" />
<form:form modelAttribute="index" method="POST" action="${searchUrl}">
...
这是addAfterSearchStudent.jsp:
<c:url var="saveUrl" value="/essays/main/student/addSearch" />
<form:form commandName="student" method="POST" action="${saveUrl}">
...
我知道这很长,但我想提供所有相关信息。 有没有人知道我在哪里弄错了?
答案 0 :(得分:1)
<form:form commandName="student" ...>
您的addAfterSearchStudent.jsp
需要一个名为'student'的对象。在postSearchStudent()
方法中,您不会在模型中添加一个。
if (student == null)
return "addAfterSearchStudent";
您需要创建一个Student
对象并添加它,就像在getAddSearchStudent()
方法中一样。
Student student = new Student();
student.setRollNumber(rollNumber);
student.setRollYear(rollYear);
student.setIndexNumber(indexNumber);
Program program = programService.get(programId);
student.setProgram(program);
model.addAttribute("student", student);