学习jsp的时候一堆重定向和转发还有什么包含,搞的我云里雾里!
所以在这里总结一下,不正之处请指正
1.首先我们来区别一下三种方式,
①forward:是指转发,将当前request和response对象保存,交给指定的url处理。地址栏的地址不会发生改变。
②redirect:是指重定向,包含两次浏览器请求,浏览器根据url请求一个新的页面,所有的业务处理都转到下一个页面,地址栏的地址会变发生改变。说一下原理:我们发送第一个请求时,服务器发现我们的请求被重定向了就会给浏览器发送一个302和地址Location,浏览器得到状态码302就会跳到Location 指定的网址!所以相当于发送两次请求,地址栏也会发生变化!
③include:意为包含,即包含url中的内容:1.静态包含:将多个页面编译成一个servlet;2.动态包含:每个页面编译成一个servlet,运行时将所有servlet的内容组合到一起。
下面我们来说一说这三种方式在servlet和jsp中都有哪些使用方式:
转发:
servlet中:
request.getRequestDispatcher("/success.html").forward(request, response);
getServletContext().getRequestDispatcher("").forward(request, response);
getServletContext().getNamedDispatcher("").forward(request, response);
jsp标签:
<jsp:forward page=“url”>
jsp隐式对象:
pageContext.forward("");
重定向:
servlet中:
response.sendRedirect(request.getContextPath()+"/fail.html");
html(content单位秒):
<meta http-equiv=“refresh” content="300; url=target.jsp">//将给内容以内容形式发送给浏览器解析
http属性refresh:
response.setHeader(“refresh”,“300; url=target.jsp”); //300是延迟时间
http状态码:
response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY); //302状态码
response.setHeader(“Location”,"/newpath/jsa.jsp");
包含:
静态包含:
jsp指令:include指令
<%@ include file=“Header.jsp”%>
动态包含:
request和context:
request.getRequestDispatcher("/success.html").include(request, response);
getServletContext().getRequestDispatcher("").include(request, response);
getServletContext().getNamedDispatcher("").include(request, response);
jsp隐式对象:
pageContext.include("");
jsp标签:include标准动作
<jsp:include page=“Header.jsp”/>
采用JSTL
<c:import url=“http://www.sina.com/index.html”>
所以你看到这里的是不是会有一个疑问?那转发和动态包含有什么区别?
- 请求转发(A干不了给B了):由下一个Servlet完成响应体,当前Servlet可以设置响应头(这叫做:留头不留体);
- 请求包含(A和B一起干):由两个Servlet共同完成响应体(都留);
- 无论是请求转发还是请求包含,都在一个请求范围内,使用同一个Request和Response