我在页面模型中保留了一张地图。在调用页面时,我从数据库中获取少量项目并将其保留在地图中,以便我将在JSP中使用它。主要是这些项目用于在下拉列表中填充选项。
@RequestMapping(value = "/initSystemPage")
public String initSystemPage(@ModelAttribute("systemModel") SystemModel systemModel, ModelMap modelMap) {
Map<String, List<DropdownVO>> data = ** fetch items from database **;
systemModel.setData(data);
return "system";
}
调用屏幕后,我可以从模型中获取项目并填充下拉列表中的值。到目前为止很好。但如果我做任何提交表格的行动,就会出现问题。由于我没有在JSP中保留与data属性相对应的元素,因此在提交表单时,下拉数据不会映射到模型,因此在页面刷新后JSP中不可用。
我不想在每个动作方法中填充模型中的项目。如果我将数据保存在会话属性中,是否可以在需要在所有操作中调用的常用方法中填充?类似于init-binder
答案 0 :(得分:1)
如果要保留当前设计,可以在类级别使用@SessionAttributes注释,以确保systemModel属性存储在会话中,并且可以为后续请求访问。但是,请确保在使用SessionStatus完成表单处理后清除该属性。例如
@Controller
@SessionAttributes("systemModel")
public SystemPageController{
@RequestMapping(value = "/initSystemPage" , method = RequestMethod.GET)
public String initSystemPage(@ModelAttribute("systemModel") SystemModel systemModel, ModelMap modelMap) {
Map<String, List<DropdownVO>> data = ** fetch items from database **;
systemModel.setData(data);
return "system";
}
}
或者,您可以使用@ModelAttribute批注指示应为Controller添加模型数据的每个请求调用的方法。
@ModelAttribute("systemModel")
public SystemModel populateSystemModel(){
//code to populate and return
}
签名非常灵活。您可以包含与@RequestMapping方法一起使用的大多数参数,例如HttpServletRequest @RequestParam,@ PathVaribale等