2013-12-19 24 views
0

首先,我想說我已經閱讀了許多關於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}"> 
... 

我知道這是很長,但我想介紹所有相關信息。 有沒有人有一個想法,我犯了一個錯誤?

回答

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); 
+0

'@zeroflagL'謝謝,這個工程。我還發現,如果我將'return'重定向:/ essays/main/student/addSearch「'而不是'return」addAfterSearchStudent「',我上面發佈的代碼工作。我在春季的文檔中閱讀過重定向,但並沒有真正理解。你可以解釋一下這兩者之間的區別嗎,還是將我指向其他來源? –

+0

@just_a_girl重定向告訴瀏覽器調用URL「/ essays/main/student/addSearch」,這又意味着調用getAddSearchStudent()方法。這幾乎就像你直接在瀏覽器中輸入這個URL。 – zeroflagL

相關問題