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

"Mô tả về vai trò của Persistence, tại sao cân persistence vai trò, đóng góp như thế nào trong việc phát triển Data model..., Serializable: Định nghĩa, cách dùng, vai trong..."

1.  Persistence 
-JPA:
  •  Nhẹ, dựa trên POJO framework Java.
  •  Giúp để tồn tại các đối tượng Java để các cơ sở dư liệu quan hệ.
  •  Cung cấp các nhà cung cấp bền bỉ trong việc áp dụng JPA.
  •  Chuyển đổi dữ liệu giữa các loại không tương thích trong lập trình hướng đối tượng với các loại cơ sở dữ liệu cơ bản thích hợp.
  • Công nghệ ORM mà vẫn tồn tại các thực thể trong cơ sở dữ liệu, hỗ trợ lập bản đồ hướng đối tượng phần mềm để các lược đồ cơ sở dữ liệu thông qua lập bản đồ cấu hình.
  •  Hình hiển thị bản đồ của Java Objects để Tables.
-Đặc điểm của kỹ thuật của JPA là như sau:
  •  Hỗ trợ mô hình lập trình POJO cho sự bền bỉ đối tượng vào cơ sở dữ liệu.
  • Cung cấp một ORM API  tiêu chuẩn trong đó kết hợp các khái niệm hiện tại framework bền vững của bên thứ ba.
  • Ví dụ, Hibernate, TopLink, đối tượng Java Data (JDO), và như vậy.
  • Định nghĩa một giao diện nhà cung cấp dịch vụ được thực hiện bằng cách kiên trì khác nhau các nhà cung cấp.
-Hình hiển thị các thành phần chính của JPA API.

  •   Persistence - một bản sắc đó là một giá trị duy nhất được sử dụng bởi các container để map các đối tượng Entity các bản ghi tương ứng trong cơ sở dữ liệu.
  •   EntityManager - cung cấp các API để tương tác với các Entity.
  •   EntityManagerFactory - được sử dụng để tạo ra một thể hiện của EntityManager.
  •   Persistence Unit -  bao gồm các thông tin cấu hình XML  một  của các lớp học được điều khiển bởi các nhà cung cấp JPA.
  •   Persistence Context - liên quan đến quản lý entity,  một tập hợp các entity như vậy  đối với bất kỳ persistent, đó  một ví dụ duy nhất về entity.
-Các lớp entity phải được chú thích với các @Entity chú thích được định nghĩa trong javax.persistence package.
  •  Các lớp phải có một constructor không có đối với sửa đổi lần truy cập công cộng hoặc bảo vệ.
  •  tính hoặc các phương pháp tổ chức lớp nên không được tuyên bố  cuối cùng. Các lớp học cũng nên không được tuyên bố  cuối cùng
  • Nếu ví dụ entity được thông qua dưới dạng Session Bean sau đó nó phải thực hiện các Serializable  interface.
  • Entity có thể được các lớp Entity hoặc không.
  • Các Entity của lớp Entity phải được khai báo là private hay protected và được truy cập chỉ bằng các phương pháp hiện diện trong lớp.
  •  Mỗi entity phải được xác định bởi một định dạng duy nhất hoặc một khóa chính. Các khóa chính giúp khách hàng truy cập vào các entity.
  •  Các chú thích @ id áp dụng sở hữu entity xác định rằng sẽ là khóa chính.
-Để quản lý các trường entity trong persistence context, một  interface có tên EntityManager API.
  • Interface EntityManager được định nghĩa trong javax.persistence package và được sử dụng để tương tác với  persistence context.
  • Interface EntityManager cung cấp phương pháp để đồng bộ trạng thái của các entity trong cơ sở dữ liệu.
  •  Hình cho thấy cách làm việc của EntityManager trong JPA.
Bảng liệt kê một số các phương pháp quy định trong  EntityManager interface.
Persistence Unit:
  •  là một tập hợp các lớp map 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.
  • Contains hợp lý của các lớp entity, map siêu dữ liệu của họ, 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 các ví dụ EntityManager trong chương trình khách hàng.
  • Các đoạn mã hiển thị mã cho một tập tin persistence.xml phát triển như là một phần của các ứng dụng doanh nghiệp.

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.



Trong Java Persistence API, một entity có thể có truy cập field-based hoặc property-based. Trong việc tiếp cận field-based, cung cấp persistence truy cập trạng thái của entity trực tiếp thông qua các biến cá thể của nó. Trong truy cập property-based, nhà cung cấp persistence sử dụng JavaBeans kiểu get / phương pháp accessor thiết lập để truy cập tài sản persistent của đơn vị. Tất cả các trường và thuộc tính trong entity đang tồn tại. Tuy nhiên, ghi đè lên một lĩnh vực hoặc property's default persistence  bằng cách đánh dấu nó với các @Transient chú thích hoặc từ khóa Java transient.

Các Java Persistence API đơn giản hoá mô hình lập trình cho các thực thể kiên trì và thêm khả năng mà không có trong EJB 2.1. Dưới đây là danh sách những đơn giản hóa và bổ sung của nó:
  • Yêu cầu các lớp và các giao diện ít
  • Hầu như loại bỏ mô tả triển khai kéo dài qua các chú thích
  • Địa chỉ số kỹ thuật tiêu biểu nhất qua mặc định chú thích
  • Cung cấp bản đồ sạch hơn, dễ dàng hơn, tiêu chuẩn đối tượng quan hệ
  • Loại bỏ sự cần thiết cho mã tra cứu
  • Thêm hỗ trợ cho các thừa kế, đa hình, và các truy vấn đa hình.
  • Thêm hỗ trợ cho tên (tĩnh) và truy vấn động.
  • Cung cấp một ngôn ngữ truy vấn Java Persistence - một nâng cao EJB QL
  • Làm cho nó dễ dàng hơn để kiểm tra các đơn vị bên ngoài của EJB container
  • Có thể được sử dụng bên ngoài của container
  • Có thể được sử dụng với các nhà cung cấp bền bỉ của bên thứ ba pluggable


2. Serializable 

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ớ.
Ấn tượng nhất là 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.
Nếu bạn tò mò để biết: lớp Java chuẩn nào là có thể xếp thứ tự hoặc không, bạn kiểm tra văn kiện cho lớp đó. Việc kiểm tra khá đơn giản: Nếu lớp triển khai java.io.Serializable interface thì nó là Serializable, nếu không thì nó không thể xếp thứ tự.
Tại sao lại cần đến Serialization?
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.

Làm thế nào để Serialize một object?

Để Serialize một object ta cần đảm bảo rằng class của object đó cài đặt giao diện java.io.Serializable. Đây là một giao diện trống, ko 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ề class (ví dụ như tên của class, version của class, tổng số các field của 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

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

Session Tracking(Cookie, HttpSession, URLRewritting)

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.
Sau đây là 3 cách để duy trì session giữa Web Client và Web Server:

Sử dụng Cookie

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 requests 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ị của 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:
    + User có thể tắt cookies để đảm bảo security cho họ
    + Không được hỗ trợ bởi tất cả các trình duyệt

Sử dụng các trường Hidden Form

Một Webserver có thể gửi một trường Hidden Form cùng với một Session ID duy nhất như sau:
<input type="hidden" name="sessionid" value="12345">
Entry này nghĩa là, khi Form này được đệ trình, tên và giá trị đã cho tự động được bao trong dữ liệu GET hoặc POST. Mỗi khi trình duyệt Web gửi yêu cầu trở lại, thì giá trị session_id có thể được sử dụng để lần theo dấu 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.
*Ưu điểm:
- Được hỗ trợ rộng rãi
- Làm việc được với user vô danh
* Nhược điểm:
- Chỉ làm việc được với các form sinh tự động
- Không làm việc được với document tĩnh
- Không xử lý được trường hợp đóng trình duyệt

Viết lại URLRewritting

-URLs được viết lại, hoặc được mã hóa để đưa thêm các thông tin về session
- URL rewriting thường bao gồm một session id
- Session id có thể được gửi như một tham số
* Ưu điểm:
- Làm việc được với user vô danh 
- Đượ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 documents được tạo động

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 đó.
Servlet container 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ả
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

Ví dụ về Session Tracking trong Servlet

Ví dụ này miêu tả cách sử dụng đối tượng HttpSession để tìm thời gian creation và thời gian last-accessed cho một Session. Chúng ta sẽ liên kết một Session mới với yêu cầu này nếu nó chưa tồn tại.
// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
 
// Extend HttpServlet class
public class SessionTrack extends HttpServlet {
 
  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
            throws ServletException, IOException
  {
      // Create a session object if it is already not  created.
      HttpSession session = request.getSession(true);
      // Get session creation time.
      Date createTime = new Date(session.getCreationTime());
      // Get last access time of this web page.
      Date lastAccessTime = 
                        new Date(session.getLastAccessedTime());

      String title = "Welcome Back to my website";
      Integer visitCount = new Integer(0);
      String visitCountKey = new String("visitCount");
      String userIDKey = new String("userID");
      String userID = new String("ABCD");

      // Check if this is new comer on your web page.
      if (session.isNew()){
         title = "Welcome to my website";
         session.setAttribute(userIDKey, userID);
      } else {
         visitCount = (Integer)session.getAttribute(visitCountKey);
         visitCount = visitCount + 1;
         userID = (String)session.getAttribute(userIDKey);
      }
      session.setAttribute(visitCountKey,  visitCount);

      // Set response content type
      response.setContentType("text/html");
      PrintWriter out = response.getWriter();

      String docType =
      "<!doctype html public \"-//w3c//dtd html 4.0 " +
      "transitional//en\">\n";
      out.println(docType +
                "<html>\n" +
                "<head><title>" + title + "</title></head>\n" +
                "<body bgcolor=\"#f0f0f0\">\n" +
                "<h1 align=\"center\">" + title + "</h1>\n" +
                 "<h2 align=\"center\">Session Infomation</h2>\n" +
                "<table border=\"1\" align=\"center\">\n" +
                "<tr bgcolor=\"#949494\">\n" +
                "  <th>Session info</th><th>value</th></tr>\n" +
                "<tr>\n" +
                "  <td>id</td>\n" +
                "  <td>" + session.getId() + "</td></tr>\n" +
                "<tr>\n" +
                "  <td>Creation Time</td>\n" +
                "  <td>" + createTime + 
                "  </td></tr>\n" +
                "<tr>\n" +
                "  <td>Time of Last Access</td>\n" +
                "  <td>" + lastAccessTime + 
                "  </td></tr>\n" +
                "<tr>\n" +
                "  <td>User ID</td>\n" +
                "  <td>" + userID + 
                "  </td></tr>\n" +
                "<tr>\n" +
                "  <td>Number of visits</td>\n" +
                "  <td>" + visitCount + "</td></tr>\n" +
                "</table>\n" +
                "</body></html>");
  }
}

"Manage session ""Develop a app that show number of page view in one session of user"""

1.Create project
2. Form new form jsp
3.Servlet
-Tạo biến đếm count kiểu Integer.
-Nếu có lượt truy cập count++
-khởi tạo seesion
-Sử dụng setAttribute với 1 key (session) và 1 value (count) tương tứng.
Khởi tạo 1 biến counts  kiểu Integer

    PrintWriter để hiển thị dữ liệu
     web.xml