Chủ Nhật, 2 tháng 10, 2016

Java Servlet

Java Servlet: là các chương trình chạy trên một Web server hoặc một Application server và thực hiện như là một tầng trung gian giữa một Yêu cầu từ một trình duyệt web hoặc HTTP client với các Database hoặc các ứng dụng trên HTTP server. Ta có thể thu thập Input từ người sử dụng thông qua các form trên trang web, hiển thị các bản ghi (record) từ một Database hoặc từ nguồn khác, và tạo các trang web động.

***LifeCycle

- LifeCycle của Servle có 4 giai đoạn:

Servlet được khởi tạo bởi gọi phương thức init().

Servlet gọi phương thức service() để xử lý một yêu cầu từ Client.

Servlet bị hủy bởi triệu hồi phương thức destroy().

Cuối cùng, servlet trở thành rác và được thu thập bởi Garbage Collector của JVM.


-Initialization: Phương thức được thiết kế để chỉ được gọi một lần. Nó được gọi khi Servlet lần đầu được tạo, và không được gọi lại cho mỗi yêu cầu của người dùng. Khi một người sử dụng triệu hồi một Servlet, một đối tượng đơn của Servlet được tạo, với mỗi yêu cầu từ người dùng, là kết quả trong một thread mới, mà được thao tác tới doGet hoặc doPost một cách thích hợp. Phương thức init() tạo hoặc tải một vài dữ liệu mà sẽ được sử dụng qua vòng đời của Servlet đó. 

-Service: service() là phương thức chính để thực hiện tác vụ thực sự. Nơi chứa servlet như Web Server gọi phương thức service() để xử lý các yêu cầu từ Client và viết phản hồi đã được định dạng trở lại Client đó. Mỗi khi Server nhận một yêu cầu cho một Servlet, thì Server tạo một Thread mới và triệu hồi service(). Phương thức service() kiểm tra kiểu yêu cầu HTTP (Kiểu GET, POST, PUT, DELET, .v.v.) và gọi các phương thức doGet, doPost, doPut, doDelete .v.v. tương ứng một cách thích hợp. 

-Destruction: Phương thức destroy() chỉ được gọi một lần ở giai đoạn cuối trong vòng đời Servlet. Phương thức này giúp servlet của bạn một cơ hội để đóng các kết nối tới Database, dừng thread, viết các danh sách cookie hoặc viết tính toán trên đĩa, và thực hiện các hoạt động cleanup khác.

***Servlet Context and Configuration

Servlet Context được dùng để duy trì trạng thái của ứng dụng web. Trên máy ảo Java chỉ tồn tại duy nhất một file context. Servlet Context nó biểu diễn một nhóm các tài nguyên được dùng chung giữa các servlet. Ví dụ như thống kê số lượt truy cập trang web.

Các phương thức thường dùng của Servlet Context: 

getInitParameter(): method này chấp nhận tên tham số khởi tạo và trả về giá trị tham số khởi tạo.

+ getInitParameterNames(): method này sẽ trả về giá trị tham số (int) với tên được chỉ định và trả về null nếu tên không tồn tại.

+ getServletContext(): method này trả về context khi servlet được thực hiện.

+ getServletName(): method này trả về tên của servlet.

***Request and Response Methods

-Request Methods: 

+ Khi một trình duyệt yêu cầu một trang web, nó gửi nhiều thông tin tới Web Server, mà không thể được đọc một cách trực tiếp bởi vì thông tin này chuyển động như là một phần của Header trong HTTP Request.

+ Các method implemented truy cập interface theo những thông tin sau:

Các thông số của ServletRequest  là phương tiện giao tiếp giữa client và các máy chủ.

Đối tượng thuộc tính có giá trị được sử dụng để giao tiếp giữa container và servlet hoặc giữa các thành phần khác nhau của ứng dụng.

# Thông tin liên quan đến các giao thức được sử dụng để gửi yêu cầu đến servlet.

+ Các method được sử dụng cùng với servlet requests để lấy dữ liệu liên quan đến các servlet requests sau:

getContextPath():trả về đường dẫn context từ yêu cầu.

getServletPath(): trả về vị trí của các servlet liên quan đến context của dứng dụng.

pathinfo(): method này đem lại thêm thông tin về các servlet mà không phải là một phần của đường dẫn context cũng không phải là  servlet path.

# getParamter MethodGiao diện ServletRequest cung cấp phương thức getParameter để lấy các thông số yêu cầu trên servlet. thông số yêu cầu là thông tin thêm gửi với yêu cầu. Method này trả về giá trị của một tham số yêu cầu như là một String hoặc null nếu tham số không tồn tại.
Trong trường hợp của HTTP servlet, các thông số được quy định trong chuỗi truy vấn hoặc gửi dữ liệu mẫu. Method này nên được sử dụng khi các thông số chỉ có một giá trị. Nếu tham số là đối tượng chịu có nhiều hơn một giá trị, sử dụng getParameterValues (java.lang.String).

# requestDispacther: RequestDispacter nhận được yêu cầu từ client và chuyển tiếp đến bất kỳ tài nguyên (chẳng hạn như một servlet, tập tin HTML hoặc tập tin JSP) trên máy chủ. Các đối tượng RequestDispatcher được tạo ra bởi các container servlet. Nó hoạt động như một bức tường bao bọc xung quanh một nguồn tài nguyên máy chủ đặt tại một con đường cụ thể hoặc do một tên cụ thể.

-Response: 

+ khi một Web Server phản hồi một HTTP Request tới trình duyệt, phản hồi đặc trưng bao gồm một dòng Status, một số trường Header, một dòng trống, và tài liệu.

+ Sau đây là các bước liên quan trong việc tạo ra các đáp ứng với các yêu cầu của Client :


Các dữ liệu cho client có thể được gửi qua một dòng đầu ra. Các dòng dữ liệu có thể là một dòng PrintWriter cho data character và sự đáp ứng đa phương tiện đầu ra được gửi trong  Multimedia Internet Mail Extensions (MIME) trên một đối tượng ServletOutputStream.

Trong nội dung đa phương tiện, có thể có các loại nội dung khác nhau như text, html, pdf, và như vậy có thể được bao gồm trong response.. Các method trong giao diện ServletResponse được sử dụng để chỉ các loại nội dung của response.

# Sự đáp ứng được yêu cầu của máy chủ cũng có thể yêu cầu một số buffer được phân bổ vào receiving end , that is, the client. Có nhiều phương pháp có thể được sử dụng để truyền đạt các yêu cầu của buffer ở client end.

# Trong trường hợp HTTP responses, status code  cũng được bao gồm trong các responses.Trong trường hợp không tạo ra response, một  response status code sẽ được gửi cho client.

# Phiên bản HTTP cũng có thể yêu cầu cookie được đặt trên phía client-side. Những cookie này có các thông tin session sẽ được gửi đến các client từ các máy chủ. 

***Filtering Requests and Responses

Servlet Filter là các lớp trong Java có thể được sử dụng trong lập trình Servlet cho các mục đích sau:

Để chặn các yêu cầu từ một Client trước khi chúng truy cập một nguồn tại backend.

Để thao tác các phản hồi từ Server trước khi chúng được gửi trở lại tới Client.

Các Filter được triển khai trong web.xml file và sau đó map tới hoặc các tên Servlet hoặc các URL pattern.

Một Filter là một lớp Java mà triển khai javax.servlet.Filter Interface. Interface này định nghĩa 3 phương thức:

public void doFilter (ServletRequest, ServletResponse, FilterChain): Phương thức này được gọi bởi container mỗi khi một cặp request/response được truyền thông qua chain.

public void init(FilterConfig filterConfig): Phương thức này được triệu hồi bởi Web container để chỉ một Filter mà đang được đặt bên trong service

public void destroy(): Phương thức được gọi bởi Web container để chỉ một Filter bị hủy khỏi service

Ứng dụng web của bạn có thể định nghĩa một vài Filter cho một mục đích nào đó. Giả sử bạn định nghĩa hai Filter là AuthenFilter và LogFilter. Phần còn lại của tiến trình sẽ giống như ví dụ trên, ngoại trừ việc bạn cần tạo một ánh xạ khác.

Bậc của Filter trong web.xml quyết định thứ tự mà Web container áp dụng Filter tới các Servlet. Để đảo ngược thứ tự của Filter, bạn chỉ cần đảo ngược các phần tử ánh xạ Filter trong web.xml. VD: 

<filter-mapping>
  <filter-name>AuthenFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

<filter-mapping>
 <filter-name>LogFilter</filter-name>
 <url-pattern>/*</url-pattern>
</filter-mapping>


***Session Tracking

- HTTP là một giao thức Stateless, nghĩa là mỗi khi một Client thu nhận một trang Web, thì Client mở một kết nối riêng rẽ tới Web Server và Server tự động không giữ bất kỳ bản ghi nào của các yêu cầu trước đó từ Client.

- Có 3 cách để duy trì session giữa Web Client và Web Server:

+ Sử dụng Cookie: Một Webserver có thể gán một Session ID duy nhất như là một cookie tới mỗi Web Client và với các yêu cầu liên tục từ Client, chúng có thể được chấp nhận bởi sử dụng cookie đã nhận được.

+ Sử dụng các trường Hidden form: (phần này em đọc không hiểu nên bỏ trống).

+ Viết lại URL: Viết lại URL là cách tốt hơn để duy trì các session và làm việc cho các trình duyệt khi chúng không hỗ trợ các Cookie, nhưng hạn chế ở đây là ta sẽ tạo mỗi URL động để gán cho một Session ID bởi vì trang là trang HTML tĩnh.

Xóa Session Data trong Servlet: 

Gỡ bỏ một thuộc tính cụ thể: Ta có thể gọi phương thức public void removeAttribute(Stringname) để xóa value mà liên kết với một key cụ thể.

Xóa toàn bộ Session: Ta có thể gọi phương thức public void invalidate() để loại bỏ toàn bộ Session.

Thiết lập timeout cho Session: Bạn có thể gọi phương thức public void setMaxInactiveInterval(int interval) để thiết lập timeout cho từng Session.

Log out người sử dụng: Với các Server mà hỗ trợ Servlet 2.4, bạn có thể gọilogout để loại Client ra khỏi Web Server và vô hiệu hóa toàn bộ Session đó.

Cấu hình web.xml: Nếu bạn đang sử dụng Tomcat, ngoài các phương thức trên, bạn có thể định cấu hình timeout của Session trong web.xml file như sau:
<session-config>
    <session-timeout>15</session-timeout>
</session-config>
Timeout được biểu diễn bằng phút, và ghi đè timeout mặc định là 30 phút trong Tomcat.Phương thức getMaxInactiveInterval() trong một Servlet trả về quãng thời gian timeout cho session đó bằng giây. Vì thế neeys Session của bạn được định cấu hình là 15 phút trong web.xml, thì getMaxInactiveInterval() trả về 900.

***Asynchronous Processing

- Trong khi thực hiện các servlet và các filter trong một ứng dụng, nếu việc thực thi bị blocking state, sau đó thực hiện các thread được giao cho một asynchronous context. Sau đấy thread được trả về mà không tạo ra các  response  với thread. Asynchronous context hoàn thành các hoạt động ngăn chặn và tạo ra những response to the context. Nếu  response  asynchronous không thể hoàn thành yêu cầu, sau đó các thread được giao cho servlet khác. xử lý asynchronous trong các phương thức dịch vụ được thực hiện thông qua các chức năng được cung cấp bởi các giao diện javax.servlet.AsyncContext.  startAsyncContext () method được gọi để tạo ra một asynchronous context.

- Sau đây là một số method được cung cấp bởi lớp AsyncContext:

+ void start(Runnable r): Nhờ method này, container cung cấp một thread mới
thực hiện các hoạt động đó là ngăn chặn các servlet ứng dụng được gỡ bỏ từ container.

+ getRequest(): Nó trả về một đối tượng ServletRequest để trả lại yêu cầu đó đã bắt đầu quá trình thiết lập một Asynchronous context.

+ getResponse(): Method này trả về một đối tượng ServletResponse. Nó có thể được sử dụng để tạo ra các respond đáp ứng với yêu cầu servlet từ Asynchronous context.

+ complete(): Nó hoàn thành các asynchronous và trả về respond cho client đã yêu cầu khởi động nó.

+ dispatch(): Nó chấp nhận đường dẫn gửi đi như một tham số và dispatches the requests và responses of asynchronous context.



***Non-blocking I/O 

- Để cải thiện hiệu suất của các ứng dụng Java EE, non-blocking I / O được sử dụng để xử lý yêu cầu và trả lời. Sau các bước tóm tắt việc thực hiện các non-blocking I / O cho các yêu cầu xử lý và trả lời bằng văn bản:

+ Bắt đầu một chế độ không đồng bộ cho các yêu cầu / đáp ứng

+ Đối với các yêu cầu hoặc đáp ứng các đối tượng trong các phương thức dịch vụ, có được tương ứng với đầu vào / đầu ra.

+ Gán cho người nghe đến các input and output streams, một người biết lắng nghe đọc đến dòng đầu vào và một viết nghe để dòng đầu ra.

Xử lý các yêu cầu và phản hồi trong method  nghe gọi lại.

- Sau đây là các method được cung cấp bởi các javax.servlet.ServletInputStream cho non-blocking I / O:

+ void setReadListener(ReadListener r1): gán một đối tượng người nghe đến stream input, trong đó có các method callback mà không đồng bộ đọc dữ liệu từ các input stream.

+ isReady(): trả về một giá trị boolean chỉ ra rằng dữ liệu có thể được đọc mà không bị chặn.

+ isComplete() :trả về một giá trị boolean để chỉ hoàn thành vào đọc tất cả các dữ liệu trong stream


- Các method được cung cấp bởi javax.servlet.Server OutputStream cho non-blocking I / O:

+ void setWriteListener(WriteListener w): gán một đối tượng người nghe đến stream output mà có các method callback không đồng bộ ghi dữ liệu vào stream output.

+ isReady(): Trả về cho dù các hoạt động viết có thể được hoàn thành mà không  bị chặn.

***Tổng kết

Servlet được sử dụng để thay thế cho những công nghệ Web động. Việc sử dụng Servlet mang lại những lợi thế:

  • Dễ di chuyển. Servlet được viết bằng Java nên nó có tính di động cao, thực hiện được trên nhiều hệ điều hành, trên các Web Server khác nhau. Khái niệm “Viết một lần, chạy ở mọi nơi” cũng rất đúng với Servlet.
  • Mạnh mẽ. Servlet hỗ trợ rất hiệu quả cho việc sử dụng các giao diện lõi API như lập trình mạng, xử lý đa luồng, xử lý ảnh, nén dữ liệu, kết nối các CSDL, bảo mật, xử lý phân tán và triệu gọi từ xa RMI, CORBA, v.v. Nó cũng thích hợp để trao đổi tin, truyền thông giữa Client và Server một cách bình thường.
  • Hiệu quả. Servlet có tính hiệu quả cao. Một khi được tải về, nó sẽ được lưu lại trong bộ nhớ của máy chủ. Servlet duy trì các trạng thái của nó, do vậy những tài nguyên ngoại như việc kết nối với CSDL cũng sẽ được lưu giữ lại.
  • An toàn. Bởi vì Servlet được viết bằng Java nên nó kế thừa được tính an toàn của Java. Cơ chế tự động dọn rác và việc không sử dụng con trỏ của Java giúp cho Servlet thoát khỏi nhiều công việc quản lý bộ nhớ. Đồng thời nó xử lý các lỗi rất an toàn theo cơ chế xử lý ngoại lệ của Java.
  • Tính tích hợp. Các Servlet được tích hợp với các Server. Chúng cộng tác với các Server tốt hơn các chương trình CGI.
  • Tính linh hoạt. Các Servlet hoàn toàn mềm dẻo. Một HTTP Servlet được sử dụng để tạo ra một trang Web, sau đó ta có thể sử dụng thẻ <Servlet> để đưa nó vào trang Web tĩnh, hoặc sử dụng với các Servlet khác để lọc ra các nội dung cần thiết.

Không có nhận xét nào:

Đăng nhận xét