Spring MVC中redirect到一个页面,同时带些信息过去进行显示,但是不通过Session方式及URL方式

如何在Spring MVC中redirect到一个页面,同时带些信息过去进行显示,但是不通过Session方式及URL方式? 

想用跟正常的ModelAndView方式,但是用了RedirectView过去是拿不到的 ,如: 
Java代码   收藏代码
  1. new ModelAndView(new RedirectView("xxx.do"),"modelName",modelMap);   

只能用Session这种方式 
Java代码   收藏代码
  1. request.getSession().setAttribute("msg",map);  

或URL后面加信息 
Java代码   收藏代码
  1. new ModelAndView(new RedirectView("xxx.do?msg=xyz");  

然后在页面获取进行显示? 

有没有更好的方法?





in your controller: 
Java代码   收藏代码
  1. new ModelAndView(new RedirectView("xxx.do"),"modelName",modelMap);   


then DispatcherServlet render the view with your modelMap: 
Java代码   收藏代码
  1. DispatcherServlet.render(ModelAndView mv, HttpServletRequest request, HttpServletResponse response){  
  2. ...  
  3. //call view's render method  
  4. view.render(mv.getModelInternal(), request, response);  
  5. }  
  6. ...  
  7.   
  8. AbstractView.render(Map model, HttpServletRequest request, HttpServletResponse response){  
  9. ...  
  10. //the model still here...  
  11. renderMergedOutputModel(mergedModel, request, response);  
  12. }  
  13.   
  14. RedirectView.renderMergedOutputModel(Map model, HttpServletRequest request, HttpServletResponse response){  
  15. ...  
  16. //Append query properties to the redirect URL. Here, the modelMap represented by url...  
  17. appendQueryProperties(targetUrl, model, this.encodingScheme);  
  18.   
  19. //do redirect  
  20. sendRedirect(request, response, targetUrl.toString(), this.http10Compatible);  
  21. }  


没有测试过, 看了下spring mvc的source code. 
从上面的代码来看, 
Java代码   收藏代码
  1. new ModelAndView(new RedirectView("xxx.do"),"modelName",modelMap);   

是可以的... 

你应该Debug一下, 看看model在什么地方丢了...



做了个测试, 证明我上面的判断是正确的... 
而且也说明了,为什么你的方法拿不到正确的值 
Java代码   收藏代码
  1. package com.simba.test;  
  2.   
  3. import java.util.HashMap;  
  4. import java.util.Map;  
  5.   
  6. import junit.framework.TestCase;  
  7.   
  8. import org.springframework.mock.web.MockHttpServletRequest;  
  9. import org.springframework.mock.web.MockHttpServletResponse;  
  10. import org.springframework.web.servlet.ModelAndView;  
  11. import org.springframework.web.servlet.view.RedirectView;  
  12.   
  13. public class TestRedirectView extends TestCase{  
  14.       
  15.     protected MockHttpServletRequest request = new MockHttpServletRequest("GET""");  
  16.     protected MockHttpServletResponse response = new MockHttpServletResponse();  
  17.   
  18.     public void testRedirect() throws Exception{  
  19.         Map<String, String> map = new HashMap<String, String>();  
  20.         map.put("key1""value1");  
  21.         map.put("key2""value2");  
  22.           
  23.         //这种用法,map就是ModelAndView中的Model.  
  24.         ModelAndView mv = new ModelAndView(new RedirectView("/foo/bar.jsp"), map);  
  25.           
  26.         //这里用getModel()与DispatcherServlet中用getModelInternal是一样的.  
  27.         mv.getView().render(mv.getModel(), request, response);  
  28.           
  29.         assertEquals(response.getRedirectedUrl(),"/foo/bar.jsp?key1=value1&key2=value2");  
  30.     }  
  31.       
  32.     public void testWrongRedirect() throws Exception{  
  33.         Map<String, String> map = new HashMap<String, String>();  
  34.         map.put("key1""value1");  
  35.         map.put("key2""value2");  
  36.           
  37.         //这种用法,map就是ModelAndView中Model的一个key/value对了...  
  38.         ModelAndView mv = new ModelAndView(new RedirectView("/foo/bar.jsp"), "model", map);  
  39.           
  40.         //这里用getModel()与DispatcherServlet中用getModelInternal是一样的.  
  41.         mv.getView().render(mv.getModel(), request, response);  
  42.           
  43.         assertTrue(response.getRedirectedUrl().contains("/foo/bar.jsp?model="));  
  44.     }  
  45. }  




也就是无论用有modelName或无modelName的方式传递给ModelAndView,这些值是有都转化为URL进行表示了,只不过在页面上面无法通过通常的方式取得,如我用的JSTL 1.0.6标签: 
Java代码   收藏代码
  1. <c:out value='${modelName}'/>  
  2. <c:out value='${modelName.keyxxx}'/>  

或 
Java代码   收藏代码
  1. <c:out value='${keyxxx}'/>  




post and redirect 
想要在两个请求之间传递信息,除了session, url transfer之外,还有很多手段啊: 
cookie 
cache 
database 
file 
... 
就靠你权衡了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值