最优雅/最有效的方法是什么,如何在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";
}
}
谢谢
答案 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);