JSP: Truy cập web context và bảo trì tình trạng máy khách

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

Truy cập Web Context

Bối cảnh trong đó các thành phần web thực thi là một đối tượng thực hiện giao diện ServletContext . Bạn lấy bối cảnh web bằng cách sử dụng phương pháp getServletContext . Khung cảnh web cung cấp các phương pháp để truy cập:

  • Thông số khởi tạo

  • Tài nguyên liên quan đến ngữ cảnh web

  • Thuộc tính đối tượng

  • Khả năng đăng nhập

Bối cảnh web được sử dụng bởi sách của Duke lọc HitCounterFilter và OrderFilter , được thảo luận trong yêu cầu lọc và phản hồi . Mỗi bộ lọc lưu trữ một bộ đếm như là một thuộc tính ngữ cảnh. Nhớ lại từ Kiểm soát Truy cập đồng thời vào Tài nguyên Chia sẻ rằng các phương pháp truy cập của bộ đếm được đồng bộ hóa để ngăn chặn các hoạt động không tương thích của các servlet đang chạy đồng thời. Bộ lọc lấy ra đối tượng truy cập bằng phương thức getAttribute của ngữ cảnh . Giá trị gia tăng của bộ đếm được ghi lại trong nhật ký.

Lớp cuối cùng công khai HitCounterFilter thực hiện Bộ lọc {
    Bộ lọc riêng FilterConfigConfig = null;
    Public void doFilter (yêu cầu ServletRequest,
        Đáp ứng ServletResponse, chuỗi FilterChain)
         Ném IOException, ServletException {
        ...
        StringWriter sw = new StringWriter ();
        PrintWriter writer = mới PrintWriter (sw);
        ServletContext context = filterConfig.
            GetServletContext ();
        Counter counter = (Truy cập) ngữ cảnh.
            GetAttribute ("hitCounter");
        ...
        Writer.println ("Số lần truy cập là:" +
            Counter.incCounter ());
        ...
        System.out.println (sw.getBuffer () toString ());
        ...
    }
}

Bảo trì tình trạng máy khách

Nhiều ứng dụng yêu cầu một loạt yêu cầu từ một máy khách được liên kết với nhau. Ví dụ: ứng dụng Sách của Duke lưu trạng thái giỏ hàng của người dùng trên các yêu cầu. Các ứng dụng dựa trên web có trách nhiệm duy trì trạng thái đó, được gọi là phiên làm việc , bởi vì HTTP là trạng thái không quốc tịch. Để hỗ trợ các ứng dụng cần duy trì trạng thái, công nghệ Java Servlet cung cấp một API để quản lý các phiên và cho phép một số cơ chế để thực hiện các phiên.

Truy cập một phiên

Phiên được đại diện bởi một đối tượng HttpSession . Bạn truy cập vào một phiên bằng cách gọi phương thức getSession của một đối tượng yêu cầu. Phương thức này trả về phiên hiện tại được liên kết với yêu cầu này, hoặc, nếu yêu cầu không có phiên, nó sẽ tạo ra một.

Liên kết đối tượng với một phiên làm việc

Bạn có thể liên kết thuộc tính đối tượng với một phiên theo tên. Các thuộc tính này có thể truy cập được bởi bất kỳ thành phần web nào thuộc cùng ngữ cảnh web đang xử lý yêu cầu đó là một phần của cùng một phiên làm việc.

Ứng dụng Bookstore của Duke lưu trữ giỏ hàng của khách hàng dưới dạng thuộc tính phiên. Điều này cho phép giỏ hàng được lưu giữa các yêu cầu và cũng cho phép các servlet hợp tác truy cập vào giỏ hàng. CatalogServlet cho biết thêm các mặt hàng vào giỏ hàng; Hiển thị ShowCartServlet , xóa các mục khỏi và xóa giỏ; Và CashierServlet lấy ra tổng chi phí của sách trong giỏ hàng.

Lớp công khai CashierServlet mở rộng HttpServlet {
     Public void doGet (HttpServletRequest yêu cầu,
        Phản hồi HttpServletResponse)
        Ném ServletException, IOException {

        // Tải phiên và giỏ hàng của người dùng
        HttpSession phiên = request.getSession ();
        Giỏ hàng Shopping =
            (ShoppingCart).
                GetAttribute ("giỏ hàng");
         ...
        // Xác định tổng giá sách của người dùng
        Tăng gấp đôi = cart.getTotal ();

Thông báo các đối tượng liên quan đến một phiên làm việc

Nhớ lại rằng ứng dụng của bạn có thể thông báo cho đối tượng web ngữ cảnh và trình lắng nghe phiên họp về các sự kiện vòng đời servlet ( Xử lý các Sự kiện vòng đời của Servlet ). Bạn cũng có thể thông báo các đối tượng của các sự kiện nhất định có liên quan đến sự kết hợp của chúng với một phiên như sau:

  • Khi đối tượng được thêm vào hoặc bị xóa khỏi một phiên. Để nhận được thông báo này, đối tượng của bạn phải thực hiện giao diện javax.servlet.http.HttpSessionBindingListener .

  • Khi phiên kết nối đối tượng được kích hoạt hoặc kích hoạt. Một phiên sẽ bị động hoặc kích hoạt khi nó được di chuyển giữa các máy ảo hoặc lưu vào và được khôi phục từ bộ lưu trữ liên tục. Để nhận được thông báo này, đối tượng của bạn phải thực hiện giao diện javax.servlet.http.HttpSessionActivationListener .

Quản lý phiên

Bởi vì không có cách cho một khách hàng HTTP báo hiệu rằng nó không còn cần một phiên, mỗi phiên có một thời gian chờ liên quan để tài nguyên của nó có thể được lấy lại. Khoảng thời gian chờ có thể được truy cập bằng cách sử dụng các phương thức MaxInactiveInterval [get | set] của phiên .

Bạn cũng có thể thiết lập khoảng thời gian chờ trong bộ mô tả triển khai sử dụng NetBeans IDE:

  1. Mở tệp web.xml trong trình chỉnh sửa web.xml .

  2. Nhấp vào Tổng quát ở đầu trình soạn thảo.

  3. Nhập một giá trị số nguyên vào trường Session Timeout. Giá trị số nguyên đại diện cho số phút không hoạt động phải vượt qua trước thời gian phiên.

Để đảm bảo rằng phiên đang hoạt động không bị hết thời gian, bạn nên định kỳ truy cập vào phiên bằng cách sử dụng các phương pháp dịch vụ vì nó sẽ đặt lại thời gian truy cập thời gian của phiên.

Khi một sự tương tác khách hàng cụ thể được hoàn tất, bạn sử dụng của phiên vô hiệu phương pháp để vô hiệu hóa một phiên họp về phía máy chủ và loại bỏ bất kỳ dữ liệu phiên. ReceiptServlet của ứng dụng hiệu sách là servlet cuối cùng để truy cập phiên của khách hàng, vì vậy nó có trách nhiệm làm mất hiệu lực phiên làm việc:

Lớp công khai ReceiptServlet mở rộng HttpServlet {
     Public void doPost (yêu cầu HTTPTextRequest,
                    Phản hồi HttpServletResponse)
                     Ném ServletException, IOException {
        // Tải phiên và giỏ hàng của người dùng
        HttpSession phiên = request.getSession ();
        // Thanh toán đã nhận - làm mất hiệu lực phiên
        Session.invalidate ();
        ...

Theo dõi phiên

Bộ chứa web có thể sử dụng một số phương pháp để liên kết phiên với người dùng, tất cả đều liên quan đến việc chuyển một số nhận dạng giữa máy khách và máy chủ. Id nhận dạng có thể được duy trì trên máy khách dưới dạng một cookie, hoặc thành phần web có thể bao gồm định danh trong mỗi URL được trả về cho máy khách.

Nếu ứng dụng của bạn sử dụng các đối tượng phiên, bạn phải đảm bảo rằng theo dõi phiên được kích hoạt bằng cách viết ứng dụng viết lại URL bất cứ khi nào máy khách tắt cookie. Bạn thực hiện việc này bằng cách gọi phương thức encodeURL (URL) của phản hồi trên tất cả URL được trả về bởi một servlet. Phương pháp này bao gồm ID phiên trong URL chỉ khi cookie bị tắt; Nếu không, nó trả lại URL không thay đổi.

Các doGet phương pháp ShowCartServlet mã hóa ba URL ở dưới cùng của trang hiển thị giỏ hàng như sau:

Out.println ("<p> & nbsp; <p> <strong> <a href =" "+
    Response.encodeURL (request.getContextPath () +
        "/ Bookcatalog") +
        "\"> "+ Messages.getString (" ContinueShopping ") +
        "</a> & nbsp; & nbsp; & nbsp;" +
        "<A href = \" "+
    Response.encodeURL (request.getContextPath () +
        "/ Bookcashier") +
        "\"> "+ Messages.getString (" Checkout ") +
        "</a> & nbsp; & nbsp; & nbsp;" +
        "<A href = \" "+
     Response.encodeURL (request.getContextPath () +
        "/ Bookshowcart? Clear = rõ ràng") +
        "\"> "+ Message.getString (" ClearCart ") +
        "</a> </ strong>");

Nếu cookie được tắt, phiên được mã hoá trong URL kiểm tra như sau:

Http: // localhost: 8080 / bookstore1 / thủ quỹ, jsessionid = c0o7fszeb1

Nếu cookie được bật, URL chỉ đơn giản là

Http: // localhost: 8080 / hiệu sách1 / thủ quỹ
» Tiếp: Hoàn thiện Servlet
« Trước: 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
Copied !!!