客户端跳转(重定向)与服务器端跳转(请求转发)

上来先提一个问题,室友在阿里的电话面试中遇到这样一个问题:说一下内部转发与外部转发

当时就懵逼了~~~~

我想的是内部转发是不是就是指服务器内部跳转(也就是请求转发),而外部转发是不是客户端跳转(也就是重定向呢)!?

客户端跳转(重定向)与服务器端跳转(请求转发):

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范围的属性



你可能感兴趣的:(servlet,redirectforword)