对于不使用命令对象进行丰富的模型,处理程序应该返回什么? ModelAndView - 丰富,模型丰富,Map - entriched ......所有内容都使用ImplicitModel进行了丰富。我可以以某种方式阻止隐式模型传播到ajaxResponse视图吗?
@ActionMapping(params = "javax.portlet.action=sample")
public void response(ActionRequest request, ActionResponse response, Bean bean) {
response.setRenderParameter("javax.portlet.action", "success");
List<MultipartFile> fileList = request.getFiles("file");
}
.....
@RequestMapping(params = "action=success")
public ModelAndView processSuccess(RenderRequest request, Model model) throws IOException {
Map map = new HashMap();
map.put("sucess", "sucess");
return new ModelAndView("ajaxResponse", map);
}
然后,“model”参数(implicitModel)的参数继续执行下一个处理程序,因为Spring的AnnotationMethodHandlerAdapter中存在这种情况。
if (returnValue instanceof ModelAndView) {
ModelAndView mav = (ModelAndView) returnValue;
mav.getModelMap().mergeAttributes(implicitModel);
return mav;
}
View类是这样的:
@Component("someView")
public class SomeView extends AbstractView {
private Logger logger = Logger.getLogger(SomeView.class);
@Override
protected void renderMergedOutputModel(Map map, HttpServletRequest request, HttpServletResponse response)
throws Exception {
logger.info("Resolving ajax request view - " + map);
JSONObject jsonObj = new JSONObject(map);
logger.info("content Type = " + getContentType());
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
response.getWriter().write(jsonObj.toString());
response.getWriter().flush();
}
}
即使我从processSuccess处理程序中删除“Model model”属性,也会发生这种情况。只需将implicitModel参数传播到ajaxResponse视图中,而不仅仅是一个带有我添加的参数的新Map
如何阻止这种传播?
它与this question有关,在spring-portlet-mvc中,有时需要根据某些条件将请求转发给处理程序并将其交给一些要在View中呈现的参数,但不是原始CommandObject,已经处理过。
创建一个JIRA ISSUE - SPR-8267,如果您有相同的问题,请投票。
答案 0 :(得分:1)
答案是:清除ModelMap以防止它被存储为ImplicitModel。
@RequestMapping
public String render(ModelMap modelMap, SessionStatus status, RenderRequest request, RenderResponse response) {
modelMap.clear();
...
}
请注意,如果您在方法级别使用@ModelAttribute,则在您调度到同一控制器中的不同处理程序后,modelMap会被填充。
成功执行操作方法调用后,您可能需要手动清除模型以防止操作模型数据存储在ImplicitModel中。
首先,弹簧MVC和弹簧的portlet-MVC来处理POST请求之间的区别在于,弹簧-MVC POST处理程序分派给,而在弹簧的portlet-MVC操作阶段(POST请求处理程序)直接查看始终跟随渲染阶段,由另一个处理程序处理,整个模型保留在请求中(主要是命令对象和BindingResult)... Post/Redirect/Get
该请求被分配到一个视图后不管怎样,总有过滤模型在那里......通过声明你只想或模型不想再哪些参数的机会......