2012-02-24 36 views
34

Chuyển tiếp(): Điều này có thể được thực hiện theo hai cách theo Yêu cầu & ServeletContext. Chuyển tiếp yêu cầu từ servlet đến tài nguyên khác (servlet, JSP tệp hoặc tệp HTML) trên máy chủ. Chuyển tiếp được thực hiện tại phía máy chủ, mà không có kiến ​​thức của khách hàng.Sự khác biệt giữa cơ chế bao gồm và chuyển tiếp cho khái niệm gửi đi yêu cầu?

Khi bạn gọi một yêu cầu về phía trước, yêu cầu được gửi đến khác tài nguyên trên máy chủ, mà không có khách hàng được thông báo rằng một nguồn tài nguyên khác nhau sẽ xử lý yêu cầu. Quy trình này xảy ra hoàn toàn với trong vùng chứa web.

Đơn giản chỉ cần

bao gồm: sẽ bao gồm một tập tin trong tập tin hiện tại của chúng tôi

về phía trước: sẽ chuyển tiếp yêu cầu đến trang chuyển tiếp

+7

Bạn đã thử một cái gì đó gọi là tìm kiếm của Google chưa? – Santosh

+13

Tôi đã thực hiện tìm kiếm trên Google và đó là cách tôi nhận được ở đây. Hầu như bất kỳ câu hỏi có thể được trả lời với "RTFM" hoặc "STFW" nhưng stackoverflow đã trở thành một nguồn tài nguyên tuyệt vời cho tôi bởi vì nó cung cấp giải thích ngắn gọn và nhiều quan điểm trong khối có kích thước tiêu hóa. Tôi rất vui vì mọi người đặt câu hỏi đã có câu trả lời có sẵn. – WoodenKitty

+0

Rất ít điều gây khó chịu hơn là thực hiện tìm kiếm trên Google để tìm câu trả lời và tìm kiếm "Bạn đã thử một cái gì đó gọi là tìm kiếm của Google chưa?" – Arijit

Trả lời

27

Sự khác biệt chính là khi bạn sử dụng mong sự điều khiển được chuyển đến servlet/jsp tiếp theo mà bạn đang gọi, trong khi bao gồm giữ lại quyền kiểm soát với servlet hiện tại, nó chỉ bao gồm việc xử lý được thực hiện bởi servlet/jsp gọi (như thực hiện bất kỳ lệnh out.println nào hoặc chế biến khác).

51

Sự khác biệt giữa hai thẻ là cách chúng hoạt động. Vâng, tôi sẽ nói một ví dụ để bạn có thể tưởng tượng nó tốt hơn.

Giả sử bạn có hai trang, pageA và pageB. Trong trang, bạn đã viết thẻ bao gồm. Trong trường hợp này, điều khiển đã ở trangBạn đã gọi thẻ bao gồm. Tại số này, toàn quyền kiểm soát sẽ chuyển đến trangB. Khi nó được thực hiện, kiểm soát được trả về trangA bắt đầu từ điểm mã tiếp theo sau thẻ bao gồm và tiếp tục với phần còn lại của trangA.

Để hiểu rõ hơn, hãy nói rằng chúng tôi có cùng trang, pageA và pageB, nhưng lần này chúng tôi sẽ sử dụng thẻ chuyển tiếp trong trangA, không bao gồm thẻ . Một lần nữa, điều khiển sẽ bắt đầu trong trangA cho đến khi chúng tôi gọi thẻ chuyển tiếp trong trang A, tại thời điểm này, điều khiển được chuyển sang trangB, giống như thẻ bao gồm. Nhưng sự khác biệt là những gì sẽ xảy ra khi pageB hoàn thành. Trong trường hợp thẻ chuyển tiếp , điều khiển không quay trở lại trang một lần nữa.

+2

+1, tất cả các câu trả lời đều giống nhau, nhưng câu trả lời nào tôi thích đọc? Điều này tất nhiên ;-) –

+0

tuyệt vời! Cuối cùng tôi đã nhận được nó! – koryakinp

+0

giải thích tốt, cảm ơn bạn. – enzo

24

include(request, response);

Nếu tài nguyên là tĩnh, bao gồm phương pháp cho phép chương trình server-side includes. Nếu tài nguyên là một thành phần web, hiệu ứng của phương thức là gửi yêu cầu đến thành phần web được bao gồm, thực thi thành phần web, và sau đó bao gồm kết quả của việc thực hiện trong phản hồi từ servlet chứa.

Thành phần web được bao gồm có quyền truy cập vào đối tượng yêu cầu nhưng bị giới hạn ở những gì có thể làm với đối tượng phản hồi.

  • Nó có thể ghi vào phần thân của phản hồi và cam kết trả lời.
  • Không thể đặt tiêu đề hoặc gọi bất kỳ phương thức nào, chẳng hạn như setCookie, ảnh hưởng đến tiêu đề của phản hồi.

Việc thêm tài nguyên web khác, chẳng hạn như nội dung biểu ngữ hoặc thông tin bản quyền) vào phản hồi được trả về từ thành phần web thường hữu ích.

forward(request, response);

Trong một số ứng dụng, bạn có thể muốn có một thành phần web làm sơ chế được yêu cầu và có thành phần khác tạo ra các phản ứng. Ví dụ: bạn có thể muốn xử lý một phần yêu cầu và sau đó chuyển sang một thành phần khác, tùy thuộc vào bản chất của yêu cầu.

Để chuyển quyền kiểm soát sang thành phần web khác, bạn gọi phương thức chuyển tiếp của RequestDispatcher. Khi một yêu cầu được chuyển tiếp, URL yêu cầu được đặt thành đường dẫn của trang được chuyển tiếp. URI gốc và các bộ phận cấu thành của nó được lưu dưới dạng thuộc tính yêu cầu.

javax.servlet.forward.[request-uri|context-path|servlet-path|path-info|query-string] 

Phương pháp phía trước nên được sử dụng để cung cấp cho một trách nhiệm tài nguyên để trả lời cho người dùng. Nếu bạn đã truy cập một đối tượng ServletOutputStream hoặc PrintWriter trong servlet, bạn không thể sử dụng phương thức này; làm như vậy ném một số IllegalStateException.

liên kết liên quan

6

Sự khác biệt chính giữa hai là phương pháp chuyển tiếp() sẽ đóng dòng đầu ra sau khi nó đã được gọi, wh ereas phương pháp include để lại luồng đầu ra MỞ.

trả lời với một ví dụ: cho phép có một trang servlet tên xxx.java và một trang jsp tên yy.jsp

Trong yy.jsp

WELCOME to yy.jsp 

Trong xxx. java // using forward()

RequestDispatcher rd = request.getRequestDispatcher("yy.jsp"); rd.forward(request,response); out.println("back to servlet"); //this wont b displayed

đầu ra

WELCOME to yy.jsp 

Trong xxx.java // sử dụng bao gồm()

RequestDispatcher rd = request.getRequestDispatcher("yy.jsp"); rd.include(request,response); out.println("back to servlet");

đầu ra

WELCOME to yy.jsp back to servlet 

Nhưng quan trọng nhất NÓ KHÔNG CHO SỰ KIỂM SOÁT, VÌ NẾU CHÚNG TÔI PUT một

System.out.println("console output");

sau một trong các số .forward() hoặc .include() yêu cầu, đầu ra bàn điều khiển sẽ được tạo ra trên mỗi trường hợp. của nó về sự đáp ứng cho khách hàng

Vì vậy, phần cơ bản là nếu chúng ta chế biến trong một thành phần phía máy chủ và sau đó chuyển tiếp đến một JSP hoặc Servlet để tạo đánh dấu cho một khách hàng, một khi đã JSP hoặc Servlet đã xử lý xong, chúng tôi không còn có thể gọi bất kỳ thành phần nào khác để tạo đánh dấu có thể được gửi cho khách hàng. Một khi chúng tôi đã thực hiện một tiến, đánh dấu thế hệ cho các yêu cầu hiện tại và chu kỳ phản ứng được hoàn thành.

Ngoài ra, với một bao gồm, luồng đầu ra vẫn mở, vì vậy chúng tôi có thể gọi trên nhiều tệp khác nhau để tạo đánh dấu mặt khách hàng mà chúng tôi cần. Vì vậy, chúng tôi có thể bao gồm hai hoặc ba tệp JSP và thậm chí Servlet trong chuỗi các thành phần tạo ra đánh dấu dựa trên khách hàng. Khi chúng ta sử dụng một bao gồm, luồng đầu ra không được đóng sau khi gọi.

+0

http://www.theserverside.com/tip/Include-vs-Forward-of-the-Servlet-RequestDispatcher? – Preuk

+0

Ít nhất cung cấp tín dụng cho liên kết gốc! –

Các vấn đề liên quan