首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在请求转发之后,如何停止Portlet ImplicitModel到下一个处理程序的传播?

在请求转发之后,如何停止Portlet ImplicitModel到下一个处理程序的传播?
EN

Stack Overflow用户
提问于 2011-04-21 19:04:40
回答 1查看 1K关注 0票数 3

为了不用命令对象丰富模型,处理程序应该返回什么?丰富的ModelAndView,丰富的模型,丰富的地图...一切都通过ImplicitModel得到了丰富。我能以某种方式停止隐式模型到ajaxResponse视图的传播吗?

代码语言:javascript
复制
@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中存在这个条件。

代码语言:javascript
复制
if (returnValue instanceof ModelAndView) {
    ModelAndView mav = (ModelAndView) returnValue;
    mav.getModelMap().mergeAttributes(implicitModel);
    return mav;
}

View类如下所示:

代码语言:javascript
复制
    @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,如果你有同样的问题,请投票支持。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-04-30 05:34:46

答案是:清除ModelMap以防止它被存储为ImplicitModel。

代码语言:javascript
复制
@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

无论如何,在请求被分派到视图之后,总是有机会过滤其中的模型……通过声明模型中只想要或不想要的参数...

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5743223

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档