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中设置了值,都可以在页面上拿到对应属性的值。

原文地址:https://www.cnblogs.com/xmaomao/p/2995604.html