分享

Spring MVC中redirect到一个页面,同时带些信息过去进行显示,但是不通过Se...

 软件团队头目 2007-12-09

关键字: Spring   Spring MVC redirect Session URL    

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

想用跟正常的ModelAndView方式,但是用了RedirectView过去是拿不到的 ,如:

代码
  1. new ModelAndView(new RedirectView("xxx.do"),"modelName",modelMap);    

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

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

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

 

有没有更好的方法?

11:45  |   永久链接  |   浏览 (4601)  |   评论  (9)  | Java   |   进入论坛  | 
评论    共 9 条
sorphi    2006-09-20 13:08

cookie?

galaxystar    2006-09-20 13:08

内部重新定向!用过滤器或者AOP,把当前的request覆盖掉要转向的controller里的request,然后执行那个controller,渲染页面!
那个页面就可以用你上一个controller里处理好的数据项了!(contriller里处理的atribute不能重名,否则就覆盖掉了)

或者适当改造spring mvc框架!

simbasun    2006-09-20 13:21

in your controller:

代码
  1. new ModelAndView(new RedirectView("xxx.do"),"modelName",modelMap);    

 

then DispatcherServlet render the view with your modelMap:

代码
  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.
从上面的代码来看,

代码
  1. new ModelAndView(new RedirectView("xxx.do"),"modelName",modelMap);    

是可以的...

 

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

simbasun    2006-09-20 14:15

做了个测试, 证明我上面的判断是正确的...
而且也说明了,为什么你的方法拿不到正确的值

代码
  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. }   
  46.   

 

YuLimin    2006-09-20 14:52

也就是无论用有modelName或无modelName的方式传递给ModelAndView,这些值是有都转化为URL进行表示了,只不过在页面上面无法通过通常的方式取得,如我用的JSTL 1.0.6标签:

代码
  1. <c:out value='${modelName}'/>   
  2. <c:out value='${modelName.keyxxx}'/>   


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

 

simbasun    2006-09-20 15:01

看到你的view才明白,你原来是想做这个...:)
这种情况下,你不应该用redirect.
而应该直接用 new ModelAndView("viewName",Model);

为什么一定要用redirect呢?

YuLimin    2006-09-20 16:09

区别在于F5不会现这个吧。

sorphi    2006-09-20 16:19

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

galaxystar    2006-09-20 16:51

表单重复提交的问题,不能直接用model来传了!只能用其他办法!
html的问题,没办法!

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多