JSP - AJAX 并且 Controller 获取对象但不更新 modelAttriibute
JSP - AJAX and Controller gets the Object but does not update modelAttriibute
页面加载时,它会填充 table。
@RequestMapping(value = { "/access" }, method = RequestMethod.GET)
public String access(ModelMap model) {
List<UserDTO> users = userService.findAllUsers();
model.addAttribute("users", users);
UserDTO user = new UserDTO();
model.addAttribute("user", user);
return "access";
}
当用户在某一行上单击“编辑”时,将调用ajax。
function getDetails(id) {
$.ajax({
type : "get",
data : {id: id},
url : "get-details",
cache : false,
success : function(response) {
// code here
},
});
}
在控制器上,它将获得具有提供的 id 的 UserDTO。
@RequestMapping(value = { "/get-details" }, method = RequestMethod.GET)
@ResponseBody
public String getDetails(@RequestParam("id") String id, ModelMap model) {
UserDTO user = userService.findById(id);
model.addAttribute("user", user);
return access; //'access' is the current page
}
在我的 jsp 我有...
<form:form method="POST" modelAttribute="user" class="form-horizontal">
我的问题是 "user" 的属性仍然为空且未更新。
请注意,在调用 ajax 调用控制器后, userService.findById 有结果。
我错过了什么?
谢谢。
更新
我认为我确实需要使用 ajax 调用后的响应更新 jsp 中的 modelAttribute="user"。
因为我正在使用 "user" 属性并将其绑定到字段和错误
<form:form method="POST" modelAttribute="user" class="form-horizontal">
<div class="modal-content">
<div class="modal-body">
<!-- Default panel contents -->
<form:input type="hidden" path="id" id="id" />
<div class="row">
<div class="form-group col-md-14">
<label class="col-md-3 control-label" for="firstName">First
Name</label>
<div class="col-md-7">
<form:input type="text" path="firstName" id="firstName"
class="form-control input-sm" />
<div class="has-error">
<form:errors path="firstName" class="help-inline" />
</div>
</div>
</div>
</div>
</div>
</div>
</form:form>
如果我直接设置输入字段,如果提交的表单有错误(例如空字段),我会遇到错误
SEVERE: Servlet.service() for servlet [dispatcher] in context with path [/SSSBackEnd] threw exception [java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'user' available as request attribute] with root cause
java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'user' available as request attribute
at org.springframework.web.servlet.support.BindStatus.(BindStatus.java:144)
at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getBindStatus(AbstractDataBoundFormElementTag.java:168)
at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getPropertyPath(AbstractDataBoundFormElementTag.java:188)
at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getName(AbstractDataBoundFormElementTag.java:154)
at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.writeDefaultAttributes(AbstractDataBoundFormElementTag.java:117)
at org.springframework.web.servlet.tags.form.AbstractHtmlElementTag.writeDefaultAttributes(AbstractHtmlElementTag.java:422)
好的,你想在 success: function(response){ }
中获取你的对象,所以你应该这样做:
@RequestMapping(value = { "/get-details" }, method = RequestMethod.GET)
@ResponseBody
public UserDTO getDetails(@RequestParam("id") String id, ModelMap model) {
UserDTO user = userService.findById(id);
return user; //return the object not the view name
}
在你的 ajax 部分:
success: function(response){
//response = UserDTO
alert(response.name); //for example
}
我所做的是在控制器中设置模型属性并让它 return jsp 名称本身(访问)。 (未进行任何更改)
然后在 Ajax 响应中,我添加了一个更新以使用此代码访问 html。
$('#accessid').html(response);
页面加载时,它会填充 table。
@RequestMapping(value = { "/access" }, method = RequestMethod.GET)
public String access(ModelMap model) {
List<UserDTO> users = userService.findAllUsers();
model.addAttribute("users", users);
UserDTO user = new UserDTO();
model.addAttribute("user", user);
return "access";
}
当用户在某一行上单击“编辑”时,将调用ajax。
function getDetails(id) {
$.ajax({
type : "get",
data : {id: id},
url : "get-details",
cache : false,
success : function(response) {
// code here
},
});
}
在控制器上,它将获得具有提供的 id 的 UserDTO。
@RequestMapping(value = { "/get-details" }, method = RequestMethod.GET)
@ResponseBody
public String getDetails(@RequestParam("id") String id, ModelMap model) {
UserDTO user = userService.findById(id);
model.addAttribute("user", user);
return access; //'access' is the current page
}
在我的 jsp 我有...
<form:form method="POST" modelAttribute="user" class="form-horizontal">
我的问题是 "user" 的属性仍然为空且未更新。 请注意,在调用 ajax 调用控制器后, userService.findById 有结果。 我错过了什么?
谢谢。
更新
我认为我确实需要使用 ajax 调用后的响应更新 jsp 中的 modelAttribute="user"。 因为我正在使用 "user" 属性并将其绑定到字段和错误
<form:form method="POST" modelAttribute="user" class="form-horizontal">
<div class="modal-content">
<div class="modal-body">
<!-- Default panel contents -->
<form:input type="hidden" path="id" id="id" />
<div class="row">
<div class="form-group col-md-14">
<label class="col-md-3 control-label" for="firstName">First
Name</label>
<div class="col-md-7">
<form:input type="text" path="firstName" id="firstName"
class="form-control input-sm" />
<div class="has-error">
<form:errors path="firstName" class="help-inline" />
</div>
</div>
</div>
</div>
</div>
</div>
</form:form>
如果我直接设置输入字段,如果提交的表单有错误(例如空字段),我会遇到错误
SEVERE: Servlet.service() for servlet [dispatcher] in context with path [/SSSBackEnd] threw exception [java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'user' available as request attribute] with root cause java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'user' available as request attribute at org.springframework.web.servlet.support.BindStatus.(BindStatus.java:144) at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getBindStatus(AbstractDataBoundFormElementTag.java:168) at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getPropertyPath(AbstractDataBoundFormElementTag.java:188) at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getName(AbstractDataBoundFormElementTag.java:154) at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.writeDefaultAttributes(AbstractDataBoundFormElementTag.java:117) at org.springframework.web.servlet.tags.form.AbstractHtmlElementTag.writeDefaultAttributes(AbstractHtmlElementTag.java:422)
好的,你想在 success: function(response){ }
中获取你的对象,所以你应该这样做:
@RequestMapping(value = { "/get-details" }, method = RequestMethod.GET)
@ResponseBody
public UserDTO getDetails(@RequestParam("id") String id, ModelMap model) {
UserDTO user = userService.findById(id);
return user; //return the object not the view name
}
在你的 ajax 部分:
success: function(response){
//response = UserDTO
alert(response.name); //for example
}
我所做的是在控制器中设置模型属性并让它 return jsp 名称本身(访问)。 (未进行任何更改)
然后在 Ajax 响应中,我添加了一个更新以使用此代码访问 html。
$('#accessid').html(response);