使用 <jsp:forward page="..."/> 进行页面重定向之后,request中的Attribute 的值会跟着转移,这给后台操作与显示分离带来好处。
但是转移之后的IE的地址栏上面的url并不会变成目标页面,还是转移之前的url,这个后面的操作带来很多不便。请问有什么方法,既能带着request中的Attribute 的值进行重定向,又能改变url么?

解决方案 »

  1.   

    不用标签,在 jsp 中写java代码:response.sendRedirect("new_page.jsp");
      

  2.   

    实现机制决定的我认为不能你可以看看servlet
      

  3.   

    这个不能带request中的Attribute值。
      

  4.   

    你可以重定向的时候把参数传递过去通过url传参
    ?a=1&b=2
      

  5.   

    既然要重新定向,就是两个request,你只能将attribute放在session中了
      

  6.   

    如果这样的话就只有把值放进session里面了
      

  7.   

    一般是把要传到下个页面的数据放到session里  再转向
    session.setAttribute("data",data);
    response.sendRedirect("new_page.jsp");
      

  8.   

    有时候想把一个集合比如map类型的传到下一个页面去显示。
    参数就搞不定了巴。
      

  9.   

    如果放到session中,该变量会一直存在巴,用完了还有加个session.removeAttribute() 
    感觉很麻烦而且不知道会否把session越充越大。
      

  10.   

    放session里面会占用服务器资源,会越来越大,直到session销毁为止一起销毁
    通过url传递问题是有长度限制
    你说的map其实也是可以传递的不过又麻烦有难看,
    不过一般需求放session里面没事,看会不会有很多。
    看可以通过写一个通用的jsp页面做跳转。把要传的东西传到这个页面的form里面然后用js提交这个页面
    csdn的发贴就是这样的,这样避免了刷新页面重复发贴的问题
      

  11.   

    能给讲下具体怎么做的么?我有2点看不明白。
    1.怎么把要传的东西传到这个页面的form里面?每次要传的类型都可能不一样,比如一个map怎么传到form里。
    2.form的action="" 是固定的巴,每次要转的页面不同。难道js可以改form的action?(也许可以巴不清楚) 
      

  12.   

    顶一下,呼唤sunyujia给讲讲。
    谁还有别的办法么?
      

  13.   

    我目前想到的是forward时把 要传的变量放到request中,forward到一个带form的jsp,
    ${dest}是要转到的目标页面。<form name="form1" action="${dest}" ....>
       <input type=hidden name="key1" value="${value1}"/>
       <input type=hidden name="key2" value="${value2}"/>
       ......
    </form><script language=javascript>
      form1.submit();
    </script>可是这样每次的key 、value 都不一样,也就是无法用一个统一的jsp做这件事。
    请问sunyujia你讲的是这个意思么?怎么用一个通用jsp做这个?谢谢!
      

  14.   

    发表于:2008-10-06 02:21:33
    发表于:2008-10-06 17:32:46
    你解决了action的问题
    可见你一直在努力的,如果在努力些就可以搞定了,所以我只给你个提示
    以便你继续靠自己解决问题
    经过多次这样的磨练以后就不会常在csdn提问了
    因为靠别人是不可靠的,没有了依赖我猜你可以在
    2008-10-06 12:32:46时发14楼的帖子提示1:request.getAttributeNames()
    提示2:map的解决见提示1需要些编程上的小技巧,是可以解决的,你的路线也是对的。
      

  15.   

    我可以把变量传过去了,但还是有几个疑问请教sunyujia(再加50分)
    1.由于form只能传字符串,对List 、Map 等类型会自动转成
      [111, 222]
      {key2=value2, key1=value1}
    这样形式的字符串,传过去之后,我考虑单写个bean把它们还原回List 、Map。不过好麻烦啊,你们怎么做的?2.我还是觉得这种方法太麻烦了,如果还是用session 传变量,每次传完了都删除该变量,会不会对性能有大影响呢?
       方法如下,
       在后台处理中: session.setAttribute("key","value");
       在显示页面中: <%=session.getAttribute("key");
                       session.removeAttribute("key");%>
      这种方式是否可取呢?谢谢!如下是按你提示写的代码<form name="form1" method="post" action="${dest}">
     <%Enumeration e = request.getAttributeNames();
       for (;e.hasMoreElements();){ 
       Object key = e.nextElement();
       %>
       <input type="hidden" name=<%=key.toString() %> value="<%=request.getAttribute((String)key)%>" />
     <%}
      %>
     
     </form>
     <script language="javascript" >
        
        document.form1.submit();
     </script>
      

  16.   

    1.问题的复杂度不在list和map上面而是在list或者是map里面放了什么东西,如果放的不是普通对象的话很多情况可以说无法处理,但是这不是绝对的
    BT解决方案:
    将对象序列化成xml文件使用xstream非常简单http://xstream.codehaus.org/
    然后将xml字符串提交后在服务端反序列化
    不过这真是太糟糕的写法了,序列化和反序列化也是非常耗cpu的,问题由session的内存占用上转移到了cpu占用上面了。比较好的解决方案是使用cookie 让客户端分担服务器压力,让js对象序列化(json)可以选择cookie存储。2.基本没什么影响,建议使用session。具体问题要根据用户访问量,访问方式,服务器情况具体问题具体分析,我能想到的就是这些。
    我平时使用session
    但上面的说法都是具有可行性的
    虽然问题绕了一大圈回到了session但是你的代码没有白写,很多情况下先跳转到一个通用的jsp然后再二次跳转这是个非常有用的手段,能避免重复提交。 最著名的例子我已经举了,csdn论坛。你的代码没什么问题,但是还可以优化,比如数组应该也能处理才好,这个很常用,例如 记录哪些checkbox被checked了,又不想放到session里面的时候可以用你写的jsp传递提交。
    多个同名的input在后台取得的时候可以当成数组,利用xx instanceof Object[]可以判断一个对象是否是一个数组。写的有点乱,哪写错了你跳过去就好了。最后的建议:
    非基础类型或复杂的数据使用session
    简单的例如String,数组,int什么的使用你写的小jsp
    话外题
    善用cookie和javascript以及序列化与反序列化