Spring MVC: ни BindingResult, ни простой целевой объект для имени компонента ‘marks’ не доступны в качестве атрибута запроса. Перепробовал все решения

#spring #eclipse #spring-mvc

#spring #eclipse #spring-mvc

Вопрос:

Я перепробовал все решения, но я продолжаю получать эту ошибку. Более того, если я не использую form:form в файле jsp и использую простой HTML, я получаю желаемый результат.

Класс контроллера

 @Controller
public class controller_class {

    /*
     * @RequestMapping(path = "/index", method = RequestMethod.GET) public
     * ModelAndView mar() { return new ModelAndView("index","command",new marks());
     * }
     */
    @RequestMapping("/index")
    public ModelAndView showComments() {
        return new ModelAndView("marks","command",new marks());
    }

    @RequestMapping(value = "/addMarks", method = RequestMethod.POST)
    public ModelAndView stud(@ModelAttribute("marks") marks m) {
        ModelAndView mv = new ModelAndView("result");
        int k = m.calculate();
        mv.addObject("tot_marks", k);
        return mv;
    }
}
  

index.jsp

 <form:form method = "POST" modelAttribute="marks" action = "/springmvc_qa3/addMarks">
         <table>
            <tr>
               <td><form:label path = "sci_marks">Name</form:label></td>
               <td><form:input path = "sci_marks" /></td>
            </tr>
            <tr>
               <td><form:label path = "maths_marks">Age</form:label></td>
               <td><form:input path = "maths_marks" /></td>
            </tr>
            <tr>
               <td><form:label path = "eng_marks">id</form:label></td>
               <td><form:input path = "eng_marks" /></td>
            </tr>
            <tr>
               <td colspan = "2">
                  <input type = "submit" value = "Submit"/>
               </td>
            </tr>
         </table>  
      </form:form>
   </body>
  

Правильный вывод, если я использую это вместо

 <form method="POST" action="/springmvc_qa3/addMarks"  >
         <table>
            <tr>
               <td><label >Science Marks</label></td>
               <td><input type="text" name="sci_marks" /></td>
            </tr>
            <tr>
               <td><label >Mathematics Marks</label></td>
               <td><input type="text" name="maths_marks" /></td>
            </tr>
            <tr>
               <td><label >English Marks</label></td>
               <td><input type="text" name="eng_marks" /></td>
            </tr>
            <tr>
               <td colspan="2">
                  <input type="submit" value="Submit" />
               </td>
            </tr>
         </table>  
      </form>
  

В чем причина, по которой я не могу получить правильный вывод, используя первый метод?

Комментарии:

1. В вашем контроллере индекса вы передаете объект ‘new marks()’ под именем ‘command’. Но в форме, которую вы используете, объект с именем marks. Кстати, пожалуйста, называйте свои классы заглавной первой буквой, как в общедоступном классе Marks {}, а затем объявляйте переменные с помощью знаков m.

2. Итак, какие изменения я должен включить в код? И да, вы правы. Я позабочусь о том, чтобы называть классы с заглавной первой буквы.

Ответ №1:

добавьте следующее в свой класс контроллера:

 @ModelAttribute("marks")
public Marks nameOfMethodDoesntMatter(){
    return new Marks();
}
  

убедитесь, что в вашем классе Marks есть методы получения, установки и конструктор по умолчанию.

рассмотрите возможность вызова вашего класса MarksDTO или чего-то подобного, чтобы лучше передать его значение (DTO = объект передачи данных).