JSP: Khởi tạo Servlet và viết các phương thức dịch vụ
Khởi tạo Servlet
Sau khi bộ chứa web tải và khởi tạo lớp servlet và trước khi nó cung cấp yêu cầu từ khách hàng, bộ chứa web khởi tạo servlet. Để tùy chỉnh quá trình này để cho phép servlet đọc dữ liệu cấu hình liên tục, khởi tạo tài nguyên và thực hiện bất kỳ hoạt động một lần nào khác, bạn sẽ ghi đè phương thức init của giao diện Servlet . Một servlet không thể hoàn tất quá trình khởi tạo sẽ ném UnavailableException .
Tất cả các servlets truy cập vào cơ sở dữ liệu hiệu sách ( BookStoreServlet , CatalogServlet , BookDetailsServlet , và ShowCartServlet ) khởi tạo một biến trong họ initphương pháp trỏ đến các đối tượng truy cập cơ sở dữ liệu được tạo ra bởi người nghe bối cảnh web:
Public class CatalogServlet mở rộng HttpServlet { Tư nhân BookDBAO bookDB; Public void init () throws ServletException { BookDB = (BookDBAO) getServletContext (). GetAttribute ("bookDB"); Nếu (bookDB == null) ném mới UnavailableException ("Không thể lấy được cơ sở dữ liệu."); } }
Viết các phương pháp dịch vụ
Các dịch vụ được cung cấp bởi một servlet được thực hiện trong các dịch vụ phương pháp của một GenericServlet , trong làm Phương pháp phương pháp (nơi Phương pháp có thể mất giá trị Nhận , Xóa , Tùy chọn , bài viết , Đặt , hoặc vết ) của một HttpServlet đối tượng, hoặc trong bất kỳ khác Các phương thức giao thức xác định bởi một lớp thực hiện giao diện Servlet . Trong phần còn lại của chương này, thuật ngữ dịch vụ phương pháp được sử dụng cho bất kỳ phương pháp trong một lớp servlet cung cấp một dịch vụ cho một khách hàng.
Mô hình chung cho một phương pháp dịch vụ là trích xuất thông tin từ yêu cầu, truy cập tài nguyên bên ngoài, và sau đó điền vào các phản hồi dựa trên thông tin đó.
Đối với các servlet HTTP, thủ tục chính xác để nạp câu trả lời là lần đầu tiên lấy ra một luồng đầu ra từ câu trả lời, sau đó điền vào các tiêu đề phản hồi, và cuối cùng là viết nội dung cơ thể vào luồng đầu ra. Tiêu đề phản hồi phải luôn được đặt trước khi có phản hồi. Mọi cố gắng thiết lập hoặc thêm tiêu đề sau khi phản hồi đã được cam kết sẽ bị bỏ qua bởi vùng chứa web. Hai phần tiếp theo mô tả cách nhận thông tin từ các yêu cầu và tạo ra phản hồi.
Nhận thông tin từ yêu cầu
Yêu cầu chứa dữ liệu được truyền giữa máy khách và servlet. Tất cả yêu cầu thực hiện giao diện ServletRequest . Giao diện này định nghĩa các phương pháp để truy cập vào các thông tin sau:
-
Thông số, thường được sử dụng để truyền tải thông tin giữa các máy khách và servlet
-
Đối tượng thuộc tính đối tượng, thường được sử dụng để truyền thông tin giữa bộ chứa servlet và servlet hoặc giữa các servlet hợp tác
-
Thông tin về giao thức được sử dụng để truyền đạt yêu cầu và về máy khách và máy chủ tham gia vào yêu cầu
-
Thông tin liên quan đến nội địa hoá
Ví dụ: trong CatalogServlet , định danh của cuốn sách mà khách hàng mong muốn mua được bao gồm như một tham số cho yêu cầu. Đoạn mã sau mô tả cách sử dụng phương pháp getParameter để trích xuất các định danh:
Chuỗi bookId = request.getParameter ("Thêm"); If (bookId! = Null) { Sách book = bookDB.getBook (bookId);
Bạn cũng có thể lấy ra một luồng đầu vào từ yêu cầu và phân tích dữ liệu theo cách thủ công. Để đọc dữ liệu ký tự, hãy sử dụng đối tượng java.io.BufferedReader trả về theo phương thức getReader của yêu cầu . Để đọc dữ liệu nhị phân, sử dụng ServletInputStream trả về bởi getInputStream .
Các servlet HTTP được thông qua một đối tượng yêu cầu HTTP, HttpServletRequest , chứa URL yêu cầu, tiêu đề HTTP, chuỗi truy vấn, v.v ...
URL yêu cầu HTTP chứa các phần sau:
Http: // [ host ]: [ port ] [ request-path ]? [ Truy vấn chuỗi ]
Đường dẫn yêu cầu bao gồm các yếu tố sau:
-
Đường dẫn ngữ cảnh : Gạch nối liền ( / ) với ngữ cảnh gốc của ứng dụng web của servlet.
-
Đường dẫn servlet : Phần đường dẫn tương ứng với bí danh thành phần đã kích hoạt yêu cầu này. Đường dẫn này bắt đầu bằng dấu gạch chéo ( / ).
-
Thông tin đường dẫn : Phần của đường dẫn yêu cầu không phải là một phần của đường dẫn ngữ cảnh hoặc đường dẫn servlet.
Nếu đường dẫn ngữ cảnh là / catalog và cho các bí danh được liệt kê trong Bảng 4-4 , Bảng 4-5 đưa ra một số ví dụ về cách URL sẽ được phân tích cú pháp.
Mẫu |
Servlet |
---|---|
/ Cỏ / * |
LawnServlet |
/*.jsp |
JSPServlet |
Bí danh
Yêu cầu Đường dẫn |
Đường dẫn Servlet |
Thông tin đường dẫn |
---|---|---|
/catalog/lawn/index.html |
/ Bãi cỏ |
/index.html |
/catalog/help/feedback.jsp |
/help/feedback.jsp |
vô giá trị |
Yêu cầu các phần tử đường dẫn
Các chuỗi truy vấn bao gồm một tập các tham số và giá trị. Các tham số cá nhân được lấy ra từ một yêu cầu bằng cách sử dụng phương thức getParameter . Có hai cách tạo các chuỗi truy vấn:
-
Một chuỗi truy vấn có thể xuất hiện một cách rõ ràng trong một trang web. Ví dụ: một trang HTML được tạo bởi CatalogServlet có thể chứa liên kết <a href="/bookstore1/catalog?Add=101"> Thêm vào giỏ hàng </a> . CatalogServlet trích ra tham số có tên Add như sau:
Chuỗi bookId = request.getParameter ("Thêm");
-
Một chuỗi truy vấn được nối vào một URL khi một mẫu với một phương thức HTTP GET được đệ trình. Trong ứng dụng của Công ty Duke's Bookstore, CashierServlet tạo ra một biểu mẫu, sau đó nhập tên người dùng vào biểu mẫu được nối vào URL liên kết với ReceiptServlet và cuối cùng là ReceiptServlet chiết xuất tên người dùng bằng cách sử dụng phương pháp getParameter .
Xây dựng phản hồi
Phản hồi chứa dữ liệu được truyền giữa máy chủ và máy khách. Tất cả các câu trả lời thực hiện giao diện ServletResponse . Giao diện này xác định các phương pháp cho phép bạn:
-
Truy xuất một luồng đầu ra để sử dụng để gửi dữ liệu tới máy khách. Để gửi dữ liệu ký tự, sử dụng java.io.PrintWriter trả về bởi phương thức getWriter của phản ứng . Để gửi dữ liệu nhị phân trong phản ứng cơ thể MIME, hãy sử dụng ServletOutputStream trả về bởi getOutputStream . Để kết hợp dữ liệu nhị phân và văn bản (như trong đáp ứng nhiều phần), sử dụng một ServletOutputStream và quản lý các phần nhân vật theo cách thủ công.
-
Chỉ định loại nội dung (ví dụ, text / html ) được trả lại bằng phản hồi bằng phương pháp setContentType (String) . Phương pháp này phải được gọi trước khi đáp ứng được cam kết. Đăng ký tên loại nội dung được giữ bởi Tổ chức Quản lý số Được uỷ quyền Internet (IANA) tại http://www.iana.org/assignments/media-types/.
-
Cho biết đầu ra bộ đệm với phương thức setBufferSize (int) hay không . Theo mặc định, mọi nội dung được ghi vào luồng đầu ra sẽ được gửi ngay cho khách hàng. Buffer cho phép nội dung được viết trước khi bất cứ thứ gì được gửi lại cho khách hàng, do đó cung cấp cho servlet nhiều thời gian hơn để thiết lập các mã trạng thái thích hợp và tiêu đề hoặc chuyển tiếp đến một nguồn tài nguyên web khác. Phương pháp phải được gọi trước khi bất kỳ nội dung nào được viết hoặc trước khi đáp ứng được cam kết.
-
Đặt thông tin bản địa hoá như ngôn ngữ và mã hóa ký tự. Xem Chương 15, Quốc tế hóa và Bản địa hoá Ứng dụng Web để biết chi tiết.
Đối tượng phản hồi HTTP, HttpServletResponse , có các trường đại diện cho tiêu đề HTTP như sau:
-
Mã trạng thái, được sử dụng để chỉ ra lý do yêu cầu không hài lòng hoặc yêu cầu đã được chuyển hướng.
-
Cookie, được sử dụng để lưu trữ thông tin cụ thể cho ứng dụng tại máy khách. Đôi khi cookie được sử dụng để duy trì số nhận dạng để theo dõi phiên của người dùng (xem Theo dõi phiên ).
Trong Cửa hàng Sách của Duke, BookDetailsServlet tạo ra một trang HTML hiển thị thông tin về một cuốn sách mà servlet lấy ra từ cơ sở dữ liệu. Servlet đầu tiên đặt tiêu đề đáp ứng: loại nội dung phản ứng và kích thước bộ đệm. Bộ đệm servlet nội dung trang vì truy cập cơ sở dữ liệu có thể tạo ra một ngoại lệ có thể gây ra chuyển tiếp đến một trang lỗi. Bằng cách đệm câu trả lời, servlet ngăn không cho khách hàng thấy được phần nối của một trang của Công tước với trang lỗi khi xảy ra lỗi. Các doGet phương pháp sau đó lấy ra một PrintWriter từ các phản ứng.
Để điền câu trả lời, servlet đầu tiên gửi yêu cầu tới BannerServlet , tạo ra một biểu ngữ chung cho tất cả các servlet trong ứng dụng. Quá trình này được thảo luận trong Bao gồm các Tài nguyên khác trong Phản hồi . Sau đó, servlet truy xuất mã nhận dạng sách từ một tham số yêu cầu và sử dụng định danh để lấy thông tin về cuốn sách từ cơ sở dữ liệu sách. Cuối cùng, servlet tạo ra đánh dấu HTML mô tả thông tin sách và sau đó cam kết trả lời khách hàng bằng cách gọi phương thức close trên PrintWriter .
Lớp học công khai BookDetailsServlet mở rộng HttpServlet { ... Public void doGet (HttpServletRequest yêu cầu, Phản hồi HttpServletResponse) Ném ServletException, IOException { ... / / Thiết lập tiêu đề trước khi truy cập Writer Response.setContentType ("text / html"); Response.setBufferSize (8192); InWriter ra = response.getWriter (); // sau đó viết câu trả lời Out.println ("<html>" + "<Head> <title> + Messages.getString ("TitleBookDescription") + </ Title> </ head> "); // Lấy người điều khiển; Nó được banner cho người dùng Yêu cầuDispatcher dispatcher = GetServletContext (). GetRequestDispatcher ("/ banner"); If (dispatcher! = Null) Dispatcher.include (yêu cầu, phản hồi); // Lấy số nhận dạng của cuốn sách để hiển thị Chuỗi bookId = request.getParameter ("bookId"); If (bookId! = Null) { // và thông tin về cuốn sách thử { Sách bd = BookDB.getBook (bookId); ... // In thông tin thu được Out.println ("<h2>" + bd.getTitle () + "</ h2>" + ... } Catch (BookNotFoundException cũ) { Response.resetBuffer (); Ném ServletException mới (cũ); } } Out.println ("</ body> </ html>"); Out.close (); } }
BookDetailsServlet tạo một trang trông giống như hình dưới đây.
Chi tiết Sách