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

JPA Configuration, Persistence API and Serializable

I. JAVA PERSISTENCE API

1. Khái niệm:

- Java Persistence Architect API (JPA) là một kỹ thuật của Java dùng để truy xuất, quản lý và duy trì dữ liệu giữa các đối tượng/các lớp của Java và CSDL. JPA được định nghĩa như một phần trong đặc tả kỹ thuật của EJB 3.0.JPA được xem như là cách tiếp tiêu chuẩn cho các mô hình quan hệ đối tượng (Object to Relational Mapping – ORM) trong Java.

- Bản thân JPA chỉ là một đặc điểm kỹ thuật chứ không phải là một sản phẩm. Do đó JPA tự mình không thể thực thi các thao tác liên quan đến CSDL. JPA là tập hợp nhiều interface nên cần phải có các class triển khai, các class này được triển khai từ CSDL. Chính vì vậy JPA luôn đòi hỏi phải có một CSDL để ánh xạ tạo ra các class.

2. Thành phần trong JPA:

- Persistence: 
+  Giá trị duy nhất được sử dụng bởi các container để map đối tượng entity tới các bản ghi tương ứng. Bạn có thể lưu các dữ liệu trong một tập tin mã hóa và giải mã thuật toán riêng của bạn.


- EntityManager:  

+ EntityManager là một giao diện (interface) cung cấp các API cho việc tương tác với các Entity. 

Một số chức năng cơ bản của EntityManager như: 

Persist: phương thức này dùng để lưu một thực thể mới tạo vào cơ sở dữ liệu

Merge: dùng để cập nhật trạng thái của entity vào cơ sở dữ liệu.

Remove: xóa một thể hiện của entity.

- Persistence Unit: 

+ Mỗi Persistence Unit định nghĩa 1 hoặc nhiều thực thể quản lý mà các EntityManager của 1 ứng dụng có thể quản lý.

+ Cấu hình Persistence Unit được định nghĩa ra file persistence.xml.

Mỗi Persistence Unit cung cấp 1 tập hợp các thuộc tính cho việc cấu hình Data Source. Cùng với tất cả các chi tiết kết nối cần thiết, các Persistence Unit cũng chỉ rõ các nhà cung cấp JPA.


- Persistence Context:

Một Persistence Context là một tập hợp các Entity được quản lý bởi EntityManager . Persistence Context đánh dấu sự thay đổi của các Entity đó. Entity Manager hỗ trợ Persistence Context để commit hoặc undo những thay đổi. Ngay khi một EntityManager Object được tạo ra ,  nó ngầm được liên kết với một Persistence Context để phục vụ cho việc quản lý tập các Entity. 

Một Persistence Context sẽ được định nghĩa một giới hạn mà ở đó các đối tượng Entity sẽ được tạo ra, lưu trữ hoặc hủy bỏ.

                          Mối quan hệ giữa Persistence Contex và Persistence Unit


- Một số thuộc tính được định nghĩa trong  <persistence-unit>yếu tố như sau:

 <description>: mô tả các persistence unit và là tùy chọn.

 <provider>: phải có mặt trong môi trường J2SE hoặc khi các ứng dụng yêu cầu một hành động dịch vụ cụ thể.

<transaction-type>:  có giá trị hoặc như Java Transaction API (JTA) hoặc RESOURCE_LOCAL hoặc theo mặc định, giá trị là JTA.

 <JTA-data-source> / <không JTA-data-source>: dùng để chỉ định Java Naming và Directory Interface (JNDI) của nguồn dữ liệu. JNDI được sử dụng bởi các persistence

<mapping-file>: có chứa một danh sách của một hay nhiều file XML được sử dụng để mapping O/R. Các tập tin map được sử dụng để liệt kê các lớp entity mà có sẵn trong persistence unit

<properties>: quy định các thuộc tính cấu hình mà là nhà cung cấp cụ thể cho các persistence unit. Bất kỳ thuộc tính không được công nhận bằng cách các persistence provider đã được bỏ qua.


3. Tính năng, vai trò của JPA:

- Các tính năng JPA:

+ 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.

- Vai trò và lợi ích đem lại của JPA:

+ Việc giới thiệu JPA vào trong đặc tả J2EE 5 là một bước tiến lớn trong việc đơn giản hóa các quy trình phát triển ứng dụng. JPA đơn giản hóa mô hình thực thể dữ liệu và cộng thểm một số tính năng mới mà phiên bản EJB trước (EJB 2.0) không có. Giờ đây người lập trình có thể ánh xạ trực tiếp các đối tượng persistence với cơ sở dữ liệu quan hệ. JPA có thể sử dụng bên ngoài container, điều này không dễ thực hiện trong EJB 2.1. Bạn cũng có thể sử dụng JPA trong các ứng dụng swing.

+ 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.

+ Độc lập về DB,không phải làm việc với SQL.



II.Serializable

1.Khái niệm
Java cung cấp một kỹ thuật, được gọi là serialization, tại đây một đối tượng có thể được biểu diễn như là một dãy byte liên tục mà bao gồm dữ liệu của đối tượng cũng như thông tin về kiểu đối tượng và kiểu dữ liệu được lưu giữ trong đối tượng.
- Sau khi một đối tượng được serialize đã được ghi vào trong một file, nó có thể được đọc từ file này và được deserialize từ đó, đó là thông tin kiểu và các byte mà biểu diễn đối tượng và dữ liệu của nó có thể được sử dụng để tái tạo đối tượng này trong bộ nhớ.
- Toàn bộ tiến trình là JVM độc lập, nghĩa là một đối tượng có thể được xếp thứ tự (serialize) trên một platform và deserialize trên một platform hoàn toàn khác.
Các lớp ObjectInputStream và ObjectOutputStream trong Java là các luồng bậc cao mà chứa các phương thức để serialize và deserialize một đối tượng.
Lớp ObjectOutputStream chứa nhiều phương thức write để ghi các kiểu dữ liệu đa dạng, nhưng với một phương thức trong đầu ra chuẩn cụ thể:
public final void writeObject(Object x) throws IOException
- Phương thức trên xếp thứ tự một Object theo thứ tự và gửi nó tới đầu ra chuẩn. Tương tự, lớp ObjectInputStream chứa phương thức sau để deserialize một đối tượng:
public final Object readObject() throws IOException, 
                                 ClassNotFoundException
- Phương thức này thu nhận Object tiếp theo ra khỏi luồng và deserialize nó. Giá trị trả về là Object, vì thế bạn sẽ cần ép nó thành kiểu dữ liệu thích hợp.
- Để minh họa cách serialization làm việc trong Java, tôi sử dụng lớp Employee mà đã bàn luận trong các chương trước. Giả sử rằng chúng ta có lớp Employee sau, mà triển khai Serializable Interface:
public class Employee implements java.io.Serializable
{
   public String name;
   public String address;
   public transient int SSN;
   public int number;
   public void mailCheck()
   {
      System.out.println("Gui mail toi " + name
                           + " " + address);
   }
}
- Ghi chú rằng, với một lớp để được xếp thứ tự theo thứ tự một cách thành công, phải có hai điều kiện sau:
 + Lớp phải triển khai java.io.Serializable interface
 + Tất cả các trường trong lớp phải là có thể xếp thứ tự (Serializable). Nếu một trường là không thể xếp thứ tự, nó phải được đánh dấu.
- Lớp ObjectOutputStream được sử dụng để xếp thứ tự một Object. Chương trình SerializeDemo sau khởi tạo một đối tượng Employee và xếp thứ tự nó vào trong một file.
- Khi chương trình thực thi, một file với tên employee.ser được tạo. Chương trình không tạo bất kỳ đầu ra nào, nhưng bạn xem xét code và cố gắng xác định xem chương trình đang làm cái gì.
Chú ý: Khi xếp thứ tự một đối tượng vào một file, qui ước chuẩn trong Java là cung cấp một file có đuôi là .ser .
import java.io.*;

public class SerializeDemo
{
   public static void main(String [] args)
   {
      Employee e = new Employee();
      e.name = "Reyan Ali";
      e.address = "Phokka Kuan, Ambehta Peer";
      e.SSN = 11122333;
      e.number = 101;
      try
      {
         FileOutputStream fileOut =
         new FileOutputStream("/tmp/employee.ser");
         ObjectOutputStream out = new ObjectOutputStream(fileOut);
         out.writeObject(e);
         out.close();
         fileOut.close();
         System.out.printf("Du lieu da duoc serialize duoc luu giu trong /tmp/employee.ser");
      }catch(IOException i)
      {
          i.printStackTrace();
      }
   }
}

* Deserialize một Object trong Java

Chương trình DeserializeDemo sau sẽ deserialize đối tượng Employee được tạo trong chương trình SerializeDemo. Bạn xem xét chương trình này và xác định đầu ra của nó:
import java.io.*;
public class DeserializeDemo
{
   public static void main(String [] args)
   {
      Employee e = null;
      try
      {
         FileInputStream fileIn = new FileInputStream("/tmp/employee.ser");
         ObjectInputStream in = new ObjectInputStream(fileIn);
         e = (Employee) in.readObject();
         in.close();
         fileIn.close();
      }catch(IOException i)
      {
         i.printStackTrace();
         return;
      }catch(ClassNotFoundException c)
      {
         System.out.println("Khong tim thay lop Employee");
         c.printStackTrace();
         return;
      }
      System.out.println("Deserialized Employee...");
      System.out.println("Name: " + e.name);
      System.out.println("Address: " + e.address);
      System.out.println("SSN: " + e.SSN);
      System.out.println("Number: " + e.number);
    }
}

2.Vai trò

Một hệ thống Enterprise điển hình thường có các thành phần nằm phân tán rải rác trên các hệ thống và mạng khác nhau. Trong Java mọi thứ đều được miêu tả như là một object. Nếu 2 thành phần Java cần liên lạc với nhau, ta cần phải có một cơ chế để chúng trao đổi dữ liệu. Serialization được định nghĩa cho mục đích này, và các thành phần Java sẽ sử dụng giao thức (protocol) này để truyền các object qua lại với nhau.

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

Session Tracking(Cookie, HttpSession, URLRewritting)

I. Khái niệm về Session:

- Session được hiểu là khoảng thời gian người sử dụng giao tiếp với 1 ứng dụng. Một session được bắt đầu khi người sử dụng truy cập vào ứng dụng lần đầu tiên, và kết thúc khi người sử dụng thoát khỏi ứng dụng. Mỗi session sẽ có được cấp một định danh (ID) khác nhau và nội dung được lưu trong thư mục thiết lập trong file php.ini (tham số session.save_path).

Có 3 kỹ thuật trong Servlet để xử lý Session:

Url Rewritting

HTTP Cookie

HttpSession


II. Các kỹ thuật xử lý Session:


1. Url Rewritting

A. Khái niệm:

Uniform Resource Locator (URL) là địa chỉ của một tài nguyên nằm trên Trang web.

- Session id có thể được gửi như 1 tham số:
https://www.blogger.com/blogger.g?blogID=9163428659843180977
- Bạn có thể phụ thêm một số dữ liệu bổ sung ở cuối mỗi URL mà nhận diện Session đó, và Server có thể liên kết với Session Identifier này với dữ liệu nó đã lưu giữ về session đó:

- 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à: bạn sẽ tạo mỗi URL động để gán cho một Session ID bởi vì trang là trang HTML tĩnh.
B. Ưu & Nhược điểm:
- Ưu điểm:
Có thể được nối khi gửi dữ liệu từ form HTML. Có thể được gửi cùng với nội dung động từ một Servlet. Là một cách tốt để duy trì phiên khi các trình duyệt không hỗ trợ cookie hoặc người dùng vô hiệu hóa sự hỗ trợ cho các tập tin cookie. 
+ 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ược điểm:
URL chỉ có thể được gửi thông qua các hyperlink trên trang Web. URL dài không thể lưu trữ nhiều thông tin do giới hạn chiều dài URL(255) URL có chứa thông tin dữ liệu có thể nhìn thấy, vì vậy nó không phải an toàn
+ Chỉ làm việc vs các documents được tạo tự động.
+ Sẽ tạo mỗi URL động để gán cho một Session ID bởi vì trang là trang HTML tĩnh.
C. Hidden fields:
- Một máy chủ web có thể gửi một trường mẫu HTML ẩn cùng với một session ID duy nhất như sau:
<input type="hidden" name="sessionid" value="12345">

- Ý nghĩa của đoạn code trên là khi các mẫu được gửi, tên và giá trị xác định được tự động đưa vào GET hoặc POST dữ liệu. Mỗi lần khi duyệt web sẽ gửi yêu cầu trở lại, sau đó giá trị session_id có thể được sử dụng để giữ theo dõi của các trình duyệt web khác nhau.

- Đây có thể là một cách hiệu quả để lần theo dấu của Session nhưng việc click trên một Hypertext Link (ví dụ dạng <A HREF...>) không tạo ra một sự đệ trình Form, vì thế các trường Hidden Form này cũng không thể hỗ trợ việc theo dấu các Gerneral Session.

- Servlet đọc giá trị của fields bằng phương thức request.getParameter().

- Tuy được hỗ trợ rộng rãi và làm việc được với user vô danh. Đổi lại chỉ làm việc được với các form sinh tự động. Bên cạnh đó là còn khá hạn chế khi không làm việc được với document tĩnh và không xử lý được trường hợp đóng trình duyệt.


2. HTTP Cookie
A. Khái niệm:
-  Cookie là 1 đoạn dữ liệu được ghi vào đĩa cứng hoặc bộ nhớ của máy người sử dụng. Nó được trình duyệt gởi ngược lên lại server mỗi khi browser tải 1 trang web từ server. Có hai loại cookie:

Cookie của bên thứ nhất do trang web hiển thị trong thanh địa chỉ đặt.

Cookie của bên thứ ba đến từ các trang web khác có các mục như quảng cáo hoặc hình ảnh được nhúng vào trang bạn đang truy cập.

- Những thông tin được lưu trữ trong cookie hoàn toàn phụ thuộc vào website trên server. Mỗi website có thể lưu trữ những thông tin khác nhau trong cookie, ví dụ thời điểm lần cuối ta ghé thăm website, đánh dấu ta đã login hay chưa, v.v...

- Cookie được tạo ra bởi website và gởi tới browser, do vậy 2 website khác nhau (cho dù cùng host trên 1 server) sẽ có 2 cookie khác nhau gởi tới browser. Ngoài ra, mỗi browser quản lý và lưu trữ cookie theo cách riêng của mình, cho nên 2 browser cùng truy cập vào 1 website sẽ nhận được 2 cookie khác nhau.

- Cơ chế hoạt động của cookie:

B. Ưu & Nhược điểm:
- Ưu điểm:
 Dễ cài đặt, tùy biến linh động và được duy trì cho đến khi đóng trình duyệt.
- Nhược điểm:
+ Độ bảo mật kém nên thường người dùng sẽ tắt cookie để tự bảo vệ thông tin cá nhân của mình.
+ Không phải mọi trình duyệt đều hỗ trợ Cookie.
3. HttpSession
A. Khái niệm:
- Servlet cung cấp HttpSession interface để xác định một người dùng trên nhiều hơn một trang yêu cầu hoặc truy cập vào một trang web và lưu trữ thông tin về người dùng đó.
HttpSession session = request.getSession();

- Session được tạo ra giữa một khách hàng HTTP và một máy chủ HTTP bằng servlet container sử dụng HttpSession interface.

- Các method của HttpSession interface:
STTPhương thức và Miêu tả
1
public 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ề nul nếu không có đối tượng nào được bind với tên này
2
public 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
3
public 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
4
public 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
5
public 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
6
public 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
7
public 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ó
8
public boolean isNew(
Phương thức này trả về true nếu Client vẫn chưa biết về Session đó
9
public 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
10
public 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
11
public 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

B. invalidate() & Session timeout:

- Method invalidate() được sử dụng để tránh các hacker gây ra bất kỳ thiệt hại nào đến ứng dụng. Nó phá hủy các dữ liệu trong một session servlet hoặc JSP có thể yêu cầu trong tương lai. Sessions nên được vô hiệu thận trọng khi chúng được kết hợp với các khách hàng

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

C. Ví dụ:

1.Index



2.Login



3.Navigation


4.LoginServlet


5.Profile Servlet



6.Logout Servlet


III. Kết

- Session tracking cho phép các máy chủ để theo dõi các yêu cầu liên tiếp thực hiện bởi cùng một khách hàng. 

- Một số kỹ thuật Session tracking như URL rewriting, hidden field, and cookie. 

- Java Servlet cung cấp một cơ chế theo dõi session qua javax.servlet.http.HttpSession

- Kỹ thuật URL rewriting cho viết thêm một số dữ liệu thêm vào cuối URL để xác định session.

- Hidden form field được sử dụng để truyền dữ liệu đến các nguồn tài nguyên phía máy chủ vô hình từ người sử dụng. Một cookie là một phần nhỏ của thông tin được gửi bởi một máy chủ cho trình duyệt Web client

- HttpSession interface được sử dụng để tạo ra một session giữa client và server. Các session được tạo ra giữa một khách hàng HTTP và một máy chủ HTTP bằng servlet container sử dụng interface này.