请求转发和重定向的汉字乱码问题
请求转发:客户端只发送一次请求,只得到一次响应,称为服务端内跳转
重定向:客户端发送多次请求,得到多次响应,称为服务端外跳转
在Tomcat9之前,使用GET方式访问Servlet会出现传输乱码问题
解决方法:
//request默认编码为ISO8859-1,所以要以这种编码格式打散
//然后用UTF-8的编码格式组装起来
String food = new String(request.getParameter("food").getBytes("ISO8859-1"),"UTF-8");
请求转发
请求转发的时候,不管是forward还是include方法,都把request,response对象传给了下一个servlet,所以不管是在哪一个servlet中都可以通过request来获取请求参数
request.getRequestDispatcher("two.do").forward(request,response);//参数表中填写的是要转发的Servlet
重定向
重定向的时候由于每次请求不同,所以会有多个request,response对象,所以不同的servlet之间不能通过request来获取第一次请求的请求参数。由于重定向是通过改变地址栏来实现下次的访问的,是GET方式,所以,可以通过改变sendRedirect方法的参数来实现请求参数的传输,上代码。
String food = request.getParameter("food");
response.sendRedirect("two.do?food="+food);
如果就这样将food传输到TwoServlet,会发现地址栏上出现了food= ,这是因为在网络中,数据是以字节流的形式传输的,没有将字符串打散成字节流,就默认为空格。所以这里要使用到一个工具类URLEncoder里的encode方法,将字符串以它原来的格式变成可以传输的字节流
String food = new String(request.getParameter("food").getBytes("ISO8859-1"),"UTF-8");
System.out.println("择好菜了,送往后厨制作"+food);
food = URLEncoder.encode(food,"UTF-8");
然后在另一个Servlet中使用另一个工具类URLDecoder的decode方法进行与之前编码相同格式的解码(虽然不解码好像也能输出,猜测是request把它解码后又以ISO8859-1来进行了编码,所以传输过来的就是以ISO8859-1编码的数据,直接按照之前解决ISO8859-1不兼容汉字的方式打散重装就可以了)
String food = request.getParameter("food");
//按照原先编码格式进行解码
food = URLDecoder.decode(food,"UTF-8");
System.out.println(food);
//依旧需要原来的打散组装
food = new String(food.getBytes("ISO8859-1"),"UTF-8");