Tuesday, March 7, 2017

MVC model2

MVC model2





I. Tìm hiểu về MVC


1. Khái niệm mô hình MVC


  • Mô hình MVC (Model - View - Controller) là một kiến trúc phần mềm hay mô hình thiết kế được sử dụng trong kỹ thuật phần mềm.
  • Nó giúp cho các developer tách ứng dụng của họ ra 3 thành phần khác nhau Model, View và Controller để dễ quản lý, phát triển và bảo trì.
  • Mỗi thành phần có một nhiệm vụ riêng biệt và độc lập với các thành phần khác.




2. Các thành phần trong mô hình MVC




Trong đó:
  • Model: Lớp chứa thông tin đối tượng (dữ liệu), tương tác với Database. Chịu trách nhiệm chính trong mô hình hóa này.
  • View: Giao diện của hệ thống tương tác trực tiếp với người dùng.
  • Controller: Nhận yêu cầu từ người dùng và sử dụng Model, View để xử lý và trả kết quả cho người dùng.


3. Các bước làm việc của mô hình MVC


  • User tương tác với View, bằng cách click vào button, user gửi yêu cầu đi.
  • Controller nhận và điều hướng chúng đến đúng phương thức xử lý ở Model.
  • Model nhận thông tin và thực thi các yêu cầu.
  • Khi Model hoàn tất việc xử lý, View sẽ nhận kết quả từ Model và hiển thị lại cho người dùng.

Mô hình MVC model2



II. MVC model2


  • Trong MVC model 2, một hoặc nhiều servlet đóng vai trò Controller, các Java Bean đóng vai trò Model và các trang JSP đóng vai trò View.

  • Các logic phức tạp của chương trình được viết hoàn toàn trong các servlet, là các chương trình Java. View chỉ gồm các trang JSP với một vài mã đơn giản để lấy dữ liệu có sẵn, không có logic phức tạp, vì thế hoàn toàn có thể được tạo ra bằng những người thiết kế Web.

  • Các yêu cầu của người dùng được gửi từ trình duyệt Web tới servlet. Servlet sẽ khởi tạo Java Bean (nếu cần thiết), ra lệnh thu thập, cập nhật thông tin. Khi Java Bean hoàn thành công việc, servlet sẽ chọn trang JSP thích hợp để hiện thông tin trong Java Bean cho người dùng.


Code thôi! (Đây là 1 ví dụ Login sử dụng MVC model2)

Bạn tạo 1 jsp có tên login.jsp với 1 form login đơn giản như sau:



Tiếp theo tạo 1 servlet đóng vai trò là Controller có tên LoginServlet



Tạo 1 file java đóng vai trò là Model để xử lý yêu cầu người dùng.


Ở đây mình code nếu người dùng nhập username và password giống nhau thì sẽ login thành công :D cho đơn giản!

Cuối cùng nếu đăng nhập thành công thì ta phải có 1 trang jsp để hiển thị. Ở đây mình đặt tên là adminzone.jsp



Chú ý: Các bạn tự tạo ra 1 trang fail.jsp nếu người dùng nhập sai nhé :). Good luck.

III. Tổng kết

  • Đây chính là một cách sử dụng MVC rất hiệu quả trong Java. Tất nhiên là sử dụng MVC model 2 một cách hoàn toàn cứng nhắc, phần Controller chỉ dùng servlet, phần View chỉ dùng JSP sẽ dẫn đến một vài trường hợp kém hiệu quả, nhất là khi có các request từ trình duyệt Web chỉ đòi hỏi việc hiển thị thông tin.

1. Ưu điểm:

-Thể hiện tính chuyên nghiệp trong lập trình, phân tích thiết kế.
-Do được chia thành các thành phần độc lập nên giúp phát triển ứng dụng nhanh, đơn giản, dễ nâng cấp, bảo trì.

2. Nhược điểm:

Đối với dự án nhỏ việc áp dụng mô hình MVC model2 gây cồng kềnh, tốn thời gian trong quá trình phát triển. Tốn thời gian trung chuyển dữ liệu của các thành phần.



Doubleboo

Sunday, February 26, 2017

JSP life cycle

JSP life cycle





I. JSP (JavaServer Pages)


1. JSP là gì ????



- JavaServer Pages (JSP) là một công nghệ lập trình Server-Side mà cho bạn khả năng xây dựng các ứng dụng trên Web động, độc lập nền tảng. JSP có quyền truy cập tới toàn bộ gia đình Java APIs, bao gồm JDBC API để truy cập Enterprise Database.

2. Tại sao phải dùng JSP?



  • Sử dụng JSP, bạn có thể thu thập input từ người dùng thông qua các Webpage Form, trình bày các record từ một Database hoặc đăng ký quyền ưu tiên của người dùng, truy cập các thành phần JavaBeans, truyền điều khiển giữa các page và chia sẻ thông tin giữa các Request, page, …
  • Hiệu năng tốt hơn đáng kể bởi vì JSP cho phép nhúng các phần tử động trong chính các HTML page thay vì phải có một CGI file riêng biệt.
  • JSP luôn luôn được biên dịch trước khi nó được xử lý bởi Server, không giống như CGI/Perl mà yêu cầu Server tải một trình thông dịch (Interpreter) và Target Script mỗi khi trang được yêu cầu.
  • Các JSP page có thể được sử dụng để kết nối với Servlet mà xử lý Business logic, mô hình được hỗ trợ bởi Java Servlet.


II. JSP Life Cycle


- Vòng đời của JSP có thể được định nghĩa như là toàn bộ tiến trình từ khi tạo ra đến khi hủy nó, tương tự như vòng đời của một Servlet, nhưng thêm một bước để biên dịch một JSP thành Servlet.

Life cycle of a JSP Page
  • Translation of JSP Page to Servlet
  • Compilation of JSP Page
  • Classloading (class file is loaded by the classloader)
  • Instantiation (Object of the Generated Servlet is created).
  • Initialization ( jspInit() method is invoked by the container).
  • Reqeust processing ( _jspService() method is invoked by the container).
  • Destroy ( jspDestroy() method is invoked by the container).




- Với request đầu tiên sau khi được deploy, JSP phải trải qua 2 step là translationcompilation
  • Translation: translate jsp sang servlet. JSP syntax được kiểm tra tại step này
  • Compilation: container compile servlet sang bytecode (.class file). Java language/syntax được kiểm tra tại step này.




- JSP translate thành Servlet bao gồm 3 methods :

  • jspInit(): được gọi bởi init() method (từ HttpServlet), method này có thể được override.
  • jspDestroy(): được gọi bởi destroy() method, method này cũng có thể được override.
  • _jspService(): được gọi bởi service() method, method này không nên override.


- Sau đây là các giai đoạn chính trong vòng đời của JSP
  • Biên dịch
  • Khởi tạo
  • Thực thi
  • Hủy

1. Biên dịch


- Khi môt trình duyệt yêu cầu một JSP, đầu tiên JSP engine kiểm tra để biết có hay không nó cần biên dịch trang này. Nếu trang chưa được biên dịch, hoặc nếu JSP đã được sửa đổi từ lần sửa đổi cuối cùng, thì JSP engine biên dịch trang này.

Biên dịch gồm 3 bước:
  • Parse một JSP
  • Biên dịch JSP thành một Servlet
  • Biên dịch Servlet đó.


- Các file JSP được dịch thành mã Servlet. Sau đó mã này mới được biên dịch tiếp.
- Thực hiện tự động nhờ container, ở lần đầu tiên trang JSP được truy cập (hoặc khi chỉnh sửa).
- Dữ liệu được chuyển thành mã java, tác động tới output stream trả dữ liệu về cho client.
- Các phần tử JSP được xử lý khác nhau:
  • Các chỉ dẫn (Directives) được dùng để điều khiển Web container biên dịch và thực thi trang JSP.
  • Phần tử Scripting được thêm vào lớp servlet tương ứng của trang JSP.
  • Phần tử dạng <jsp:xxx .../> được chuyển thành lời gọi phương thức tới JavaBeans components

2. Khởi tạo


- Phương thức jspInit(): Khi một container tải một JSP, nó gọi phương thức jspInit() trước khi thực hiện bất kỳ yêu cầu nào. Nếu bạn muốn thực hiện code của bạn, bạn nên override phương thức jspInit() của giao diện JspPage.

public void jspInit(){
  // Initialization code...
}


Note : Việc khởi tạo được thực hiện chỉ một lần và với phương thức int của Servlet, nói chung bạn khởi tạo các kết nối Database, mở các file, và tạo các bảng tra cứu trong phương thức jspInit.

3. Thực thi


Giai đoạn này trong vòng đời JSP biểu diễn tất cả các tương tác với Request tới khi JSP đó bị hủy.

Bất cứ khi nào một trình duyệt yêu cầu một JSP và trang đã được tải và được khởi tạo, thì JSP engine triệu hồi phương thức _jspService() trong JSP đó.

Phương thức _jspService() nhận một HttpServletRequest và một HttpServletResponse như là các tham số của nó.

void _jspService(HttpServletRequest request, 
                 HttpServletResponse response)
{
   // Service handling code...
}


Phương thức _jspService() của một JSP được triệu hồi một lần cho mỗi yêu cầu và nó chịu trách nhiệm tạo Response cho Request đó và phương thức này cũng chịu trách nhiệm tạo các phản hồi tới tất cả 7 phương thức của HTTP, ví dụ: GET, POST, DELETE, …

4. Hủy


Giai đoạn hủy một JSP trong vòng đời JSP biểu thị khi nào thì một JSP bị gỡ bỏ khỏi một container.

Phương thức jspDestroy() trong JSP là phương thức hủy tương đương với trong Servlet.

Override phương thức jspDestroy khi bạn cần thực hiện bất kỳ quá trình hủy nào, ví dụ như giải phóng kết nối với Database, hoặc đóng các file.

public void jspDestroy()
{
   // Your cleanup code goes here.
}

III. Tổng hợp

  • JSPs Làm việc cùng với các servlet để xử lý yêu cầu của khách hàng và đáp ứng chúng. Các yêu cầu và đáp ứng của khách hàng là các yêu cầu và đáp ứng của HTTP .
  • Sử dụng JSP thuận tiện do nền tảng độc lập và tính di động của Java
  • Khi chạy, JSP được chuyển đổi thành các servlet và thực thi.
  • JSP có một kho lưu trữ của thẻ để thực hiện các chức năng khác nhau được gọi là JSTL
  • EL được sử dụng để đánh giá biểu thức JSP như vậy mà chúng tương thích với JSFs.

  • Ưu điểm của JSP :
    • JSP có thể chạy trên nhiều hệ điều hành khác nhau
    • Có tất cả lợi thế của java và khiến trang HTML tĩnh trở nên năng động hơn
    • Thiết kế giao diện web trở nên dễ dàng
    • JSP luôn biên dịch trước khi nó được xử lý bởi các máy chủ
  • Nhược điểm của JSP :
    • Khó kiểm tra lỗi vì vừa phải đóng vai trò như view lẫn controller 

  • So với Active Server Pages (ASP): Lợi thế của JSP có thể coi là gấp đôi. Đầu tiên, các phần động được viết bằng Java, không phải bằng Visual Basic hoặc ngôn ngữ MS khác, vì thế nó mạnh mẽ hơn và dễ dàng để sử dụng hơn. Thứ hai, nó thích hợp cho các Hệ điều hành khác, không chỉ là Microsoft Web Server.
  • So với Pure Servlets: Nó tiện lợi hơn khi viết (và sửa đổi) HTML, vì có nhiều lệnh println hơn.
  • So với Server-Side Includes (SSI): SSI chỉ dành cho các thể đơn giản, không dành cho các chương trình “thực” mà sử dụng Form Data, tạo kết nối Database.
  • So với JavaScript: JavaScript có thể tạo HTML động trên Client nhưng lại tương tác khó khăn với Web Server để thực hiện các tác vụ phức tạp như truy cập Database và xử lý hình ảnh,…
  • So với Static HTML: Tất nhiên, HTML thông thường không thể chứa thông tin động.

IV. Tài liệu tham khảo

Tài liệu Oracle
Tài liệu Tiếng Việt

Friday, February 24, 2017

Persistence and Serializable

Persistence and Serializable


I. Persistence


1. Khái niệm:

- Hiểu 1 cách đơn giản Java Persistence API là một tập của các class và methods để liên tục lưu trữ một lượng lớn dữ liệu vào một cơ sở dữ liệu được cung cấp bởi Oracle.

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 linh hoạt 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.
  • Nhẹ, dựa trên POJO framework Java.
  • 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ác API của Persistence, được định nghĩa trong gói javax.persistence
  • Persistence Unit
  • Persistence Context
  • Java Persistence Query Language


3. Persistence Unit

  • Bao gồm các thông tin về XML configuration và một tập hợp các class mà được điều khiển bởi JPA.
  • Cấu hình Persistence Unit được định nghĩa ra file persistence.xml.
  • Một file persistence.xml có thể chứa 1 hoặc nhiều các configration persistence unit được đặt tên.
  • 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ý.
  • 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.
  • Có thể có các nhà cung cấp persistence khác nhau cho các persistence unit khác nhau.


Đoạn mã sau đây cho thấy một mẫu persistence.xml tập tin định nghĩa các thuộc tính JDBC:


<persistence-unit name="JPAProject" 
      transaction-type="RESOURCE_LOCAL"> 
  <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
  <!--Entity Classes --> 
  <class>com.infosys.demo.Item</class> 
  <class>com.infosys.demo.Employee</class> 
  <properties> 
 <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/JPA 2" /> 
    <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" /> 
    <property name="javax.persistence.jdbc.user" value="root" /> 
 <property name="javax.persistence.jdbc.password" value="infosys"/> 
 <property name="javax.persistence.jdbc.show_sql" value="true" /> 
   </properties> 
</persistence-unit>


Một số thuộc tính được định nghĩa trong 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.


4. Persistence Context

  • Kết hợp với manager entity, là một tập hợp các entity cho bất kỳ persistent identity
  • Để quản lí các entity với persistence context, 1 interface EntityManager API được sử dụng.
  • Một file persistence.xml có thể chứa 1 hoặc nhiều các configration persistence unit được đặt tên.
  • Interface EntityManager được định nghĩa trong package javax.persistence và được dùng để tương tác với persistence context.


                                                      Concept của EntityManager.

javax.persistence.EntityManagerFactory :

protected void setUp() throws Exception {
    entityManagerFactory = Persistence.createEntityManagerFactory( "org.hibernate.tutorial.jpa" );
}


Interface EntityManager cung cấp các method để đồng bộ state của entity instance đến database:



Các chức năng mở rông của Persistence Property, được phân loại theo chức năng:
  • Weaving
  • Customizers
  • Validation and Optimization
  • Caching
  • Mapping
  • Schema generation
  • JDBC configuration


5. Java Persistence Query Language

  • Giúp truy vấn đối với các object được lưu trữ trong 1 db.
  • Được nâng cấp mở rộng từ EJB QL (Enterprise JavaBean Query Language), loại bỏ nhiều điểm yếu của các phiên bản trước
  • Truy vấn giống SQL trong cú pháp, nhưng không phải là hoạt động trực tiếp với các bảng cơ sở dữ liệu.


6. Đánh giá về Persistence

  • 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
  • Mapping 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


II. Serialization



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

- Để serializable, 1 class phải implement Serializable interface.



- Class ObjectInputStream và ObjectOutputStream là dòng cao cấp có chứa các phương pháp serializing và deserializing một đối tượng.



Chúng ta làm 1 ví dụ nhé


Run và cảm nhận!


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

Tài liệu tham khảo



https://docs.oracle.com/javaee/6/tutorial/doc/bnbpz.html

Wednesday, February 22, 2017

Session Tracking(Cookie, HttpSession, URLRewritting)

Session Tracking(Cookie, HttpSession, URLRewritting)


Session Tracking


- Session tracking hiểu đơn giản là cách để duy trì trạng thái(dữ liệu) của người dùng khi người dùng truy cập vào 1 ứng dụng hay website.
- 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.

Vì vậy chúng ta có Session Tracking:
  • Cho phép các ứng dụng Web duy trì thông tin của người dùng với máy chủ miễn là người dùng không đăng xuất khỏi Website.
  • Theo dõi các danh tính của khách hàng và thông tin trạng thái khác cần thiết trong suốt session.


Có 3 cách để duy trì session giữa Web Client và Web Server:
  • Cookies
  • URL rewriting
  • HTTP Session

1. Cookie


Cookie là cơ chế default để quản lý session. Session tracking qua cookie là thêm một mẩu thông tin để lưu giữ id của session, id này được lưu trong header của request/response để truyền qua lại giữa client và server và thường có tên (cookie name) là jssseionid (tên này phụ thuộc vào từng container).




- Cách thức hoạt động của cookies



Chúng ta code thử 1 ví dụ về login đơn giản cho các bạn hiểu hơn luôn nhé!

Bước 1: Các bạn tạo 1 java web -> web application và tạo 1 trang jsp có tên là login.jsp và chứa code như sau:



Bước 2: Tạo 1 file servlet trong folder Source Packages có tên là LoginServlet.java và code như sau



Chú ý: Vì ở bước 1 chúng ta đặt method="POST" nên chúng ta sẽ viết code vào phương thức doPost ai mà viết vào doGet là không ra được kết quả mong muốn đâu.
- Ở bước này các bạn có thể thấy mình tạo cookies đơn giản như sau:



Bước 3:Cuối cùng tạo 1 file jsp để kiểm tra xem mình đã tạo và lưu cookies thành công hay chưa. Ở đây mình file jsp của mình có tên là user.jsp

Chạy file login.jsp và tận hưởng thành quả :) (Nhập username và password giống nhau nha!.)


2. URL REWRITING


- URL rewriting là thêm sessionid vào url, phương pháp này có tác dụng khi mà cookie không làm việc (thường do browser disable cookie). Tuy nhiên để sử dụng cách này thì url phải được encode bằng cách:
response.encodeURL(url: String)
response.encodeRedirectURL(url: String): URL Rewriting trong trường hợp redirect

-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">


  • Mục nhập này có nghĩa 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.
  • Chúng được đặt trong một form HTML.
  • Chúng là một phần của biểu mẫu HTML tĩnh hoặc thông tin động tạo ra thông qua servlet.
  • Chúng có thể được sử dụng để giữ bất kỳ loại dữ liệu.
  • Chúng không thể được nhìn thấy bởi người sử dụng và do đó không được giải thích bởi các trình duyệt.
  • User có thể gửi nhiều dữ liệu và mã hóa ký tự.
  • Hidden field và Url rewriting rất tốt để cùng sử dụng


Ví dụ

3. HTTP Session


- Ngoài hai cách được đề cập ở trên, 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.
- Cách tạo 1 session đơn giản trong servlet:

HttpSession session = request.getSession();


- Thôi làm 1 ví dụ để dễ hiểu hơn nhé.

Tạo 1 servlet và code như sau:

public class SessionTrackingServlet extends HttpServlet {
 
  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
            throws ServletException, IOException
  {
      HttpSession session = request.getSession(true);

      Date createTime = new Date(session.getCreationTime());
      Date lastAccessTime = new Date(session.getLastAccessedTime());

      String title = "Welcome Back to my website";
      int visitCount = 0;
      String userID= new String("19042205");
      String userName = new String("Doubleboo");

      if (session.isNew()){
         title = "Welcome to my website";
         session.setAttribute(userID, userName);
      } else {
         visitCount = visitCount + 1;
         userName = (String)session.getAttribute(userID);
      }

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

      out.println("<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\" cellspacing=\"0\" align=\"center\">\n" +
                "<tr bgcolor=\"#949494\">\n" +
                "  <th>Session info</th><th>value</th></tr>\n" +
                "<tr>\n" +
                "  <td>Session 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 Name</td>\n" +
                "  <td>" + userName + 
                "  </td></tr>\n" +
                "<tr>\n" +
                "  <td>Number of visits</td>\n" +
                "  <td>" + visitCount + "</td></tr>\n" +
                "</table>\n" +
                "</body></html>");
  }
}


Chạy servlet đó và đây là kết quả!



Các phương thức của đối tượng HttpSession hay dùng.

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



4. Tổng Kết

Về Cookies:
  • Khi sử dụng cookies để lưu dữ liệu sẽ gặp phải hạn chế là: đa số người dùng tắt cookies trên trình duyệt vì sợ bị mất, hack , lộ thông tin

Về Hidden fields:
  • Chỉ hoạt động khi trang nhận được yêu cầu thông qua một submit form

Còn đối với URL Rewrite

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

- 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

Tài liệu tham khảo:


Session Tracking Tutorial
Session Tracking (Tài liệu tiếng việt)

Sunday, February 19, 2017

Servlet và hệ thống phân cấp Servlet

Tìm hiểu về Java Servlet - Vòng đời của Servlet (Servlet Life Cycle) - Mối quan hệ trong Servlet.






1. Servlet là gì

  • Java Servlets 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.
    Sử dụng Servlets, bạn 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.


2. Vòng đời của Servlet ( Servlet Life Cycle )

- Vòng đời của Servlet 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.

-Có thể hiểu vòng đời servlet là Một Servlet khi khởi tạo thì nói sống mãi trong bộ nhớ của server. Luôn lắng nghe và chờ đợi khi người dùng yêu cầu đến nó thì sẽ sẵn dùng chứ không cần khởi tạo một lần nữa.. Servlet chỉ ngừng lại khi chúng ta Stop hay Restart lại server.

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.


– Phương thức init():
  • Chỉ được gọi một lần trước khi servlet xử lý các request (trước khi service() được gọi). Method này có thể override, được sử dụng để khởi tạo các resource.
public void init() throws ServletException {
  // Initialization code...
}
– Phương thức service():
  • Được gọi bởi container khi client make request, có thể được gọi nhiều lần để xử lý các request. Service() dựa vào HTTP request để gọi các doXXX() tương ứng. Method này được xử lý trong từng thread riêng biệt. Không nên override.
public void service(ServletRequest request, 
                    ServletResponse response) 
      throws ServletException, IOException{
}
– Phương thức doGet():
  • Một yêu cầu GET, là kết quả từ một yêu cầu chuẩn cho URL hoặc từ một HTML form, mà không có PHƯƠNG THỨC nào được xác định và nó nên được xử lý bởi phương thức doGet().
public void doGet(HttpServletRequest request,
                  HttpServletResponse response)
    throws ServletException, IOException {
    // Servlet code
}
– Phương thức doPost():
  • Một yêu cầu POST, là kết quả từ một HTML form mà liệt kê POST như là PHƯƠNG THỨC, và nên được xử lý bởi phương thức doPost():
public void doPost(HttpServletRequest request,
                   HttpServletResponse response)
    throws ServletException, IOException {
    // Servlet code
}


Các phương thức trong HttpServlet để thực thi yêu cầu từ client đều bao gồm hai tham số:
  • HttpServletRequest : là các dữ liệu nhận từ phía client
  • HttpServletResponse : là các dữ liệu để trả về client
– Phương thức Destroy():
  • Chỉ được gọi chính xác 1 lần bởi container. Có thể override để clean resource
  public void destroy() {
    // Finalization code...
  }

Các bạn có thể tìm hiểu thêm tại: https://www.tutorialspoint.com/servlets/servlets_overview.htm



3. Mối quan hệ giữa Servlet, HttpServlet và GenericServlet

- Servlet là phía server, đáp ứng các yêu cầu do client chuyển đến. Các lớp servlet nói chung phải cài đặt giao diện javax.servlet.Servlet. Servlet API cung cấp hai lớp cài đặt từ giao diện này, ta phải thừa kế chúng để tạo ra servlet :
Servlet extends --> HttpServlet extend--> GenericServlet implements -->các interface(như Servlet, ServletConfig, Serializable ) .
  • GenericServlet cung cấp các chức năng cơ bản, độc lập giao thức, để tạo servlet. Thừa kế lớp này để tạo các lớp servlet cho dịch vụ không phải HTTP (non-HTTP). Khi thừa kế lớp này, ta cần viết lại phương thức service.
  • HttpServlet là lớp trừu tượng thừa kế GenericServlet và thêm vào các chức năng cho riêng HTTP. Khi xây dựng ứng dụng web, đa số các lớp servlet do ta viết sẽ thừa kế HttpServlet.
- Cây phân cấp


4. Tổng kết

* Ưu điểm
  • Có độ bảo mật cao.
  • Có hiệu năng và khả năng mở rộng cao.- Truy cập được tất cả Java API- Có nhiều tools bên phía Third - Party và JavaServlet được nhiều Webserver hỗ trợ.- Độc lập Platform và Server- Hầu hết các server đều cho phép load lại Servlet khi có thay đổi
* Nhược điểm
  • Là một công nghệ đã cũ nên có rất nhiều hạn chế và khó khăn khi làm việc với giao diện.

Tài liệu tham khảo