关闭

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

标签: redirectsessionspringmvcurljava
3251人阅读 评论(0) 收藏 举报
分类:
如何在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 
... 
就靠你权衡了
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1153577次
    • 积分:11645
    • 等级:
    • 排名:第1312名
    • 原创:40篇
    • 转载:572篇
    • 译文:1篇
    • 评论:93条
    最新评论