【问题标题】:Unable to populate modelAttribute in spring春季无法填充modelAttribute
【发布时间】:2014-01-30 17:42:32
【问题描述】:

我无法获取第二个请求的 ModelAttribute。 我的第一个请求是 initForm() 方法,我准备了 Command 对象并能够在 jsp 中显示命令。

当我进行 ajax 调用时,我通过 initForm() 填充命令和我想要在 editForm 中的命令。

这是我的春季表格

<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 的新手,我遵循了此处提供的所有解决方案,但没有任何效果。有人可以帮助我吗?

【问题讨论】:

  • 第二个请求是什么?你在说什么模型属性?
  • 由 ajax 调用发出的第二个请求,它来自 editForm 方法,我通过 map.get("xxx") 得到它
  • 当我点击编辑链接时,它是我发送的 ajax 请求。让我也添加该 ajax 方法。
  • 更新了我的问题。我清楚吗??

标签: java spring spring-mvc controller modelattribute


【解决方案1】:

模型属性只存在于一个HttpServletRequest 的生命周期中。考虑阅读my answer here

在您的 initForm 方法中,您执行以下操作

map.addAttribute("command", command);

这会将名为command 的属性添加到模型属性中。该属性最终将进入HttpServletRequest 属性并可供您的JSP 使用。在这里

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

首先,modelAttributecommandName 具有相同的目的,即。在模型中查找属性。如果您删除commandName,您将得到一个异常,因为没有名为studentDetailsCommand 的模型属性。在这里,您的 commandName 的值正在覆盖您的 modelAttribute 的值。

当 Servlet 容器完成呈现您的 JSP 时,呈现的内容将作为 HTTP 响应的主体发送。至此,请求已处理完毕,HttpServletRequest 和模型属性已被垃圾回收。

当您通过 AJAX 发送新请求时,不再有任何名为 studentDetailsCommand 的模型属性(实际上从未有过)。

考虑使用Flash Attributes

相关:

【讨论】:

  • 那么你能告诉我如何解决我的问题吗?我应该从表单中删除我的 modelAttribute 还是将其更改为“command”。请检查我按照你的建议更新的问题。
  • @ShoaibChikate 是的,使用modelAttributecommandName,不能同时使用。正如我在回答中所说,请查看 flash 属性。
  • 这里发生的事情是 initForm 正在填充属性,当另一个请求开始时,命令不是它们在 modelMap 中的......所以我在 initForm() 中将命令添加为 flashAttribute
  • @ShoaibChikate 这将使它在下一个请求中可用。如果那是你想要做的,那么是的。
  • @ShoaibChikate RedirectAttributesFlashMap 已经这样做了。 RedirectAttributes 将您的闪存属性存储在与HttpServletRequest 属性合并的ModelMap 中。 ModelMap 也用于生成 FlashMap,它存储在 HttpSession 中并在下一个请求中检索。
猜你喜欢
  • 2011-11-03
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-30
  • 2014-04-11
  • 1970-01-01
  • 2012-12-04
相关资源
最近更新 更多