Thứ Bảy, 29 tháng 10, 2016

SERVJSP - Buổi 5: Java Persistance API

I. Khái quát:
1. Khái niệm:  
 - Java Persistence API hay JPA là một đăc tả Java cho việc ánh xạ giữa các đối tượng Java tới cơ sở dữ liệu quan hệ sử dụng cộng nghệ phổ biến là ORM (Object Relational Mapping). JPA API cung cấp đầy đủ các công cụ cho phép người lập trình có thể tạo cơ sở dữ liệu một cách đơn giản và nhanh chóng. JPA API có thể dùng để persist một đối tượng business (POJO) vào trong cơ sở dữ liệu hoặc lấy dữ liệu từ cơ sở dữ liệu và ánh xạ ra các đối tượng business một cách đơn giản.
 - Ngày nay đa số các nhà cung cấp đều hỗ trợ cài đặt JPA cho framework persistence của họ. Vì vây, người lập trình có thể lựa chọn nhà cung cấp tốt nhất tùy thuộc yêu cầu ứng dụng của mình.
2. Tại sao nên dùng JPA:
 - JPA là một đặc tả đã được chuẩn hóa và là một thành phần trong đặc tả EJB 3.
 - Có nhiều framework ORM miễn phí hỗ trợ có thể dùng để phát triển nhiều loại ứng dụng khác nhau.
 - Ứng dụng xây dựng trên JPA mang tính di động cao.
 - Có thể sử dụng cho cả ứng dụng J2EE và J2SE.
 - Hỗ trợ cầu hình triển khai bằng annotation và xml.

3. Có 3 thành phần chính:
* Entity:
 - Là một Persistence Object – một POJO được có khả năng Persist đến Database.
 - Mô hình Entity là 1 – 1 theo nghĩa 1 Entity Class là một Table dưới Database và 1 Entity Instance là một hàng dữ liệu dưới Database.
 - Các Instance được tạo bằng từ khóa new từ các Entity Class. Tuy nhiên, nó chỉ được đồng bộ xuống Database khi các Instance này được các EntityManager quản lý.
 - Các thuộc tính trong Entity phải được truy cập thông qua các hàm get và set – bắt buộc được xây dựng trong Entity Class.
 - Một số yêu cầu khi cài đặt Entity Class:
 + Phải implements serializable.
 + Phải sử dụng @Entity.
 + Phải có một Constructor không tham số.
 + Class và các phương thức không được khai báo là final.
 + Các thuộc tính phải được khai báo khác như public và phải có đầy đủ get và set để truy cập.
 + Phải có một thuộc tính làm khóa chính với annotation @Id.

* EntityManager:
 - Làm nhiệm vụ để quản lý việc đồng bộ dữ liệu từ Entity Instance xuống Database và lấy dữ liệu từ Database đưa vào các Instance thông qua các Query.
 - Mô hình tổng quát của EntityManager:

 - Một EntityManager Instance cho phép kết nối từ bên ngoài vào Databse ở Client hay kết nối đến Database cục bộ khi ở ngay trong Server.
 - Một số phương thức của EntityManager hỗ trợ trong quá trình xây dựng ứng dụng:
 + public void persist (Object entity): Lưu trữ Entity vào Database (Insert) và đưa Entity Instance vào Persistence Context.
 + public <T> T merge (T entity): Đưa một Entity đã được quản lý từ bên ngoài Persistence Context vào lại bên trong.
 + public void remove (Object entity): Xóa một dòng dữ liệu dưới Database và đưa Entity ra khỏi Persistence Context và yêu cầu Container hủy nó đi.
 + find (Entity class, Primary Key): Tìm kiếm một Entity Instance từ bộ nhớ hay Database (đem từ Database đổ vào Instance) và đưa Entity Instance này vào Persistence Context.

* EntityManager Factory: Là đối tượng dùng để tạo ra Instance của EntityManager.
4. Tính năng:
- JPA hỗ trợ Pluggable, tức là có thể sử dụng nhiều nhà hãng cung cấp thứ ba như Hibernate hay Toplink.
- Hỗ trợ Annotation.
- Giảm bớt số lớp yêu cầu cho việc phát triển Persistence.
- Không cần phải viết các mô tả triển khai trong xml. Annotation dựa trên Metadata đã hỗ trợ trong các ứng dụng JPA.
- Đã chuẩn hóa ORM và dễ dàng phát triển hơn.
- JPA hỗ trợ truy vấn động và tĩnh.
- Nhiều IDE hỗ trợ phát triển ứng dụng JPA và có thể tự động sinh code ánh xạ từ cơ sở dữ liệu thành các Entity và ngược lại.

 
II. Serializable:
 - Serialize có nghĩa là sắp theo thứ tự. Khi ta muốn lưu một đối tượng xuống tập tin trên đĩa để lưu trữ, ta phải định ra trình tự lưu trữ của dữ liệu trong đối tượng. Khi cần tái tạo lại đối tượng từ thông tin trên tập tin đã lưu trữ, ta sẽ nạp đúng theo trình tự đã định trước đó. Đây được gọi là quá trình Serialize.
 - Nói chính xác hơn, Serialize là tiến trình biến đổi trạng thái của đối tượng theo một định dạng có thể được lưu trữ hay dịch chuyển.
 - Lớp Serializable giúp Java quản lí và ràng buộc được các đối tượng cả khi đọc và khi ghi xuống tập tin. Việc đọc và ghi các đối tượng ko phải lúc nào cũng đơn giản, có rất nhiều đối tượng bên trong bao gồm nhiều đối tượng khác. Nhưng một khi đã cài đặt giao diện Serializable. Java sẽ chịu trách nhiệm dò tìm bất cứ đối tượng nào liên quan để “túm lấy” và đẩy xuống tập tin cùng với đối tượng. Đồng thời, quá trình đọc lên cũng sẽ đảm bảo khôi phục đầy đủ các đối tượng liên quan.

  - Làm thế nào để Serialize một object? Ta cần đảm bảo rằng lớp Class của Object đó cài đặt giao diện java.io.Serializable. Đây là một giao diện trống, không có method nào cần cài đặt cả. Thông thường thuật toán Serialization sẽ thực hiện các công việc sau:
  • Ghi xuống các siêu dữ liệu (metadata) về lớp Class của đối tượng đó.
  • Ghi đệ quy các thông tin chi tiết của các lớp cha cho tới khi nó gặp class Object.
  • Sau khi hoàn tất việc ghi các siêu dữ liệu, tiến trình sẽ bắt đầu ghi các dữ liệu thật sự của các đối tượng.
 - Giả sử chúng ta đã có lớp Person.java. Bây giờ chúng ta cần chỉnh sửa một vài vần đề nữa, cụ thể đó là:
 + Đối với các lớp cần Serialize, chúng ta phải cho lớp đó implements interface java.io.Serializable.
 + Tạo 1 lớp chuyên dùng cho việc serialize đối tượng với 2 phương thức SerializeObject và DeserializeObject.












Như vậy, với lớp này chúng ta có thể dùng nó cho các lần Serialize bất kỳ đối tượng nào xuống file.

III. JPA Configuration:
 - Persistence Unit:
 + Là một tập hợp các lớp ánh xạ tới một cơ sở dữ liệu cụ thể.
 + Được định nghĩa trong một tập tin mô tả đặc biệt có tên persistence.xml.
 + Có nhóm hợp lý của các lớp thực thể, ánh xạ metadata của chúng, và các cấu hình liên quan đến một cơ sở dữ liệu.
 + Các chi tiết cấu hình trong persistence.xml được sử dụng trong khi thu thập EntityManager Instance trong chương trình trên Client.
 + Các EntityManager Instance phù hợp tiếp diễn các Entity Instance trong Database.
 - Đoạn code hiển thị các mã cho một tập tin persistence.xml phát triển như là một phần của ứng dụng doanh nghiệp.
 - Một số thuộc tính xác định trong yếu tố <persistence-unit> như sau:
 + <description>: Mô tả các đơn vị bền vững và được tùy chọn.
 + <provider>: Phải hiển thị trong môi trường J2SE hoặc khi các ứng dụng đòi hỏi một hành vi cung cấp cụ thể.
 + <transaction-type>: Thường có giá trị là JTA, RESOURCE_LOCAL.

 + <jta-data-source>/<non-jta-data-source>: Dùng để chỉ định đặt tên Java và tên thư mục Interface (JNDI) của nguồn dữ liệu. JNDI được sử dụng bởi các cung cấp bền bỉ.
 + <mapping-file>: Chứa một danh sách của một hay nhiều tập tin XML được sử dụng để ánh xạ O/R. Các tập tin ánh xạ được sử dụng để liệt kê các lớp Entity mà có sẵn trong đơn vị bền vững.
 + <properties>: Chỉ ra các thuộc tính cấu hình mà là cung cấp cụ thể cho các đơn vị bền vững. Bất kỳ thuộc tính nào không được công nhận bởi các cung cấp bền vững đã được loại bỏ.

Thứ Năm, 27 tháng 10, 2016

SERVJSP - Buổi 4: Session Tracking

Session là khái niệm quan trọng trong lập trình, nó được sử dụng để quản lý phiên làm việc như quản lý cơ chế chứng thực người dùng (đăng nhập), quản lý việc lưu nhớ thông tin,…
Cần cơ chế duy trì trạng thái của các Request từ cùng một người dùng (hoặc có nguồn gốc cùng một trình duyệt) trong một khoảng thời gian.Tuy nhiên HTTP là giao thức phi trạng thái (Stateless):
– Mỗi lần client kết nối đến Server đều mở ra một kết nối mới.
– Server không tự động duy trì trạng thái của một người dùng.
Vì vậy, có ba cơ chế khác nhau:

I. URL Rewritting:
URLs được viết lại, hoặc được mã hóa để đưa thêm các thông tin về Session.
Nó thường bao gồm một Session ID.
Session ID có thể được gửi như một tham số. VD: http://localhost:8080/URLRewritting/TestServlet?sessionid=123
Ưu điểm:
 - Làm việc được với người dùng vô danh (anonymous user).
 - Được hỗ trợ rộng rãi.
Nhược điểm:
 - Phải viết lại tất cả các URLs.
 - Chỉ làm việc với các tài liệu được tạo dynamic (động).

II. Cookie:
Là một phần thông nhỏ được gửi bởi Servlet đến 1 trình duyệt.
Được lưu bởi trình duyệt, sau đó gửi lại cho Server trong các Request về sau.
 - Một Cookie có tên, một giá trị đơn, và các thuộc tính tùy chọn.
 - Một giá trị Cookie có thể định danh duy nhất 1 Client.
Server sử dụng giá trị của Cookie để trích xuất thông tin về Session lưu trên Server.
Ưu điểm:
 - Dễ cài đặt.
 - Tùy biến linh động.
 - Được duy trì cho đến khi đóng trình duyệt.
Nhược điểm:
 - Người dùng có thể tắt Cookies để đảm bảo an ninh (Security) cho họ.
 - Không được hỗ trợ bởi tất cả các trình duyệt.

III. HttpSession:
Servlet cung cấp HttpSession Interface, cung cấp một cách để nhận diện một người sử dụng mà lướt qua nhiều hơn một yêu cầu trang, hoặc tới một Website và để lưu thông tin về người dùng đó.
Trình chứa Servlet sử dụng Interface này để tạo một Session giữa một HTTP Client và một HTTP Server. Session này tồn tại trong một khoảng thời gian đã cho, qua nhiều hơn một kết nối hoặc yêu cầu trang từ người dùng.
Bạn sẽ nhận đối tượng HttpSession bằng việc gọi phương thức public là getSession() của HttpServletRequest như sau: HttpSession session = request.getSession();

Bạn cần gọi phương thức request.getSession() trước khi bạn gửi bất kỳ nội dung tài liệu nào tới Client. Bảng dưới đây liệt kê một số phương thức quan trọng mà có sẵn với đối tượng HttpSession.
STTPhương thức và Miêu tả
1public Object getAttribute(String name)
Phương thức này trả về đối tượng được bind với name đã cho trong Session này, hoặc trả về null nếu không có đối tượng nào được bind với tên này.
2public Enumeration getAttributeNames()
Trả về một Enumeration của các đối tượng String chứa các tên của tất cả đối tượng được bind tới Session này.
3public long getCreationTime()
Trả về thời gian khi Session này được tạo, được tính toán bằng mili giây từ 1/1/1970 GMT.
4public String getId()
Phương thức này trả về một String chứa Identifier duy nhất được gán tới Session này.
5public long getLastAccessedTime()
Phương thức này trả về thời gian cuối cùng mà Client gửi một yêu cầu mà liên kết với Session này, với số mili giây từ 1/1/1970.
6public int getMaxInactiveInterval()
Phương thức này trả về khoảng thời gian tối đa, bằng giây, mà Servlet container sẽ giữ Session này được mở trong các truy cập client.
7public void invalidate()
Phương thức này vô hiệu hóa session này và không kết nối bất kỳ đối tượng nào được bind với nó.
8public boolean isNew(
Phương thức này trả về true nếu Client vẫn chưa biết về Session đó.
9public void removeAttribute(String name)
Phương thức này gỡ bỏ đối tượng được bind với tên đã cho từ session này.
10public void setAttribute(String name, Object value)
Phương thức này bind một đối tượng tới Session này, bởi sử dụng tên đã cung cấp.
11public void setMaxInactiveInterval(int interval)
Phương thức này xác định thời gian, bằng giây, giữa các yêu cầu từ Client trước khi Servlet container sẽ vô hiệu hóa session này.

Thứ Tư, 26 tháng 10, 2016

SERVJSP - Number of Page view using Session

Tạo Project mới. Chọn Java Web => Web Application rồi đặt tên cho nó.
* index.html:

* PageServlet.java:
* Output:
 - Sau khi bấm phím F5 xong sẽ thấy:

Thứ Bảy, 22 tháng 10, 2016

SERVJSP - Buổi 2: Gia phả và Vòng đời của Servlet

I. Gia phả:
 - Gói javax.servlet chứa một lớp trừu tượng tên là GenericServlet.
 - Các GenericServlet kế thừa từ lớp Object và giúp thiết kế một giao thức servlet độc lập.
 - Các GenericServlet thực hiện ba giao diện:

 + Servlet: Nó định nghĩa các phương pháp vòng đời cho một Servlet.
 + ServletConfig: Nó định nghĩa các phương pháp được sử dụng bởi trình chứa Servlet để chuyển thông tin đến một trường hợp Servlet trong quá trình khởi của nó.
 + Serializable: Nó được định nghĩa trong gói java.io để tuần tự các trạng thái của một đối tượng.
 - Các đoạn mã cho thấy làm thế nào để tạo ra một servlet đăng nhập giao thức độc lập:

 - Trong đoạn code cho trước, lớp có tên LoginServlet một servlet chung.
 - Để phát triển một servlet chỉ được truy cập thông qua một trình duyệt web, người dùng có thể tạo ra một Servlet HTTP bằng cách mở rộng HttpServlet lớp.
 - Lớp HTTPServlet là một lớp con của GenericServlet và cho phép tạo ra một Servlet dựa trên HTTP như là một phần của một ứng dụng Web.

 - Các đoạn mã cho thấy sự sáng tạo của servlet đăng nhập để được truy cập trên trang web:

 - Trong đoạn mã nhất định, LoginServlet được định nghĩa là HTTP servlet, vì vậy nó sẽ được truy cập thông qua giao thức HTTP.


II. Vòng đời:


 - Có thể được định nghĩa như là một tiến trình đầy đủ từ khi được tạo ra đến khi bị hủy. Một Servlet theo các giai đoạn sau:
 + 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.

 - Trong sơ đồ này, miêu tả các giai đoạn trong vòng đời của một Servlet đặc trưng:
 + Đầu tiên, các HTTP Request tới Server và được đưa tới Container của Servlet.
 + Container Servlet tải các servlet trước khi gọi phương thức service().
 + Sau đó Container Servlet xử lý nhiều yêu cầu bởi việc tạo nhiều thread, mỗi thread thực thi phương thức service() cho một đối tượng servlet đơn.



1. init():

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. Vì thế, nó được sử dụng cho các khởi tạo one-time, giống như phương thức init của Applet.
Thường thì, Servlet được tạo khi một người dùng lần đầu triệu hồi một URL tương ứng với Servlet đó, nhưng bạn cũng có thể xác định rằng Servlet này được tải khi Server được khởi động lần đầu.
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 đó.
public void init() throws ServletException {
}

2. service():
Phương thức service() là phương thức chính để thực hiện tác vụ thực sự. Nơi chứa servlet (ví dụ như Web Server) gọi phương thức service() để xử lý các yêu cầu từ Client (hoặc trình duyệt) 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, DELETE,...) và gọi các phương thức doGet, doPost, doPut, doDelete,... tương ứng một cách thích hợp.
public void service(ServletRequest request, ServletResponse response) 
      throws ServletException, IOException {
}

3. destroy():
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.
Sau khi phương thức destroy() được gọi, đối tượng servlet này được đánh dấu cho Garbage Collector.
public void destroy() {
}