qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請訪問 http://qaseven.github.io/

          深入淺出Java 重定向和請求轉(zhuǎn)發(fā)的區(qū)別

          <span style="font-family:FangSong_GB2312;font-size:18px;">import java.text.*;
          import java.util.*;
          import java.io.*;
          import javax.servlet.http.*;
          import javax.servlet.*;
          import com.bjpowernode.exam.model.*;
          import com.bjpowernode.exam.manager.*;
          public class SearchStudentServlet extends HttpServlet {
          public void doGet(HttpServletRequest request, HttpServletResponse response)
          throws ServletException, IOException {
          doPost(request, response);
          }
          public void doPost(HttpServletRequest request, HttpServletResponse response)
          throws ServletException, IOException {
          String sBeginDate = request.getParameter("beginDate");
          String sEndDate = request.getParameter("endDate");
          Date beginDate = new Date();
          Date endDate = new Date();
          try {
          beginDate = new SimpleDateFormat("yyyy-MM-dd").parse(sBeginDate);
          endDate = new SimpleDateFormat("yyyy-MM-dd").parse(sEndDate);
          }catch(Exception e) {
          e.printStackTrace();
          }
          StudentManager studentManager = new StudentManagerImpl();
          List<Student> studentList = studentManager.findStudentList(beginDate, endDate);
          //將學(xué)生列表設(shè)置到requet范圍中
          //request.setAttribute("student_list", studentList);
          //轉(zhuǎn)發(fā),轉(zhuǎn)發(fā)是在服務(wù)器端轉(zhuǎn)發(fā)的,客戶端是不知道的
          //request.getRequestDispatcher("/student_list.jsp").forward(request, response);
          //將studentList放到session中
          HttpSession session = request.getSession();
          session.setAttribute("student_list", studentList);
          //重定向,不會共享request
          //以下寫法錯誤,該 "/"代表了8080端口
          //response.sendRedirect("/student_list.jsp");
          response.sendRedirect(request.getContextPath() + "/student_list.jsp");
          }
          }</span>
            這個里面嘗試了兩種調(diào)到后面的Jsp方法,在servlet中調(diào)用轉(zhuǎn)發(fā)、重定向的語句如下:
            實現(xiàn)轉(zhuǎn)發(fā):
            <span style="font-family:FangSong_GB2312;font-size:18px;">//轉(zhuǎn)發(fā),轉(zhuǎn)發(fā)是在服務(wù)器端轉(zhuǎn)發(fā)的,客戶端是不知道的
            request.getRequestDispatcher("/student_list.jsp").forward(request, response);</span>
            分析:請求轉(zhuǎn)發(fā)是服務(wù)器內(nèi)部把對一個request/response的處理權(quán),移交給另外一個對于客戶端而言,它只知道自己最早請求的那個A,而不知道中間的B,甚至C、D。 傳輸?shù)男畔⒉粫G失。

          實現(xiàn)重定向:
          <span style="font-family:FangSong_GB2312;font-size:18px;">//重定向,不會共享request
          //以下寫法錯誤,該 "/"代表了8080端口
          response.sendRedirect("/student_list.jsp");
          response.sendRedirect(request.getContextPath() + "/student_list.jsp");</span>
            深入(分析理解)
            轉(zhuǎn)發(fā)過程
            客戶首先發(fā)送一個請求到服務(wù)器端,服務(wù)器端發(fā)現(xiàn)匹配的servlet,并指定它去執(zhí)行,當(dāng)這個servlet執(zhí)行完之后,它要調(diào)用getRequestDispacther()方法,把請求轉(zhuǎn)發(fā)給指定的student_list.jsp,整個流程都是在服務(wù)器端完成的,而且是在同一個請求里面完成的,因此servlet和jsp共享的是同一個request,在servlet里面放的所有東西,在student_list中都能取出來,因此,student_list能把結(jié)果getAttribute()出來,getAttribute()出來后執(zhí)行完把結(jié)果返回給客戶端。整個過程是一個請求,一個響應(yīng)。
            重定向過程
            客戶發(fā)送一個請求到服務(wù)器,服務(wù)器匹配servlet,這都和請求轉(zhuǎn)發(fā)一樣,servlet處理完之后調(diào)用了sendRedirect()這個方法,這個方法是response的方法,所以,當(dāng)這個servlet處理完之后,看到response.senRedirect()方法,立即向客戶端返回這個響應(yīng),響應(yīng)行告訴客戶端你必須要再發(fā)送一個請求,去訪問student_list.jsp,緊接著客戶端受到這個請求后,立刻發(fā)出一個新的請求,去請求student_list.jsp,這里兩個請求互不干擾,相互獨立,在前面request里面setAttribute()的任何東西,在后面的request里面都獲得不了。可見,在sendRedirect()里面是兩個請求,兩個響應(yīng)。
            淺出(表象)
            轉(zhuǎn)發(fā)
            當(dāng)用RequestDispatcher請求轉(zhuǎn)發(fā)后,地址欄為http://localhost:8080/test/TestServlet
            這真好應(yīng)正了上面的分析,我們起初請求的就一個servlet,至于你服務(wù)器端怎么轉(zhuǎn),流程怎么樣的,我客戶端根本就不知道,我發(fā)了請求后我就等著響應(yīng),那你服務(wù)器那邊愿意怎么轉(zhuǎn)就怎么轉(zhuǎn),我客戶端不關(guān)心也沒法知道,所以當(dāng)服務(wù)器端轉(zhuǎn)發(fā)到j(luò)sp后,它把結(jié)果返回給客戶端,客戶端根本就不知道你這個結(jié)果是我真正訪問的servlet產(chǎn)生的,還是由servlet轉(zhuǎn)發(fā)后下一個組件產(chǎn)生的。
            重定向
            當(dāng)用sendRedirect重定向后,地址欄為http://localhost:8080/test/student_list.jsp
            因為這個時候,客戶端已經(jīng)知道了他第二次請求的是student_list.jsp,服務(wù)器已經(jīng)告訴客戶端要去訪問student_list.jsp了,所以地址欄里會顯示想要訪問的結(jié)果。
            總結(jié)
            轉(zhuǎn)發(fā)在服務(wù)器端完成的;重定向是在客戶端完成的
            轉(zhuǎn)發(fā)的速度快;重定向速度慢
            轉(zhuǎn)發(fā)的是同一次請求;重定向是兩次不同請求
            轉(zhuǎn)發(fā)不會執(zhí)行轉(zhuǎn)發(fā)后的代碼;重定向會執(zhí)行重定向之后的代碼
            轉(zhuǎn)發(fā)地址欄沒有變化;重定向地址欄有變化
            轉(zhuǎn)發(fā)必須是在同一臺服務(wù)器下完成;重定向可以在不同的服務(wù)器下完成
            Forward是在服務(wù)器端的跳轉(zhuǎn),就是客戶端一個請求發(fā)給服務(wù)器,服務(wù)器直接將請求相關(guān)的參數(shù)的信息原封不動的傳遞到該服務(wù)器的其他jsp或servlet去處理,而sendredirect是在客戶端的跳轉(zhuǎn),服務(wù)器會返回給客戶端一個響應(yīng)報頭和新的URL地址,原來的參數(shù)什么的信息如果服務(wù)器端沒有特別處理就不存在了,瀏覽器會訪問新的URL所指向的servlet或jsp,這可能不是原先服務(wù)器上的webservce了。

          posted on 2014-04-10 10:47 順其自然EVO 閱讀(214) 評論(0)  編輯  收藏 所屬分類: 測試學(xué)習(xí)專欄

          <2014年4月>
          303112345
          6789101112
          13141516171819
          20212223242526
          27282930123
          45678910

          導(dǎo)航

          統(tǒng)計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 卓尼县| 丘北县| 察雅县| 大石桥市| 红桥区| 张家港市| 娱乐| 安顺市| 平定县| 湖南省| 马鞍山市| 陆河县| 邯郸县| 蛟河市| 北安市| 桓台县| 衢州市| 枞阳县| 屏南县| 新巴尔虎左旗| 英吉沙县| 图木舒克市| 喀什市| 西宁市| 襄城县| 宁国市| 湄潭县| 光泽县| 凉城县| 乌鲁木齐县| 襄樊市| 南宫市| 明溪县| 晋州市| 绍兴县| 恩平市| 合作市| 湾仔区| 天津市| 涿鹿县| 汨罗市|