Java EE基础-response和request页面跳转问题
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中设置了值,都可以在页面上拿到对应属性的值。