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

Java 如何在SpringMVC中使用转发处理控制器之间的ModelMap的有效方法,java,spring,spring-mvc,model-view-controller,Java,Spring,Spring Mvc,Model View Controller,在SpringMVC3.2中,最优雅/有效的方法是什么,如何处理控制器之间的模型。为了重定向到另一个控制器,我使用forward方法,所以不需要新的请求实例,模型数据应该是可访问的(如果我没有错的话)。是否有任何方法可以捕获添加到第一个控制器中的模型 (我知道重定向属性,但可能是更好/更简单的方法) 例如: @Controller public class WebpageController{ @RequestMapping( value = { "/{code}" } )

在SpringMVC3.2中,最优雅/有效的方法是什么,如何处理控制器之间的模型。为了重定向到另一个控制器,我使用forward方法,所以不需要新的请求实例,模型数据应该是可访问的(如果我没有错的话)。是否有任何方法可以捕获添加到第一个控制器中的模型

(我知道重定向属性,但可能是更好/更简单的方法)

例如:

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

    }
@控制器
公共类网页控制器{
@请求映射(值={”/{code}})
公共字符串handleFirstLevel(@PathVariable字符串代码,ModelMap ModelMap)抛出PageNotFoundEception{
最终网页网页=获取网页(代码);
modelMap.put(WEBPAGE_MODEL_KEY,prepareModel(WEBPAGE));
返回“转发:某个url”;
}
私有地图prepareModel(网页){
映射模型=新的HashMap();
模型放置(“网页”,网页);
收益模型;
}
//其他代码
}
@控制器
公共类SpecialWebpageController{
@RequestMapping(值={“/某些url”})
公共字符串handleFirstLevel(@PathVariable字符串代码,ModelMap ModelMap)抛出PageNotFoundEception{
//需要访问先前附加的模型以添加其他数据
返回“specialViewName”;
}
}

谢谢

当您有一个只返回
字符串
的处理程序方法时,
字符串
被视为视图名称。使用前缀
forward
,Spring将获得指定路径的
RequestDispatcher
,并转发到该路径。该过程的一部分将包括从为该请求处理周期创建的
模型和视图中获取
模型
,并将其所有属性放入
HttpServletRequest
属性中

Servlet容器将把
RequestDispatcher向前(..)
并再次使用
DispatcherServlet
来处理它。您的
DispatcherServlet
将为此处理周期创建一个新的
模型和视图
,其中包含一个新的
模型
。因此,此
模型
不包含以前的任何属性,但是
HttpServletRequest
属性包含这些属性

就你而言,这个

modelMap.put(WEBPAGE_MODEL_KEY, prepareModel(webpage));
最终会被判入狱

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

如果处理程序方法只返回一个
字符串
,则该
字符串
将被视为视图名称。使用前缀
forward
,Spring将获得指定路径的
RequestDispatcher
,并转发到该路径。该过程的一部分将包括从为该请求处理周期创建的
模型和视图中获取
模型
,并将其所有属性放入
HttpServletRequest
属性中

Servlet容器将把
RequestDispatcher向前(..)
并再次使用
DispatcherServlet
来处理它。您的
DispatcherServlet
将为此处理周期创建一个新的
模型和视图
,其中包含一个新的
模型
。因此,此
模型
不包含以前的任何属性,但是
HttpServletRequest
属性包含这些属性

就你而言,这个

modelMap.put(WEBPAGE_MODEL_KEY, prepareModel(webpage));
最终会被判入狱

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

转发:
内部资源视图
转发到容器,因此我不确定转发到控制器是什么意思。
转发:
内部资源视图
转发到容器,所以我不确定转发到控制器是什么意思。