为了不用命令对象丰富模型,处理程序应该返回什么?丰富的ModelAndView,丰富的模型,丰富的地图...一切都通过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);
}然后,“模型”参数(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处理程序中删除了“模型模型”属性,也会发生这种情况。简单地将implicitModel参数传播到ajaxResponse视图中,而不仅仅是一个带有我在其中添加的参数的新映射
如何停止这种传播?
它与this question相关,在spring-portlet-mvc中,当基于某种条件将请求转发到处理程序,并将其传递给要在视图中呈现的某些参数时,有时需要使用它,而不是已经处理的原始CommandObject。
创建了一个JIRA ISSUE - SPR-8267,如果你有同样的问题,请投票支持。
发布于 2011-04-30 05:34:46
答案是:清除ModelMap以防止它被存储为ImplicitModel。
@RequestMapping
public String render(ModelMap modelMap, SessionStatus status, RenderRequest request, RenderResponse response) {
modelMap.clear();
...
}请注意,如果您在方法级别使用@ModelAttribute,则在您将其分派到同一控制器中的不同处理程序后,modelMap将使用它进行填充。
成功调用操作方法后,您可能希望手动清除模型,以防止操作模型数据存储在ImplicitModel中。
首先,spring-mvc和spring-portlet-mvc在处理POST请求方面的不同之处在于,spring-mvc POST处理程序直接调度查看,而在spring-portlet-mvc中,操作阶段(POST请求处理程序)总是紧跟在呈现阶段之后,呈现阶段由另一个处理程序处理,整个模型(主要是命令对象和BindingResult)保留在请求中... Post/Redirect/Get
无论如何,在请求被分派到视图之后,总是有机会过滤其中的模型……通过声明模型中只想要或不想要的参数...
https://stackoverflow.com/questions/5743223
复制相似问题