gpt4 book ai didi

java - 请求转发后如何停止将 Portlet ImplicitModel 传播到下一个处理程序?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:17:02 25 4
gpt4 key购买 nike

对于不使用命令对象丰富的模型,处理程序应该返回什么?ModelAndView - 丰富,Model - 丰富,Map - 丰富......一切都通过 ImplicitModel 得到丰富。我能否以某种方式停止隐式模型向 ajaxResponse View 的传播?

@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);
}

由于 Spring 的 AnnotationMethodHandlerAdapter 中的这种情况,“模型”参数 (implicitModel) 的参数将继续到下一个处理程序。

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 View 中,而不仅仅是带有我在其中添加的参数的新 Map

如何阻止这种传播?

它涉及this question ,在 spring-portlet-mvc 中,当请求根据某些条件转发给处理程序并将其传递给要在 View 中呈现的一些参数时,有时需要这样做,但不是已经处理过的原始 CommandObject。

创建了一个 JIRA ISSUE - SPR-8267 , 如果您有同样的问题,请投票。

最佳答案

答案是:清除 ModelMap 以防止将其存储为 ImplicitModel。

@RequestMapping
public String render(ModelMap modelMap, SessionStatus status, RenderRequest request, RenderResponse response) {
modelMap.clear();
...
}

请注意,如果您在方法级别使用 @ModelAttribute,则在您分派(dispatch)到同一 Controller 中的不同处理程序后,modelMap 会填充它。

成功调用 Action 方法后,您可能希望手动清除模型以防止 Action 模型数据存储在 ImplicitModel 中。

首先,spring-mvc 和 spring-portlet-mvc 在处理 POST 请求方面的区别是 spring-mvc POST 处理程序直接分派(dispatch)给 VIEW,而在 spring-portlet-mvc 中是 Action 阶段(POST 请求处理程序)总是跟在由另一个处理程序处理的呈现阶段之后,整个模型保留在请求中(主要是命令对象和 BindingResult)... Post/Redirect/Get

无论如何,在将请求分派(dispatch)到 VIEW 之后,总是有机会在其中过滤模型...通过声明模型中您只需要或不需要的参数...

关于java - 请求转发后如何停止将 Portlet ImplicitModel 传播到下一个处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5743223/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com