Невозможно заполнить атрибут модели весной

Я не могу получить ModelAttribute для второго запроса. Мой первый запрос — метод initForm(). Я подготовил объект Command и смог отобразить команду в jsp.

Через initForm() я заполняю команду и эту команду, которую я хочу, в editForm, когда я буду выполнять вызов ajax.

Вот моя весенняя форма

<form:form method="POST" action="addstudentdetails.htm" commandName="command">
 Ignore what is inside this 

 Name: Shoaib Age:23  <a href="#" onclick="editstudentdetails(1,0)">edit</a>

</form:form>

Мой запрос ajax:

function editStudentDetails(studentId,index){
       $.ajax(
        {url:"editstudentdetails.htm",
         method:"GET",
         data:{"action":"edit","id":studentId,"index":index},
            success: function(data) {
                   jQuery("#studentDetailsDiv").html(data)
            }

        }

      )
   }

В методе editStudentDetails() у меня есть вызов метода ajax для перехода editForm() контроллера.

Вот мой контроллер:

@Controller

public class StudentDetailsController {

@Autowired
private StudentDetailsDAO studentDetailsDAO;

@RequestMapping(value="/studentdetails.htm",method = RequestMethod.GET)
public String initForm(HttpServletRequest request,ModelMap map){
    String action=request.getParameter("action");
    StudentDetailsCommand command=new StudentDetailsCommand();
    System.out.println("in controller"+action);
    command.setStudents(studentDetailsDAO.findAll());
    map.addAttribute("command", command);

    return "studentdetails";
}

@RequestMapping(value="/editstudentdetails.htm",method = RequestMethod.GET)
public String editForm(ModelMap map,HttpServletRequest request){
  map.addObject("index", request.getParameter("index"));
    StudentDetailsCommand command=(StudentDetailsCommand)map.get("command");
  System.out.println(command);
  System.out.println(command.getStudents());//NullPointerException here.
  map.addObject("command", command);
    return "studentdetails";
 }
}

Даже пробовал @ModelAttribute("studentDetailsCommand"), но не работал.

Я новичок в Spring 3.0, и я следовал всем решениям, которые приведены здесь, но ничего не сработало. Может ли кто-нибудь помочь мне, пожалуйста?


person Shoaib Chikate    schedule 11.01.2014    source источник
comment
Какая вторая просьба? О каком атрибуте модели вы говорите?   -  person Sotirios Delimanolis    schedule 11.01.2014
comment
второй запрос, сделанный вызовом ajax, который поступает в методе editForm, и я получаю его через map.get(xxx)   -  person Shoaib Chikate    schedule 11.01.2014
comment
Когда я нажимаю на ссылку редактирования, я отправляю запрос ajax. Позвольте мне также добавить этот метод ajax.   -  person Shoaib Chikate    schedule 11.01.2014
comment
Обновил мой вопрос. Я вам понятен??   -  person Shoaib Chikate    schedule 11.01.2014


Ответы (1)


Атрибуты модели существуют только в течение жизненного цикла одного HttpServletRequest. Рекомендуем прочитать мой ответ здесь.

В вашем методе initForm вы делаете следующее

map.addAttribute("command", command);

это добавит атрибут с именем command к атрибутам модели. Этот атрибут в конечном итоге попадет в атрибуты HttpServletRequest и станет доступным для вашего JSP. Здесь

<form:form [...] modelAttribute="studentDetailsCommand" commandName="command">

во-первых, modelAttribute и commandName имеют одинаковое назначение, т.е. найти атрибут в модели. Если вы удалите commandName, вы получите исключение, потому что нет атрибута модели с именем studentDetailsCommand. Здесь ваше значение commandName перезаписывает ваше значение modelAttribute.

Когда контейнер сервлета завершает визуализацию вашего JSP, визуализированный контент отправляется в виде тела ответа HTTP. На данный момент запрос обработан, а атрибуты HttpServletRequest и модели удалены сборщиком мусора.

Когда вы отправляете новый запрос через AJAX, больше нет атрибута модели с именем studentDetailsCommand (на самом деле его никогда не было).

Рассмотрите возможность использования Атрибуты Flash.

Связанный:

person Sotirios Delimanolis    schedule 11.01.2014
comment
Итак, можете ли вы сказать мне, как я могу решить свою проблему. Должен ли я удалить свой атрибут модели из формы или изменить его на команду. Пожалуйста, проверьте мой обновленный вопрос, на который я последовал вашему предложению. - person Shoaib Chikate; 11.01.2014
comment
@ShoaibChikate Да, используйте либо modelAttribute, либо commandName, а не оба. Как я уже говорил в своем ответе, изучите атрибуты флэш-памяти. - person Sotirios Delimanolis; 11.01.2014
comment
Здесь происходит то, что initForm заполняет атрибуты, и когда запускается другой запрос, команда не является их в modelMap .... так что я должен добавить команду как flashAttribute в initForm() - person Shoaib Chikate; 11.01.2014
comment
@ShoaibChikate Это сделает его доступным в следующем запросе. Если это то, чем вы хотите заниматься, то да. - person Sotirios Delimanolis; 11.01.2014
comment
Добавлен атрибут redirectAttribute в initForm, но я не могу получить доступ к jsp. - person Shoaib Chikate; 12.01.2014
comment
@ShoaibChikate Не удается получить доступ к чему? - person Sotirios Delimanolis; 12.01.2014
comment
reDirect.addFlashAttribute(command,command) это я добавил в initForm, но в studentDetails.jsp, когда я печатаю ${command} ничего не дает. - person Shoaib Chikate; 12.01.2014
comment
@ShoaibChikate Пожалуйста, отредактируйте свой вопрос, указав, что вы сейчас пытаетесь. - person Sotirios Delimanolis; 12.01.2014
comment
Я решил сохранить modelAttribute как в SessionAttribute, чтобы он был доступен для моего следующего запроса. Вы можете обновить свой ответ, чтобы я мог принять его в соответствии с - person Shoaib Chikate; 12.01.2014
comment
@ShoaibChikate Это то, что уже делают RedirectAttributes и FlashMap. RedirectAttributes хранит ваши флэш-атрибуты в ModelMap, который объединяется с атрибутами HttpServletRequest. Этот ModelMap также используется для создания FlashMap, который сохраняется в HttpSession и извлекается в следующем запросе. - person Sotirios Delimanolis; 12.01.2014
comment
Хорошо, братан, спасибо за твое время и помощь. Изучил новую концепцию ReDirectAttributes. - person Shoaib Chikate; 12.01.2014
comment
Надеюсь, что этот вопрос и ответ помогут многим пользователям с таким же требованием. - person Shoaib Chikate; 12.01.2014