Não foi possível preencher modelAttribute na primavera
-
26-12-2019 - |
Pergunta
Não consigo obter o ModelAttribute para a segunda solicitação.Minha primeira solicitação é o método initForm() que preparei o objeto Command e sou capaz de exibir o comando em jsp.
Através do initForm() estou preenchendo o comando e aquele comando que desejo no editForm quando farei uma chamada ajax.
Aqui está minha forma de primavera
<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>
Minha solicitação 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)
}
}
)
}
Em editStudentDetails()
método eu tenho chamada de método ajax para ir editForm()
do controlador.
Aqui está meu controlador:
@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";
}
}
Até tentei @ModelAttribute("studentDetailsCommand") mas não funcionou.
Sou novo no Spring 3.0 e segui todas as soluções fornecidas aqui, mas nada funcionou.
Solução
Os atributos do modelo só existem durante o ciclo de vida de um HttpServletRequest
.Considere ler minha resposta aqui.
Na tua initForm
método, você faz o seguinte
map.addAttribute("command", command);
isso adiciona um atributo chamado command
aos atributos do modelo.Este atributo acabará por encontrar o seu caminho para o HttpServletRequest
atributos e estar disponível para seu JSP.Aqui
<form:form [...] modelAttribute="studentDetailsCommand" commandName="command">
em primeiro lugar, modelAttribute
e commandName
têm o mesmo propósito, ou seja.para encontrar um atributo no modelo.Se você remover commandName
você receberá uma exceção porque não há nenhum atributo de modelo chamado studentDetailsCommand
.Aqui está o seu commandName
o valor de está sobrescrevendo seu modelAttribute
o valor.
Quando o contêiner Servlet termina de renderizar seu JSP, o conteúdo renderizado é enviado como o corpo da resposta HTTP.Neste ponto, a solicitação foi atendida e o HttpServletRequest
e os atributos do modelo são coletados como lixo.
Quando você envia sua nova solicitação através de AJAX, não há mais nenhum atributo de modelo chamado studentDetailsCommand
(na verdade nunca houve).
Considere usar Atributos Flash.
Relacionado: