上来先提一个问题,室友在阿里的电话面试中遇到这样一个问题:说一下内部转发与外部转发?
当时就懵逼了~~~~
我想的是内部转发是不是就是指服务器内部跳转(也就是请求转发),而外部转发是不是客户端跳转(也就是重定向呢)!?
客户端跳转(重定向)与服务器端跳转(请求转发):
1、客户端跳转(重定向(sendRedirect))
客户发送一个请求到服务器,服务器匹配servlet,处理演示如下:
public void doGet(HttpServletRequest req, HttpRequestResponse resp){
req.getSession().setAttribute("sessionInfo","sy1"); //设置session属性
req.setAttribute("requestInfo","sy2") //设置request属性
resp.sendRedirect("getInfo.jsp"); //客户端跳转
}
客户端发送一个请求给服务器端资源servlet,当这个servlet处理完之后,当看到看到resp.senRedirect()方法时,
这个时候服务器资源会先给客户端一个响应,客户端再根据这个响应当中所包含的地址("getInfo.jsp"),
再次向服务器端发送一个请求,也就是说客户端跳转是两次请求,两次响应。这里两个请求互不干扰,相互独立。
客户端跳转后的地址栏是会改变的。但是现在只能接受session域属性的内容,而request域属性的内容无法接收到。
2、服务器端跳转(请求转发(RequestDispatcher#forward()))
客户发送一个请求到服务器,服务器匹配servlet,处理演示如下:
public void doGet(HttpServletRequest req, HttpRequestResponse resp){
req.getSession().setAttribute("sessionInfo","sy1"); //设置session属性
req.setAttribute("requestInfo","sy2") //设置request属性
//实例化RequestDispatcher对象,同时指定跳转路径
RequestDispatcher rd = req.getRequestDispatcher("getInfo.jsp");
rd.forward("getInfo.jsp"); //服务器跳转
}
客户首先发送一个请求到服务器端,服务器端发现匹配的servlet,并指定它去执行,当这个servlet执行完之后,
它要调用getRequestDispacther()方法,把请求转发给指定的getInfo.jsp,整个流程都是在服务器端完成的,
而且是在同一个请求里面完成的,因此servlet和jsp共享的是同一个request,在servlet里面放的所有东西,
在jsp中都能取出来,因此,jsp能把结果getAttribute()出来,getAttribute()出来后执行完把结果返回给客户端。
整个过程是一个请求,一个响应。
服务器跳转后,页面的路径不会发生改变,而且此时可以在跳转后的JSP文件中接收到session及request范围的属性