Label

Thứ Năm, 7 tháng 4, 2011

Giới thiệu về JSP và Servlet (phần 5)

Tất cả các servlet thuộc về một ngữ cảnh (context) servlet. Trong phiên bản 1.0 và 2.0 của Servlet API, tất cả các servlet trên một host thuộc về một context, nhưng với phiên bản 2.1 của API, context trở nên hữu dụng hơn và có thể được xem như xuất phát điểm của một khái niệm Ứng dụng. Các phiên bản tương lai của API sẽ làm cho điều này thậm chí trở nên rõ ràng hơn.
Các thuộc tính ServletContext
Tất cả các servlet thuộc về một ngữ cảnh (context) servlet. Trong phiên bản 1.0 và 2.0 của Servlet API, tất cả các servlet trên một host thuộc về một context, nhưng với phiên bản 2.1 của API, context trở nên hữu dụng hơn và có thể được xem như xuất phát điểm của một khái niệm Ứng dụng. Các phiên bản tương lai của API sẽ làm cho điều này thậm chí trở nên rõ ràng hơn.
Nhiều servlet engine bổ sung Servlet API 2.1 giúp cho bạn nhóm một tập các servlet vào trong một context và hỗ trợ nhiều context trong cùng một host. ServletContext trong API 2.1 có thể phụ thuộc vào trạng thái của các servlet của nó và sự phân biệt các tài nguyên (resource) và thuộc tính (attribute) có sẵn cho các servlet trong context. Ở đây, chúng ta sẽ chỉ xem xét các attribute của ServletContext có thể được dùng để chia sẻ thông tin giữa một nhóm các servlet như thế nào.
Có ba phương thức ServletContext tương ứng với các attribute: getAttribute, setAttribute và removeAttribute. Thêm vào đó, servlet engine có thể cung cấp nhiều cách để cấu hình servlet context với các giá trị attribute khởi tạo. Việc quản lý này giống như một sự chấp nhận thêm vào các đối số khởi tạo servlet cho việc cấu hình thông tin sử dụng bởi một nhóm các servlet, cho thực thể của định danh database mà chúng ta đã đề cập ở phần trước, một bảng kiểu (style sheet) URL cho một ứng dụng, tên của một mail server …
Một server nhận một tham chiếu đến đối tượng ServletContext của nó thông qua đối tượng ServletConfig. HttpServlet thật sự cung cấp một phương thức thuận lợi (thông qua siêu lớp của nó GenericServlet) mang tên getServletContext làm cho nó thật sự dễ dàng


ServletContext context = getServletContext();
String styleSheet = context.getParameter(“stylesheet”);
If(styleSheet != null) {
//Xác định một style sheet mới cho ứng dụng
Context.setAttribute(“stylesheet”, styleSheet);
}


Đoạn mã ở trên có thể là một phần của một ứng dụng cấu hình servlet, xử lý request từ một HTML FORM có một style sheet xác định cho ứng dụng. Tất cả các servlet trong ứng dụng tạo ra HTML có thể sử dụng attribute style sheet như sau:


ServletContext context = getServletContext();
String styleSheet = context.getAttribute(“stylesheet”);
out.println(“”);
out.println(“”);


Các thuộc tính và tài nguyên yêu cầu (Request attributes and resources)
Phiên bản 2.1 của API thêm vào hai kỹ thuật để chia sẽ dữ liệu giữa các servlet: request attibute và resource.
Các phương thức getAttribute, getAttributeNames và setAttribute được thêm vào cho lớp HttpServletRequest (hoặc chính xác hơn là cho siêu lớp ServletRequest). Chúng được xác định để sử dụng với RequestDispatcher, một đối tượng được sử dụng để chuyển tiếp (forward) một request từ một servlet này đến một servlet khác và để chứa một luồng xuất từ một servlet trong luồng xuất từ servlet chính.
Các phương thức getResourcev và getResourceAsStream của lớp ServletContext cho phép bạn truy cập đến những tài nguyên bên ngoài, chẳng hạn như một file cấu hình ứng dụng. Bạn có thể đã thân thuộc với những phương thức chia sẻ cùng một tên giống như những phương thức trong lớp ClassLoader. Tuy nhiên, những phương thức của lớp ServletContext có thể cung cấp cách truy cập đến những tài nguyên không thật sự là file. Một tài nguyên có thể được lưu trữ trong một database, có sẵn thông qua một LDAP server, trong trường hợp này tài nguyên là mọi thứ mà servlet engine quyết định hỗ trợ.
Servlet engine cung cấp một lựa chọn cấu hình context để bạn xác định được gốc của cơ sở tài nguyên, đó là một đường dẫn thư mục, một HTTP URL, một JDBC URL …
Các ví dụ về cách sử dụng những phương thức có thể là một chủ đề trong một article tương lai. Cho đến sau khi bạn có thể đọc chúng trong Servlet 2.1

2 nhận xét:

  1. Như bạn đã thấy ở phần trước, các request song song được một servlet xử lý bằng cách chia nhỏ thành các thread để thực thi tương ứng với phương thức xử lý request (ví dụ doGet hoặc doPost). Điều này vì thế trở nên quan trọng bởi vì những phương thức này là những thread an toàn.
    Đa tuyến (Multithreading)
    Như bạn đã thấy ở phần trước, các request song song được một servlet xử lý bằng cách chia nhỏ thành các thread để thực thi tương ứng với phương thức xử lý request (ví dụ doGet hoặc doPost). Điều này vì thế trở nên quan trọng bởi vì những phương thức này là những thread an toàn.
    Cách dễ dàng nhất để chắc chắn rằng đoạn mã an toàn là tránh kết thúc các biến thực thể (instance variable) và thay vào đó hãy đặt toàn bộ thông tin cần thiết vào một phương thức như những tham số. Ví dụ:

    private String someParam;
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    someParam = request.getParameter(“someParam”);
    processParam();
    }

    private void processParam() {
    // Xử lý với someParam
    }

    là không an toàn. Nếu phương thức doGet thực thi hai phương thức. Điều này có nghĩa là giá trị của instance variable someParam sẽ được đặt vào thread thứ hai trong khi thread đầu tiên vẫn còn sử dụng nó.
    Chuyển sang một thread an toàn như sau:

    private String someParam;
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    someParam = request.getParameter(“someParam”);
    processParam(someParam);
    }

    private void processParam(String someParam) {
    //Xử lý với someParam
    }

    Ở đây, phương thức processParam nhận vào tất cả dữ liệu nó cần như những tham số thay vì phải phụ thuộc vào các instance variable.
    Một lý do khác để tránh instance variable, đó là trong một hệ thống đa server (multi-server), có thể có một instance cho servlet cho mỗi server và các request cho cùng servlet có thể được phân chia giữa các server. Việc giữ các thông tin được phân chia trong các instance variable trong trường hợp không làm việc với tất cả, trong trường hợp này thay vì sử dụng đối tượng HttpSession, các attribute ServletContext hoặc một dữ liệu lưu trữ bên ngoài là một database hoặc một dịch vụ RMI/CORBA để sửa chữa trạng thái ứng dụng. Thậm chí nếu bạn bắt đầu với một hệ thống đơn server (single-server), đó vẫn là một ý tốt để viết các servlet của bạn vì chúng có thể được phát triển thành một hệ thống multi-server lớn hơn.

    Kết thúc
    Article này chỉ mô tả ngắn gọn về Servlet API và tất cả những điều mà bạn có thể làm với servlet. Bạn có thể học được nhiều hơn bằng việc đọc những cuốn sách hoặc viếng thăm những trang web về Servlet.

    Trả lờiXóa
  2. http://blackdiamond89.wordpress.com/2009/09/06/gi%E1%BB%9Bi-thi%E1%BB%87u-v%E1%BB%81-jsp-va-servlet-ph%E1%BA%A7n-6/

    Trả lờiXóa