首先,我想說我已經閱讀了許多關於SO(和其他地方)這個錯誤的問題和解答,但沒有幫助這個特定的情況。無論是BindingResult還是bean名稱爲'student'的普通目標對象都可以作爲請求屬性 - Spring MVC
我簡單的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}">
...
我知道這是很長,但我想介紹所有相關信息。 有沒有人有一個想法,我犯了一個錯誤?
'@zeroflagL'謝謝,這個工程。我還發現,如果我將'return'重定向:/ essays/main/student/addSearch「'而不是'return」addAfterSearchStudent「',我上面發佈的代碼工作。我在春季的文檔中閱讀過重定向,但並沒有真正理解。你可以解釋一下這兩者之間的區別嗎,還是將我指向其他來源? –
@just_a_girl重定向告訴瀏覽器調用URL「/ essays/main/student/addSearch」,這又意味着調用getAddSearchStudent()方法。這幾乎就像你直接在瀏覽器中輸入這個URL。 – zeroflagL