request.setAttribute("flag1","哈哈1");
request.getSession().setAttribute("flag3", "測試");
1. response.sendRedirect("/qq/success.jsp");
PS:如果工程不是在ROOT根目錄下,不要忘記加上你的工程名
success.jsp :
<% String sessio = (String)request.getSession().getAttribute("session"); String flag1 = (String)request.getAttribute("flag1"); String flag2 = request.getParameter("flag2"); %> SESSION : <%=sessio %>。 FLAG1 : <%=flag1 %>。
輸出:SESSION : 測試。 FLAG1 : null。 顯然getAttribute拿不到flag的值,但是Session中flag值能夠拿到
2. response.sendRedirect("/qq/success.jsp?flag2=測試");
PS:sendRedirect可帶參數在JSP前台頁面上接收應是request.getParameter("flag");但是顯示出來的是亂碼。
解決辦法:response.sendRedirect("/qq/success.jsp?flag2="+URLEncoder.encode("哈哈", "UTF-8")); 然后在jsp頁面里接收到flag后在此進行URLEncode轉碼
這里我又遇到一個問題就是在success.jsp頁面接收flag的值時顯示是亂碼,但是瀏覽器url里flag參數是中文的。
於是我便再次對頁面上的flag2參數進行轉碼。。。(蛋疼!)
String str = new String(flag2.getBytes("ISO-8859-1"),"UTF-8"); 前者是指定按照哪種編碼去讀取參數,然后再進行UTF-8編碼轉換(我是一個個試出來的,相當糾結)
3. request.getRequestDispather(“/success.jsp”).forward(req,resp);-也可帶參數,並且不需要URL轉碼,在頁面沒有中文亂碼。
SESSION : 測試 FLAG1 : 哈哈1 FLAG2 : 哈哈2
建議使用編碼過濾器,也就沒有這么多的編碼問題,具體可用jar包提供的過濾器,也可以自己寫個過濾器,也就是在doFilter方法里面分別寫上 請求和響應傳遞數據時用什么編碼
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
總結:
1. response中sendRedirect客戶端跳轉也就是request、response對象不共用,最終導致request對象set的值在頁面里拿不到
2. encodeURL()是本應用級別的,encodeRedirectURL()是跨應用的。 都是對URL進行encode。但是在Servlet中調用不會使頁面跳轉,如果連續兩次調用encodeURL服務器會報java.lang.IllegalArgumentException異常。
3. 就以上說的頁面跳轉,如果在Session中設置了值,都可以在頁面上拿到對應屬性的值。