JSP: Gọi các Tài nguyên Web khác

Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực

Các thành phần Web có thể gọi các tài nguyên web khác theo hai cách: gián tiếp và trực tiếp. Một thành phần web gián tiếp gọi một nguồn tài nguyên web khác khi nó nhúng URL chỉ vào một thành phần web khác trong nội dung trả lại cho một máy khách. Trong ứng dụng của Công ty Duke Bookstore, hầu hết các thành phần web chứa các URL được nhúng chỉ tới các thành phần web khác. Ví dụ, ShowCartServlet gián tiếp gọi Invalid CatalogServlet qua URL nhúng sau:

/ Nhà sách1 / cửa hàng

Một thành phần web cũng có thể trực tiếp gọi một tài nguyên khác trong khi nó đang thực hiện. Có hai khả năng: Thành phần web có thể bao gồm nội dung của tài nguyên khác hoặc nó có thể chuyển tiếp một yêu cầu tới một tài nguyên khác.

Để gọi một tài nguyên có sẵn trên máy chủ đang chạy một thành phần web, trước tiên bạn phải có đối tượng RequestDispatcher sử dụng phương thức getRequestDispatcher ("URL") .

Bạn có thể nhận được một đối tượng RequestDispatcher từ yêu cầu hoặc bối cảnh web; Tuy nhiên, hai phương pháp có hành vi hơi khác nhau. Phương pháp lấy đường dẫn đến tài nguyên được yêu cầu làm đối số. Một yêu cầu có thể lấy một đường dẫn tương đối (nghĩa là một không bắt đầu với một / ), nhưng ngữ cảnh web đòi hỏi một đường dẫn tuyệt đối. Nếu tài nguyên không có sẵn hoặc nếu máy chủ không triển khai đối tượng RequestDispatcher cho loại tài nguyên đó, getRequestDispatcher sẽ trả về null. Servlet của bạn nên được chuẩn bị để đối phó với tình trạng này.

Bao gồm các Tài nguyên khác trong Phản hồi

Thường có ích khi đưa một tài nguyên web khác (ví dụ như nội dung biểu ngữ hoặc thông tin bản quyền) trong phản hồi được trả về từ một thành phần web. Để bao gồm một tài nguyên khác, hãy gọi phương thức include của một đối tượng RequestDispatcher :

Bao gồm (yêu cầu, phản hồi);

Nếu tài nguyên là tĩnh, phương pháp bao gồm cho phép phía máy chủ bao gồm cả máy chủ. Nếu tài nguyên là một thành phần web, hiệu quả của phương pháp này là gửi yêu cầu tới thành phần web được đính kèm, thực hiện 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 có chứa. Một thành phần web có thể truy cập vào đối tượng yêu cầu, nhưng nó được giới hạn trong những gì nó có thể làm với đối tượng phản hồi:

  • Nó có thể viết cho cơ thể của phản ứng và cam kết một phản ứng.

  • Không thể đặt tiêu đề hoặc gọi bất kỳ phương pháp nào (ví dụ: setCookie ) ảnh hưởng đến tiêu đề của phản hồi.

Biểu ngữ cho ứng dụng Sách của Duke được tạo ra bởi BannerServlet . Lưu ý rằng cả doGet và doPost đều được thực hiện vì BannerServlet có thể được gửi đi từ một trong hai phương thức trong một servlet gọi.

Lớp công khai BannerServlet mở rộng HttpServlet {
     Public void doGet (HttpServletRequest yêu cầu,
        Phản hồi HttpServletResponse)
        Ném ServletException, IOException {
            Đầu ra (yêu cầu, đáp ứng);
    }
    Public void doPost (yêu cầu HTTPTextRequest,
        Phản hồi HttpServletResponse)
        Ném ServletException, IOException {
            Đầu ra (yêu cầu, đáp ứng);
}

Private void output (yêu cầu HttpServletRequest,
        Phản hồi HttpServletResponse)
        Ném ServletException, IOException {
        InWriter ra = response.getWriter ();
        Out.println ("<body bgcolor = \" # ffffff \ ">" +
        "<Center>" + "<hr> <br> & nbsp;" + "<H1>" +
        "<Font size = \" + 3 \ "color = \" # CC0066 \ "> Công tước của Duke </ font>" +
        <Img src = \ "" + request.getContextPath () +
        "/duke.books.gif \"> "+
         "<Font size = \" + 3 \ "color = \" black \ "> Hiệu sách </ font>" +
        "</ H1>" + "</ center>" + "<br> & nbsp; <hr> <br>");
    }
}

Mỗi servlet trong ứng dụng Bookstore của Duke bao gồm kết quả từ BannerServlet bằng cách sử dụng mã sau:

Yêu cầuDispatcher dispatcher =
    GetServletContext (). GetRequestDispatcher ("/ banner");
If (dispatcher! = Null)
    Dispatcher.include (yêu cầu, phản hồi);
}

Chuyển quyền điều khiển sang một thành phần Web khác

Trong một số ứng dụng, bạn có thể muốn có một thành phần web xử lý sơ bộ yêu cầu và có một thành phần khác tạo ra phản hồi. Ví dụ: bạn có thể muốn xử lý một phần một 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 điều khiển tới một thành phần web khác, bạn gọi phương thức chuyển tiếp của một 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 ban đầu và các thành phần cấu thành của nó được lưu như thuộc tính yêu cầu javax.servlet.forward. [ Request-uri | Context-path | Servlet-path | Đường dẫn thông tin | Truy vấn chuỗi ] . CácTut-install / javaeetutorial5 / example / web / bookstore2 / src / java / com / sun / bookstore2 / dispatcher / Dispatcher servlet, được sử dụng bởi một phiên bản của ứng dụng Bookstore của Duke được mô tả trong Các ví dụ JSP Pages , lưu thông tin đường dẫn từ bản gốc URL, lấy ra một RequestDispatcher từ yêu cầu, và sau đó chuyển tiếp đến trang JSP,Tut-install /javaeetutorial5/examples/web/bookstore3/web/template/template.jsp .

Trình phân phối lớp công khai kéo dài HttpServlet {
    Public void doGet (HttpServletRequest yêu cầu,
         Phản hồi HttpServletResponse) {
        Yêu cầuDispatcher dispatcher = yêu cầu.
            GetRequestDispatcher ("/ template.jsp");
        If (dispatcher! = Null)
            Dispatcher.forward (yêu cầu, phản hồi);
    }
    Public void doPost (yêu cầu HTTPTextRequest,
     ...
}

Các tiến phương pháp 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 pháp này; Làm như vậy ném một IllegalStateException.

» Tiếp: Truy cập web context và bảo trì tình trạng máy khách
« Trước: Lọc yêu cầu và phản hồi trong Servlet
Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực
Copied !!!