1、 请求转发(forward)
将A 中存储的值传到B里面去
//A页面
package com.gk.servlet;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "AServlet", urlPatterns = "/A")
public class AServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=UTF-8");
//使用setAttribute方法设置一个键值对,转发到B
request.setAttribute("name","张三和李四");
PrintWriter out = response.getWriter();
out.println("11111111111111111111");
request.getRequestDispatcher("B").forward(request,response);
}
}
//B页面
package com.gk.servlet;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "BServlet", urlPatterns = "/B")
public class BServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//接收传过来的name值
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=UTF-8");
String name = (String)request.getAttribute("name");
PrintWriter out = response.getWriter();
out.println("222222222222222222222222222");
//将name所对应的值传到前端
out.println(name);
out.flush();
out.close();
}
}
运行结果:
可以看出,请求转发中
1、页面的url并不会改变
2、A中的值并不会显示到页面,显示的是B中的值
3、完成了数据共享
原理:
2、请求包含(include)
将A 中存储的值传到B里面去(forward改成include)
代码:
//A页面
package com.gk.servlet;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "AServlet", urlPatterns = "/A")
public class AServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=UTF-8");
//使用setAttribute方法设置一个键值对,转发到B
request.setAttribute("name","张三和李四");
PrintWriter out = response.getWriter();
out.println("11111111111111111111");
request.getRequestDispatcher("B").include(request,response);
}
}
//B页面
package com.gk.servlet;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "BServlet", urlPatterns = "/B")
public class BServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//接收传过来的name值
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=UTF-8");
String name = (String)request.getAttribute("name");
PrintWriter out = response.getWriter();
out.println("222222222222222222222222222");
//将name所对应的值传到前端
out.println(name);
out.flush();
out.close();
}
}
结果:
可以看出,在请求包含中:
1、页面的url不变
2、A页面的数据会被显示出来
3、数据达到了共享(A、B里面的的逻辑都能执行)
原理:
3、重定向(sendRedirect)
代码:
//A页面
package com.gk.servlet;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "AServlet", urlPatterns = "/A")
public class AServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=UTF-8");
//使用setAttribute方法设置一个键值对,转发到B
request.setAttribute("name","张三和李四");
PrintWriter out = response.getWriter();
out.println("11111111111111111111");
response.sendRedirect("B");
}
}
//B页面
package com.gk.servlet;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "BServlet", urlPatterns = "/B")
public class BServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//接收传过来的name值
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=UTF-8");
String name = (String)request.getAttribute("name");
PrintWriter out = response.getWriter();
out.println("222222222222222222222222222");
//将name所对应的值传到前端
out.println(name);
out.flush();
out.close();
}
}
由此可得,重定向(sendRedirect):
1、url改变了
2、数据没有发生共享
3、发生了两次请求,两次回应
原理:
总结:
1、请求转发 req.getResquestDispatcher("请求的路径(如B)").forward(req,resp);
URL重定向 resp.sendRedirect("重定向的地址(如B)");
2、请求转发和重定向的原理
请求转发是servlet内部调用
重定向是两次请求和响应
3、请求转发和重定向的区别:
· 请求转发是一次请求 重定向是两次请求
· 请求转发地址栏不会发生改变 重定向地址栏会发生改变
· 请求转发可以共享请求参数 重定向之后就获取不了共享参数了
· 请求转发不能跨域(不能访问其他服务器连接) 重定向可以跳转外部连接
· 请求转发能转到WEB-INF目录下的文件
而重定向不能(WEB-INF目录:不能被外部通过地址直接访问)