请求转发
请求转发,是一种服务器的行为,当客户端请求到达后,服务器进行转发,此时会将请求对象进行保存,地址栏中的URL 地址不会改变,得到响应后,服务器端再将响应发送给客户端,从始至终只有一个请求发出。实现方式如下,达到多个资源协同响应的效果。
req.getRequestDispatcher("转发的路径").forward(req,resp);
public class AServlet01 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("llf被请去吃s");
String money = request.getParameter("money");
System.out.println("llf请求转发给了ld");
request.getRequestDispatcher("BS").forward(request, response);
}
}
public class BServlet02 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
System.out.println("ld被请求去吃s");
String money = request.getParameter("money");
if(money == null || "".equals(money)){
response.getWriter().write("不给钱,就想要我l某人吃s");
return;
}
System.out.println("拿到" + money + "毛钱并吃了s");
PrintWriter out = response.getWriter();
out.write("我l某人爱吃s");
out.close();
}
}
重定向跳转
重定向是一种服务器指导客户端的行为。客户端发出第一个请求,被服务器接收,经过处理服务器进行响应,与此同时,服务器给客户端一个地址(下次请求的地址 resp.sendRedirect("url");),当客户端接收到响应后,立刻、马上、自动根据服务器给的地址进行第二个请求的发送,服务器接收请求并作出响应,重定向完成。从描述中可以看出重定向当中有两个请求存在,并且属于客户端行为。
resp.sendRedirect("index.html")
public class AServlet01 extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("张家辉被请求去买水");
String money = request.getParameter("money");
request.setAttribute("小费", "0.1");
System.out.println("张家辉重定向给了万鲲");
response.sendRedirect("s02");
}
}
public class BServlet02 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
System.out.println("万鲲被请求买水");
String smallmoney = (String)request.getAttribute("小费");
System.out.println("得到小费" + smallmoney);
String money = request.getParameter("money");
if(money == null || "".equals(money)){
response.getWriter().write("不给钱,滚蛋");
return;
}
System.out.println("拿到" + money + "毛去买水");
PrintWriter out = response.getWriter();
out.write("这是一瓶超级好喝的自来水!");
out.close();
}
}
两者区别
请求转发(req.getRequestDispatcher().forward()) | 重定向(resp.sendRedirect()) |
---|
一次请求,数据在 request 域中共享 | 两次请求,request 域中数据不共享 |
服务器端行为 | 客户端行为 |
地址栏不发生变化 | 地址栏发生变化 |
绝对地址定位到站点后 | 绝对地址可写到 http:// |