Servlet跳转

一、客户端跳转

  1. 在Servlet中如果要进行客户端跳转,直接使用HttpServletResponse接口的sendRedirect()方法即可,单需要注意的是,此跳转只能传递Session范围的属性,而无法传递request范围的属性。
package taeyeon.com.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/client/attribute")
//客户端跳转设置值
public class ClientSkip extends HttpServlet {
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                HttpSession session=req.getSession();
                session.setAttribute("name","Taeyeon");
                req.setAttribute("name","Yoona");
                resp.sendRedirect("/client/getattribute");
        }
}


package taeyeon.com.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/client/getattribute")
public class GetClientSkipAttribute extends HttpServlet {
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                HttpSession session=req.getSession();
                System.out.println( "request------>"+req.getAttribute("name"));
                System.out.println("session------>"+session.getAttribute("name"));
        }
}

输出

request------>null
session------>Taeyeon
String site = "http://www.runoob.com" ;
response.setStatus(response.SC_MOVED_TEMPORARILY);
response.setHeader("Location", site);
  1. 从以上程序中可以看出来,由于客户端跳转,所以跳转后地址栏会发生改变,但是现在只能接收session对象的属性范围的值,而request范围的值无法接收到,这是因为request属性范围只有在服务器跳转中才能使用;而且使用该方法,是我们向客户端发送新的位置,不需要经过服务器,也没有发生请求,所以在这种跳转中session会起作用但是request不会。

二、服务器跳转

  1. 在Servlet中没有像jsp中的jsp:forward指令,所以想要执行服务器端的跳转,就必须依靠RequestDispather接口完成,常用方法有:No|方法|描述---|---|---1|forward(HttpServletRequest request,HttpServletResponse response)|把请求转发到服务器上的另一个资源(Servlet、JSP、HTML)2|include(HttpServletRequest request,HttpServletReponse response)|把服务器上的另一个资源(Servlet、JSP、HTML)包含到响应中。
  2. 使用RequestDispather接口的forword()f方法即可完成页面的跳转,但是如果想要使用此接口还得使用ServletRequest接口提供的方法进行实例化。
public RequestDispather getRequestDispather(String path);

服务器跳转后,页面的路径不会发生变化,而且此时可以在跳转后的页面中收到session和request范围的属性

使用PageContext接口也可以实现服务器跳转
  1. 创建PageContext对象
PageContext context = JspFactory.getDefaultFactory().getPageContext(this, request, response, null, true, 8*1024, true);
  • 第一个参数是传递一个Servlet,在servlet中传递this就可以了;
  • 第二个和第三个参数是request与response传递本servlet的请求和响应;
  • 第四个参数是发生错误后的url路径地址,如果没有可以键入null;
  • 第五个参数是是否需要session,这里可以写入true;
  • 第六个参数是缓存大小,我们用了8*1024;
  • 第七个参数是是否需要刷新,键入ture;
  1. 使用该实例调用forward()方法
context.forward(String path);

三、请求转发与重定向的区别

  1. 转发是在服务器端完成的,重定向是在客户端发生的;
  2. 转发的速度快,重定向速度慢;
  3. 转发是同一次请求,重定向是两次请求;
  4. 转发地址栏没有变化,重定向地址栏有变化;
  5. 转发必须是在同一台服务器下完成,重定向可以在不同的服务器下完成。
  6. RequestDispatcher是通过调用HttpServletRequest对象的getRequestDispatcher()方法得到的,是属于请求对象的方法,在请求时就已经实现页面跳转了,所以request和session域的属性都存在。sendRedirect()是HttpServletResponse对象的方法,即响应对象的方法,既然调用了响应对象的方法,那就表明整个请求过程已经结束了,服务器开始向客户端返回执行的结果,所以再次获取request域的值就会不存在。
11-26 20:37