JSP: Chia sẻ thông tin 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

Các thành phần Web, giống như hầu hết các đối tượng, thường làm việc với các đối tượng khác để hoàn thành nhiệm vụ của họ. Có nhiều cách để họ có thể làm việc này. Họ có thể sử dụng các đối tượng trợ giúp cá nhân (ví dụ các thành phần JavaBeans), họ có thể chia sẻ các đối tượng thuộc tính của phạm vi công cộng, họ có thể sử dụng cơ sở dữ liệu và họ có thể gọi các tài nguyên web khác. Cơ chế công nghệ Java Servlet cho phép một thành phần web gọi các tài nguyên web khác được mô tả trong Gọi các Tài nguyên Web khác.

Sử dụng đối tượng phạm vi

Cộng tác các thành phần web chia sẻ thông tin bằng các đối tượng được duy trì như các thuộc tính của bốn đối tượng phạm vi. Bạn truy cập các thuộc tính này bằng cách sử dụng các phương thức thuộc tính [get | set] của lớp đại diện cho phạm vi. Bảng 4-3 liệt kê các đối tượng phạm vi.

 

Đối tượng phạm vi

Lớp học

Có thể truy cập từ

Bối cảnh web

Javax.servlet.ServletContext

Các thành phần Web trong một ngữ cảnh web. Xem Truy cập Bối cảnh Web .

Phiên

Javax.servlet.http.HttpSession

Các thành phần Web xử lý một yêu cầu thuộc về phiên làm việc. Xem Duy trì Nhà nước Khách hàng .

Yêu cầu

Loại phụ của javax.servlet.ServletRequest

Các thành phần Web xử lý yêu cầu.

Trang

Javax.servlet.jsp.JspContext

Trang JSP tạo ra đối tượng. Xem Sử dụng các Đối tượng Tích lũy .

Các đối tượng phạm vi

Hình dưới đây cho thấy các thuộc tính được duy trì bởi ứng dụng của Công ty Duke's Bookstore.

Sơ đồ của Duke's Bookstore đã xác định thuộc tính.  Thuộc tính phiên là tiền tệ và giỏ hàng, thuộc tính ngữ cảnh web là hitCounter, bookDB, orderCounter.
Nhà sách của Duke Các thuộc tính Scoped

Kiểm soát truy cập đồng thời vào các tài nguyên chia sẻ

Trong một máy chủ đa luồng, có thể chia sẻ tài nguyên để được truy cập đồng thời. Ngoài các thuộc tính đối tượng phạm vi, các tài nguyên chia sẻ bao gồm dữ liệu trong bộ nhớ (chẳng hạn như các biến instance hoặc class) và các đối tượng bên ngoài như các tệp, kết nối cơ sở dữ liệu và kết nối mạng.

Truy cập đồng thời có thể phát sinh trong một số trường hợp:

  • Nhiều thành phần web truy cập các đối tượng được lưu trữ trong ngữ cảnh web.

  • Nhiều thành phần web truy cập các đối tượng được lưu trữ trong một phiên.

  • Nhiều luồng trong một thành phần web truy cập vào biến cá thể. Một vùng chứa web thường tạo ra một luồng để xử lý từng yêu cầu. Nếu bạn muốn đảm bảo rằng một cá thể servlet xử lý chỉ một yêu cầu tại một thời điểm, một servlet có thể thực hiện SingleThreadModelGiao diện. Nếu một servlet thực hiện giao diện này, bạn sẽ được bảo đảm rằng không có hai luồng sẽ thực hiện đồng thời trong phương thức dịch vụ của servlet. Bộ chứa web có thể thực hiện bảo đảm này bằng cách đồng bộ hóa quyền truy cập vào một thể hiện duy nhất của servlet hoặc bằng cách duy trì một nhóm các trường hợp thành phần web và gửi mỗi yêu cầu mới tới một cá thể miễn phí. Giao diện này không ngăn được các sự cố đồng bộ hóa do các thành phần web truy cập vào các tài nguyên được chia sẻ như các biến lớp tĩnh hoặc các đối tượng bên ngoài. Ngoài ra, đặc tả Servlet 2.4 không chấp nhận giao diện SingleThreadModel .

Khi các tài nguyên có thể được truy cập đồng thời, chúng có thể được sử dụng không nhất quán. Để ngăn chặn điều này, bạn phải kiểm soát truy cập bằng cách sử dụng các kỹ thuật đồng bộ hóa được mô tả trong bài Chủ đề trong Hướng dẫn Java, Ấn bản lần thứ tư , bởi Sharon Zakhour et al. (Addison-Wesley, 2006).

Phần trước cho thấy 5 thuộc tính được chia sẻ bởi nhiều hơn một servlet: bookDB , cart , currency , hitCounter , và orderCounter . Các bookDB thuộc tính được thảo luận trong phần tiếp theo. Giỏ hàng, tiền tệ, và quầy có thể được thiết lập và đọc bởi nhiều servlet đa luồng. Để ngăn chặn các đối tượng này không được sử dụng không nhất quán, truy cập được kiểm soát bằng các phương pháp đồng bộ. Ví dụ, đây là lớp Counter , đặt tạiTut-cài đặt / javaeetutorial5 / ví dụ / web / bookstore1 / src / java / com / sun / bookstore1 / util / :

Lớp công cộng Counter {
    Truy cập cá nhân int;
    Truy cập công cộng () {
        Counter = 0;
    }
    Công khai đồng bộ int getCounter () {
        Truy cập trở lại;
    }
    Công cộng đồng bộ int setCounter (int c) {
        Truy cập = c;
        Truy cập trở lại;
    }
    Công khai int đồng bộ int () {
        Trở lại (++ truy cập);
    }
}

Truy cập cơ sở dữ liệu

Dữ liệu được chia sẻ giữa các thành phần web và liên tục giữa các lời gọi của một ứng dụng web thường được duy trì bởi cơ sở dữ liệu. Các thành phần Web sử dụng Java Persistence API để truy cập cơ sở dữ liệu quan hệ. Dữ liệu cho Hiệu sách của Duke được duy trì trong cơ sở dữ liệu và được truy cập thông qua lớp truy cập cơ sở dữ liệuTut-cài đặt / javaeetutorial5 / ví dụ / web / bookstore1 / src / java / com / sun / bookstore1 / cơ sở dữ liệu / BookDBAO . Ví dụ: ReceiptServlet thúc đẩy phương pháp BookDBAO.buyBooks để cập nhật khoảng không quảng cáo sách khi người dùng mua hàng. Các buyBooks phương pháp gọi buyBook cho mỗi cuốn sách chứa đựng trong giỏ mua hàng, như trong đoạn mã sau.

Public void buyBooks (ShoppingCart cart) throws OrderException {

    Bộ sưu tập item = cart.getItems ();
    Iterator i = item.iterator ();
    
    thử {
        Trong khi (i.hasNext ()) {
            ShoppingCartItem sci = (ShoppingCartItem) i.next ();
            Sách bd = (Sách) sci.getItem ();
            Chuỗi id = bd.getBookId ();
            Số lượng int = sci.getQuantity ();
            BuyBook (id, số lượng);
        }
    } Catch (Exception ex) {
        Ném OrderException mới ("Cam kết thất bại:" +
            Ex.getMessage ());
     }
}

Public void buyBook (Chuỗi bookId, int số lượng)
     Ném ra OrderException {

    thử {
        Sách yêu cầuBook = em.find (Book.class, bookId);
        
        If (requestedBook! = Null) {
            Int inventory = requestBook.getInventory ();
            If ((inventory - quantity)> = 0) {
                Int newInventory = hàng tồn kho - số lượng;
                RequestBook.setInventory (newInventory);
            } Else {
                Ném mới OrderException ("Không đủ"
                     + BookId + "trong kho để hoàn thành đơn đặt hàng.");
            }
        }
    } Catch (Exception ex) {
        Ném OrderException mới ("Không thể mua sách:"
             + BookId + ex.getMessage ());
    }
}

Để đảm bảo rằng toàn bộ đơn đặt hàng được xử lý, cuộc gọi mua hàng được gói trong một giao dịch. Trong đoạn mã sau đây, các cuộc gọi đến các phương thức bắt đầu và cam kết của UserTransaction đánh dấu ranh giới của giao dịch. Cuộc gọi đến phương thức rollback của UserTransaction hoàn tác các hiệu ứng của tất cả các câu lệnh trong giao dịch để bảo vệ tính toàn vẹn của dữ liệu.

thử {
    Utx.begin ();
    BookDB.buyBooks (giỏ hàng);
    Utx.commit ();
} Catch (Exception ex) {
    thử {
        Utx.rollback ();
    } Catch (ngoại lệ e) {
        System.out.println ("Hoàn nguyên không thành công:" + e.getMessage ());
    }
    System.err.println (ex.getMessage ());
    OrderCompleted = false;}
}
» Tiếp: Khởi tạo Servlet và viết các phương thức dịch vụ
« Trước: Chu kỳ sống của 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 !!!