请求转发:forward(); 重定向:sendRedirect()
来看具体实例:
在HTML页面写两个a链接请求,这个就是get请求了,然后建立与请求对应的servlet,页面代码如下所示:
1 <!DOCTYPE html>
2 <html>
3 <head>
4 <meta charset="UTF-8">
5 <title>请求转发实例</title>
6 </head>
7 <body>
8 <h2 style="text-align: center;">Forward测试页面</h2>
9 <a href="fowardServlet">foward请求</a>
10 <br/></br/>
11 <a href="sendServlet">send重定向</a>
12 </body>
13 </html>
然后建立 请求转发ForWardServlet,并且在web.xml中配置,这个就不说了
1 package com.servlet;
2
3 import java.io.IOException;
4
5 import javax.servlet.RequestDispatcher;
6 import javax.servlet.ServletException;
7 import javax.servlet.http.HttpServlet;
8 import javax.servlet.http.HttpServletRequest;
9 import javax.servlet.http.HttpServletResponse;
10
11 public class ForwardServlet extends HttpServlet {
12 private static final long serialVersionUID = 1L;
13
14 protected void doGet(HttpServletRequest request, HttpServletResponse response)
15 throws ServletException, IOException {
16 request.setAttribute("forward_name", "abcde");
17 System.out.println("请求转发获取的属性:" + request.getAttribute("forward_name"));
18 System.out.println("ForwardServlet 的 doGet()方法");
19 // 转发请求
20 String path = "testServlet";
21 RequestDispatcher requestDispatcher = request.getRequestDispatcher("/" + path);
22 requestDispatcher.forward(request, response);
23 }
24
25 }
再建立 请求重定向SendServlet,并且在web.xml中配置,这个也就不说了
1 package com.servlet;
2
3 import java.io.IOException;
4
5 import javax.servlet.ServletException;
6 import javax.servlet.annotation.WebServlet;
7 import javax.servlet.http.HttpServlet;
8 import javax.servlet.http.HttpServletRequest;
9 import javax.servlet.http.HttpServletResponse;
10
11 @WebServlet(name = "sendServlet", urlPatterns = "/sendServlet")
12 public class SendServlet extends HttpServlet {
13 private static final long serialVersionUID = 1L;
14
15 protected void doGet(HttpServletRequest request, HttpServletResponse response)
16 throws ServletException, IOException {
17 request.setAttribute("send_name", "abcde");
18 System.out.println("重定向获取的属性:" + request.getAttribute("send_name"));
19 System.out.println("SendServlet 的doGet 方法");
20 String path = "testServlet";
21 response.sendRedirect(path);
22
23 }
24
25 }
然后建立path中所提到的 TestServlet
1 package com.servlet;
2
3 import java.io.IOException;
4
5 import javax.servlet.ServletException;
6 import javax.servlet.annotation.WebServlet;
7 import javax.servlet.http.HttpServlet;
8 import javax.servlet.http.HttpServletRequest;
9 import javax.servlet.http.HttpServletResponse;
10
11 @WebServlet("/testServlet")
12 public class TestServlet extends HttpServlet {
13 private static final long serialVersionUID = 1L;
14
15 protected void doGet(HttpServletRequest request, HttpServletResponse response)
16 throws ServletException, IOException {
17 // TODO Auto-generated method stub
18 System.out.println("TestServlet 的 doGet 方法");
19
20 System.out.println("测试请求转发获取的属性:" + request.getAttribute("forward_name"));
21
22 System.out.println("测试重定向获取的属性:" + request.getAttribute("send_name"));
23 }
24
25 }
好了,接下来就是看请求转发和重定向的主要区别:
(1) 请求转发forward 只有一次请求,而重定向是两次请求:
(2)请求转发:在最终的 servlet (TestServlet) 中,request和中转的那个servlet(ForwardServlet)中的request对象是同一个对象
重定向:在最终的 servlet (TestServlet) 中,request和中转的那个servlet(SendServlet)中的request对象不是同一个对象
(3)请求转发:地址栏中的url是初次发起请求的地址
重定向:地址栏中的url是最终响应的的那个地址
(3)请求转发:仅限于当前web应用内,"/"代表当前web应用的根目录
请求重定向:可以定向到任何资源,"/"代表当前web站点的根目录