如何在Spring MVC中redirect到一个页面,同时带些信息过去进行显示,但是不通过Session方式及URL方式?
想用跟正常的ModelAndView方式,但是用了RedirectView过去是拿不到的 ,如:
只能用Session这种方式
或URL后面加信息
然后在页面获取进行显示?
有没有更好的方法?
想用跟正常的ModelAndView方式,但是用了RedirectView过去是拿不到的 ,如:
- new ModelAndView(new RedirectView("xxx.do"),"modelName",modelMap);
只能用Session这种方式
- request.getSession().setAttribute("msg",map);
或URL后面加信息
- new ModelAndView(new RedirectView("xxx.do?msg=xyz");
然后在页面获取进行显示?
有没有更好的方法?
in your controller:
then DispatcherServlet render the view with your modelMap:
没有测试过, 看了下spring mvc的source code.
从上面的代码来看,
是可以的...
你应该Debug一下, 看看model在什么地方丢了...
- new ModelAndView(new RedirectView("xxx.do"),"modelName",modelMap);
then DispatcherServlet render the view with your modelMap:
- DispatcherServlet.render(ModelAndView mv, HttpServletRequest request, HttpServletResponse response){
- ...
- //call view's render method
- view.render(mv.getModelInternal(), request, response);
- }
- ...
- AbstractView.render(Map model, HttpServletRequest request, HttpServletResponse response){
- ...
- //the model still here...
- renderMergedOutputModel(mergedModel, request, response);
- }
- RedirectView.renderMergedOutputModel(Map model, HttpServletRequest request, HttpServletResponse response){
- ...
- //Append query properties to the redirect URL. Here, the modelMap represented by url...
- appendQueryProperties(targetUrl, model, this.encodingScheme);
- //do redirect
- sendRedirect(request, response, targetUrl.toString(), this.http10Compatible);
- }
没有测试过, 看了下spring mvc的source code.
从上面的代码来看,
- new ModelAndView(new RedirectView("xxx.do"),"modelName",modelMap);
是可以的...
你应该Debug一下, 看看model在什么地方丢了...
做了个测试, 证明我上面的判断是正确的...
而且也说明了,为什么你的方法拿不到正确的值
而且也说明了,为什么你的方法拿不到正确的值
- package com.simba.test;
- import java.util.HashMap;
- import java.util.Map;
- import junit.framework.TestCase;
- import org.springframework.mock.web.MockHttpServletRequest;
- import org.springframework.mock.web.MockHttpServletResponse;
- import org.springframework.web.servlet.ModelAndView;
- import org.springframework.web.servlet.view.RedirectView;
- public class TestRedirectView extends TestCase{
- protected MockHttpServletRequest request = new MockHttpServletRequest("GET", "");
- protected MockHttpServletResponse response = new MockHttpServletResponse();
- public void testRedirect() throws Exception{
- Map<String, String> map = new HashMap<String, String>();
- map.put("key1", "value1");
- map.put("key2", "value2");
- //这种用法,map就是ModelAndView中的Model.
- ModelAndView mv = new ModelAndView(new RedirectView("/foo/bar.jsp"), map);
- //这里用getModel()与DispatcherServlet中用getModelInternal是一样的.
- mv.getView().render(mv.getModel(), request, response);
- assertEquals(response.getRedirectedUrl(),"/foo/bar.jsp?key1=value1&key2=value2");
- }
- public void testWrongRedirect() throws Exception{
- Map<String, String> map = new HashMap<String, String>();
- map.put("key1", "value1");
- map.put("key2", "value2");
- //这种用法,map就是ModelAndView中Model的一个key/value对了...
- ModelAndView mv = new ModelAndView(new RedirectView("/foo/bar.jsp"), "model", map);
- //这里用getModel()与DispatcherServlet中用getModelInternal是一样的.
- mv.getView().render(mv.getModel(), request, response);
- assertTrue(response.getRedirectedUrl().contains("/foo/bar.jsp?model="));
- }
- }
也就是无论用有modelName或无modelName的方式传递给ModelAndView,这些值是有都转化为URL进行表示了,只不过在页面上面无法通过通常的方式取得,如我用的JSTL 1.0.6标签:
或
- <c:out value='${modelName}'/>
- <c:out value='${modelName.keyxxx}'/>
或
- <c:out value='${keyxxx}'/>
post and redirect
想要在两个请求之间传递信息,除了session, url transfer之外,还有很多手段啊:
cookie
cache
database
file
...
就靠你权衡了
想要在两个请求之间传递信息,除了session, url transfer之外,还有很多手段啊:
cookie
cache
database
file
...
就靠你权衡了