Response对象--响应重定向
需求:用户访问AServlet后,服务器告诉浏览器重定向到BServle(BServlet可以是外网地址)
代码:AServlet
package com.lagou; /** * 需求2:实现重定向的访问,即用户访问AServlet后,服务器告诉浏览器重定向到BServlet */ import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class AServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req,resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //设置浏览器和服务器的编码方式 resp.setContentType("text/html;charset=utf-8"); //需求:实现重定向的访问,即用户访问AServlet后,服务器告诉浏览器重定向到BServlet //1.设置状态马:将状态码设置为302,表示重定向 resp.setStatus(302); //2.设置响应头,即将重定向的地址设置在响应头中
resp.setHeader("Location","/bServlet") //重定向到BServlet resp.setHeader("Location","http://fanyi.youdao.com/"); //重定向到外网地址 } }
总结:
1. 地址栏会发生改变
2. 重定向是二次请求
3. 重定向是客户端(浏览器)行为,可以跳转到服务器外部资源...
4. 不能使用request域共享数据
PS:请求转发和请求重定向的区别
1. 哪个对象
转发(request对象的方法)
request.getRequestDispatcher("/bServlet").forward(request,response);
重定向(response对象的方法)
response.sendRedirect("/day10_response/bServlet");
2. 几次请求
转发
地址栏: 没有改变
浏览器: 发了一次请求
服务器: 只有一对请求和响应对象
发生的位置: 服务器
重定向
地址栏: 发生了改变
浏览器: 发了两次请求
服务器: 有两对请求和响应对象
发生的位置: 浏览器
3. 小结
写法
转发("/servlet资源路径") 服务器内部行为
重定向 ("/虚拟路径(项目名)/servlet资源路径") 浏览器外部行为
使用场景(重点掌握)
如果需要传递数据(request域),使用转发
如果不需要传递数据(request域),使用重定向
解决中文乱码问题:
1. 指定服务器响应编码方式 response.setCharacterEncoding("GBK"); 2. 统一浏览器和服务器编码 response.setContentType("text/html;charset=utf-8");