如何在Spring MVC中使用转发在控制器之间处理ModelMap的有效方法

时间:2014-04-09 19:57:42

标签: java spring spring-mvc model-view-controller

最优雅/最有效的方法是什么,如何在Spring MVC 3.2中处理控制器之间的模型。为了重定向到另一个Controller,我使用forward方法,因此没有必要的新请求实例和模型数据应该是可访问的(如果我没有错)。有没有办法如何捕获模型,这是在第一个控制器中添加的?

(我知道RedirectAttributes,但可能是更好/更简单的方法)

示例:

@Controller
public class WebpageController{

        @RequestMapping( value = { "/{code}" } )
        public String handleFirstLevel(@PathVariable String code, ModelMap modelMap) throws PageNotFoundEception{
            final Webpage webpage = getWebpage(code);
            modelMap.put(WEBPAGE_MODEL_KEY, prepareModel(webpage));

            return "forward:some-url";
        }

        private Map<String, Object> prepareModel(Webpage webpage){
            Map<String, Object> model = new HashMap<String, Object>();
            model.put("webpage", webpage);
            return model;
        }

        // some other code
    }

    @Controller
    public class SpecialWebpageController{

        @RequestMapping( value = { "/some-url" } )
        public String handleFirstLevel(@PathVariable String code, ModelMap modelMap) throws PageNotFoundEception{
            // need access to previously appended model to add some other data
            return "specialViewName";
        }

    }

谢谢

1 个答案:

答案 0 :(得分:4)

如果您的处理程序方法只返回String,则String被视为视图名称。使用前缀forward,Spring将为指定路径获取RequestDispatcher并转发给它。该流程的一部分将包括从为该请求处理周期创建的Model中获取ModelAndView并将其所有属性放入HttpServletRequest属性。

Servlet容器将使用RequestDispatcher#forward(..)并再次使用您的DispatcherServlet来处理它。对于此处理周期,您的DispatcherServlet将为新ModelAndView创建 Model。因此,此Model不包含之前的任何属性,但HttpServletRequest属性包含。

在你的情况下,这个

modelMap.put(WEBPAGE_MODEL_KEY, prepareModel(webpage));

将最终进入

HttpServletRequest request = ...;
request.getAttribute(WEBPAGE_MODEL_KEY);