Thứ Năm, 18 tháng 8, 2016

Mở rộng kiến thức về Struts 2 Framework – sử dụng annotation, xây dựng ứng dụng tương tự như ứng dụng đầu tiên áp dụng các kiến thức về Struts 2 Framework sử dụng annotations

Mở rộng kiến thức về Struts 2 Framework – sử dụng annotation, xây dựng ứng dụng tương tự như ứng dụng đầu tiên áp dụng các kiến thức về Struts 2 Framework sử dụng annotations

Mục đích: Chủ đề của bài này đề mở rộng các kiến thức của Struts 2.x Framework đã được nêu trong bài trước nhằm đem đến cho người đọc kiến thức đầy đủ về việc xây dựng ứng dụng hoàn toàn sử dụng Struts2 Framework. Chúng tôi sẽ tiếp cận tổng quát khái niệm của việc sử dụng annotation để hỗ trợ xây dựng web để tạo hiệu suất cao và nhanh chóng trong việc phát triển ứng dụng. Dựa trên khái niệm này, chúng ta sẽ áp dụng chúng để thực hiện lại ứng dụng đã được thực hiện trong bài Tổng quan về Struts2 Framework. Trong bài là sự phối hợp giữa việc sử dụng annotation kết hợp với cấu hình struts.xml để tăng tính thực tế cho ứng dụng cùng với sự mapping Action một cách tường minh và không tường minh

Yêu cầu về kiến thức cơ bản cho các khái niệm nâng cao về Struts2 Framework

  • Nắm vững các khái niệm về MVC, Struts Framework 1.x, các khái niệm cơ bản về Struts 2.x Framework
  • Nắm vững khái niệm về ngôn ngữ lập trình Java, lập trình thao tác hướng đối tượng
  • Nắm vững khái niệm về lập trình web sử dụng J2EE hay JavaEE với các kiến thức về Servlet, JSP
  • Nắm vững khái niệm về cơ chế Filter và RequestDispatcher trong Servlet
  • Nắm vững toàn bộ cách thức vận dụng và xây dựng ứng dụng hoàn chỉnh bằng Struts2 Frameworks (quí vị có thể tham khảo toàn bộ bài Mở rộng kiến thức về Struts 2 Framework – Interceptor và Validation; và Tổng quan về Struts 2 Framework)

Khái niệm về sử dụng annotation trong Struts2 Framework

  • Annotation giúp người lập trình đơn giản hóa việc lập trình bằng cách khai báo trực tiếp trong code mà không cần cấu hình quá chi tiết trong các tập tin cấu hình sử dụng với xml – khá phức tập
  • Để chuyển hướng cho container xác định việc sử dụng annotation thay vì sử dụng tập tin cấu hình struts.xml thì chúng ta phải khai báo trong web deployment descriptors là web.xml để xác định chúng ta sử dụng annotation
  • Cú pháp bổ sung cho phần khai báo filter servlet trong web.xml như sau

<filter>

  <filter-name>struts2</filter-name>

  <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>

  <init-param>

    <param-name>actionPackages</param-name>

    <param-value>tên các package chứa các action phân cách nhau bởi dấu ,</param-value>

  </init-param>

</filter>

  • Một số annotation thường dùng
    • @Result: xác định result object trả về tương tự cấu hình tag result trong tập tin struts.xml
    • @Result cho phép chứa các attribute param để truyền tham số phụ khi trả về
    • @Results: cho phép trả về nhiều hơn một Result
    • @ResultPath: cho phép xác định lại đường dẫn chuyển đến các resource được mapping trong Result
    • @Action: ánh xạ tường minh tên action đến các action class và cấu hình exception mapping để xử lý lỗi phát sinh do phương thức execute trong Action class throws ra
    • @ExceptionMapping: định nghĩa các thức xử lý lỗi cụ thể phát sinh từ execute của Action cho một result
  • Một số annotation dùng cho validation, các annotation này được áp dụng trên phương thức set của các property trong Action class khi validation dữ liệu

Tên Annotation

Khai báo trong tập tin struts.xml

Mô tả

RequiredFieldValidator

required

Không cho phép null, bắt buộc có

RequiredStringValidator

requiredstring

String không được phép rỗng, bắt buộc có

StringLengthFieldValidator

stringlength

Xác định kích thước chuỗi

IntRangeFieldValidator

int       

Xác định vùng giá trị dành cho số nguyên

DateRangeFieldValidator

date     

Xác định vùng giá trị dành cho ngày tháng

ExpressionVaidator     

expression       

Đánh giá trị của biểu thức OGNL trong ValueStack

FieldExpressionValidator

fieldexpression

Đánh giá của thuộc tính sử dụng biểu thức OGNL

EmailValidator

email   

Email phải theo đúng chuẩn

UrlValidator    

url       

URL phải đúng chuẩn định dạng

RegexFieldValidator    

regex   

Đảm bảo ràng buộc phải đúng theo biểu thức chính qui

Validation       

 

Xác định các thành phần sử dụng annotation cho validation

Validations     

 

Chứa nhiều validation

 

Các bước tạo ứng dụng sử dụng Struts2 Framework kết hợp annotation

  • Bước 1: tạo ứng dụng web với JavaEE5 và Struts2 Framework
  • Bước 2: Tạo tất cả các view để từ đó xây dựng action class
  • Bước 3: Tạo Action class với định dạng tên ActionNameAction – chữ đầu của class phải viết in
    • Định nghĩa tất cả các thuộc tính
    • Phát sinh các get và set tương ứng
    • Cài đặt phương thức action
  • Bước 4: khai báo các annotation tương ứng như Result/Results và Validation, … nếu cần
  • Bước 5: build và deploy để testing ứng dụng

Vận dụng các kiến thức nâng cao về Struts 2 Framework (Annotation) vào việc phân tích và cài đặt một ứng dụng cụ thể (ở đây chúng tôi sẽ thực hiện lại toàn bộ bài CRUD trên DB từ login, search, delete, update đến insert dữ liệu và thực hiện validation trong việc insert dữ liệu) để nêu ra cách áp dụng các kiến thức đã nêu trên để áp dụng xây dựng ứng dụng cụ thể

  • Ứng dụng thực hiện login để xác thực người dùng thông qua DB
  • Hệ thống cho phép người dùng search tên gần đúng của last name
  • Hệ thống cho phép người dùng thêm xóa sửa, trực tiếp trên lưới kết quả của form search
  • Hệ thống cung cấp chức năng để người dùng có thể đăng ký một account mới nếu chưa có account hay login không thành công. Chức năng đăng ký năng bắt buộc thể hiện các yêu cầu ràng buộc như sau
    • Form đăng ký bao gồm username, password, confirm password, lastname
    • Tất cả các field sẽ tuân theo qui luật như sau
      • Field username có kích thước từ  6 đến 20 ký tự
      • Field password có kích thước từ  6 đến 30 ký tự
      • Field last name có kích thước từ  2 đến 50 ký tự
      • Field confirm phải trùng khớp với password nhập
  • DB chúng tôi lập lại trong bài tổng quan về Struts2 Framework thao tác có dạng như sau

  • Yêu cầu
    • Nắm vững các khái niệm về MVC, Struts Framework 1.x, Struts2 Framework
    • Nắm vững về ngôn ngữ lập trình Java, lập trình thao tác hướng đối tượng
    • Cách thức sử dụng JSTL, EL, HTML, OGNL
    • Cách thức sử dụng liên kết động với DB trong code Java
    • Đã cài đặt các ứng dụng về MVC, Struts1 Framework, Struts2 Framework cơ bản trong bài tổng quan về Struts2 Framework
    • Tools sử dụng ở đây là Netbeans 6.9.1, Netbeans 7.4, Netbeans 8.x
    • JDK 6 update 22, JDK 7 update 51, JDK 8 update 66
    • Server: Tomcat 6.0.26, Tomcat 7.x, Tomcat 8.x
    • DBMS: SQL Server 2005 đến SQL Server 2014
    • Thư viện hỗ trợ: Driver kết nối database SQLServer (sqljdbc.jar hay sqljdbc4.jar), Struts2 Framework taglib
    • Tool Netbeans phải hỗ trợ Struts2
  • Chúng ta thực hiện như sau
    • Tạo Web Application tương tư như bài tổng quan về Struts2 Framework
    • Chúng ta thực hiện chức năng Login tương tự bài bài tổng quan về Struts2 Framework
      • Cấu hình Datasource cho project

      • Bổ sung nội dung cấu  hình đến package chứa action cho Filter Dispatcher trong tập tin web.xml

      • Tạo giao diện login với trang login.html

      • Lưu ý
        • Tên action reference tới luôn phải bắt đầu bằng chữ thường để từ đó tạo action bắt đầu bằng chữ hoa theo luật qui định (Cấu hình theo cách mapping Implicit). Cụ thể ở đây action sẽ là login
      • Tạo ra action có tên LoginAction. Lưu ý LoginAction viết in chữ L của Login – ánh xạ từ action login
        • Khai báo annotation Results trên action class chứa các Result bên trong
        • Result khai báo các trang sẽ chuyển tùy theo kết quả trả về của hàm

·         Cụ thể success sẽ chuyển sang trang search.jsp

·         Kết quả fail sẽ chuyển sang trang thông báo lỗi invalid.html

      • Lưu ý: phối hợp việc cấu hình annotation kết hợp với tập tin struts.xml với các action chỉ chuyển từ resource này sang resource khác mà không cần bất kỳ class hỗ trợ xử lý trung gian
        • Tạo utilities hỗ trợ kết nối DB động

      • Tạo DAO để hỗ trợ checkLogin

        • Xử lý cho LoginAction

    • Trang search.jsp được tạo có dạng như sau

      • Lưu ý: tên action luôn bắt đầu bằng chữ thường để chuẩn bị cho chức năng search tiếp theo
    • Trang invalid.html được viết như sau

    • Tập tin struts.xml được cấu hình như sau

    • Clean and Build, Deploy và test ứng dụng

        • Nhập đúng thì chương trình sẽ chuyển sang form search, sai thì sẽ báo lỗi

      • Chúng ta đã hoàn tất chức năng Login có hỗ trợ validation sử dụng annotations trực tiếp vào Action Class với Struts2 Frameworks
      • Lưu ý: một trong những lỗi gặp phải khi chúng ta quên cấu hình bổ sung cho tập tin web.xml là chỉ định package action khi sử dụng annotations thì lỗi sẽ phát sinh trên server khi deploy và trên ứng dụng thực thi như sau

 

 

  • Chúng ta thực hiện chức năng search cho ứng dụng
    • Tạo action class tên SearchAction tương tự như tên action khai báo trong trang search.jsp nhưng chữ đầu viết in
    • Cập nhật Result đến trang search.jsp khi giá trị trả về là success
    • Tạo đối tượng DTO để đón nhận dữ liệu

    • Các hàm chức năng search được cung cấp trong class DAO như sau

    • Class SearchAction được xây dựng như sau

    • Chúng ta thực hiện cập nhật trang search.jsp để trình bày dữ liệu như sau
      • Sử dụng OGNL expression và taglib để xử lý in ra màn hình
      • Mỗi phần tử của list là DTO, do vậy chúng ta sẽ access nó thông qua taglib và trình bày ra màn hình

    • Chúng ta thực hiện clean and Build project và thực hiện testing đến trang search

      • Chúng ta đã hoàn tất chức năng Search
  • Chúng ta tiếp tục thực hiện chức năng delete trên lưới
    • Việc cập nhật cho trang search với chức năng delete đã được thể hiện trong nội dung trang search.jsp ở trên

    • Chúng ta thực hiện tạo action class với tên gọi DeleteRecordAction. Lưu ý: ở đây chúng ta thực hiện cơ chế mapping implicit, cho nên việc đặt tên action phải luôn luôn là chữ thường, nếu trong chuỗi action có ký tự chữ hoa (Ví dụ deleteRecord) thì khi action được kích hoạt thì lỗi 500 NullPointerException sẽ được phát sinh
    • Cập nhật chức năng delete cho DAO

    • Thực hiện viết code cho DeleterecordAction, ở đây khi thực hiện delete xong, chúng ta phải gọi lại action search để cập nhật lưới nội dung trình bày bằng cách gọi redirectAction

    • Tạo trang deleteErr.html

    • Thực hiện deploy và test thử

    • Chúng ta vừa hoàn tất chức năng Delete với cách mapping Action implicit
  • Chúng ta tiếp tục thực hiện chức năng Update
    • Việc mapping Action Implicit sẽ gây nên khó khăn trong việc đặt tên. Trong nội dung phần này, chúng ta sẽ thực hiện mapping Explicit Action name cụ thể tùy ý sử dụng @Action trên tầm vực khai báo là Class Level
    • Việc bổ sung giao diện Update đã được trình bày trong trang search.jsp ở các nội dung trên

    • Chúng ta thực hiện bổ sung chức năng Update trong DAO

    • Chúng ta thực hiện tạo class UpdateRecordAction hay tên bất kỳ nào cũng được. Ở đây, chúng ta nhìn thấy việc đặc tên action là tùy ý không cần tuân thủ luật viết thường của cách mapping Implicit Action. Chúng ta sẽ mapping trực tiếp tên action updateRecord vào @Action được khai báo trên class
    • Việc xử lý chức năng Update tương tự như delete ngoài việc sử dụng Hidden Form Field trong form

    • Tạo trang updateErr.html

    • Clean and Build, Deploy và Test thử

    • Chúng ta vừa hoàn thành chức năng Update với việc mapping Action tường minh và không lệ thuộc vào rule đặt tên Action
  • Chúng ta thực hiện chức năng tạo account mới với validation theo yêu cầu
    • Chúng ta thực hiện tạo form trên trang createNewAccount.jsp
    • Sử dụng taglib struts2 với taglib s:head trong phần header để thông báo lỗi trong quá trình chương trình thực thi
    • Ở đây, thay vì mapping Action explicit với mức độ class level, chúng ta sẽ áp dụng Action trên mức độ method được chỉ định kích hoạt
    • Bên cạnh đó, chúng ta cũng thực hiện xử lý lỗi SQLException khi khóa chính nhập liệu bị trùng và method execute sẽ ném lỗi và chúng ta sẽ handle lỗi đó qua exception mapping
    • Mapping các handle lỗi trên form bằng các annotation và thực hiện mapping message lỗi động thông qua file properties
    • Chúng ta thực hiện tạo trang createNewAccount.jsp như sau

    • Thực hiện bổ sung việc insert dữ liệu mới xuống DB vào trong DAO

    • Chúng ta thực hiện tạo action class với tên CreateAccountAction – tên đầu của action viết in
      • Khai báo Results với tập Result trả về theo thứ tự
        • success – quay về trang login.html để thực hiện login nếu insert thành công
        • fail – quay qua trang inserter.html để thông báo lỗi
        • input – quay lại chính trang nhập liệu – createNewAccount.jsp - để   thông báo lỗi tương ứng
      • Để hỗ trợ validation, chúng ta phải dùng annotation trên các phương thức set của các thuộc tinh cần validation trong action class
      • Thực hiện mapping Action tường minh trong phương thức với @Action để không cần quan tâm cách đặt tên action
      • Thực hiện handle lỗi SQLException và chuyển lỗi đến result input để xử lý trực tiếp trên trang và trình bày lỗi

      • Sau khi định nghĩa xong phương thức execute
      • Phát sinh phương thức get/set của các thuộc tính tương ứng
      • Để thực hiện validation sử dụng annotations trong code mà không thông qua file cấu hình struts.xml, chúng ta định nghĩa validation cụ thể trên các phương thức set của các thuộc tính tương ứng để khi ứng dụng thực hiện sẽ bắt validation cho chúng ta
        • username là kiểu dữ liệu chuỗi phải bắt buộc có và chiều dài từ 6 đến 20
          • Bắt buộc có dùng @RequiredStringValidator với việc loại bỏ chuỗi dư thừa thông qua trim=true, message default để thống báo lỗi và key để mapping với message động được cấu hình trong file properties khi ứng dụng thực thi nhằm mục đích linh động trong việc thay đổi message
          • Bắt chiều dài sử dụng @StringLengthFieldValidator tương tự như bắt buộc nhưng có thêm 02 attribute minLeng và maxLength
        • password cũng là chuỗi bắt buộc có và kích thước từ 6 đến 30 được thiết lập tương tự như username
        • confirm là chuỗi nhưng phải áp dụng ONGL để check trùng với password nên chỉ áp dụng loại validation @FieldExpressionValidation với thuộc tính expression
        • lastname là chuỗi bắt buộc và kích thước từ 2 đến 50 được cấu hình tương tự username
      • Để mapping message động chúng ta tạo file properties với qui luật
        • Tên file là tên class Action đang xử lý (ở đây chính là CreateRecordAction)
        • Các thành phần trong file được tổ chức theo dạng Record, mỗi Record là một hàng với cấu trúc key=Message được viết
        • File được đặt tại cùng thư mục của Action class đang được xử lý

      • Khi thực thi, container reference tìm kiếm và apply nội dung message động. Nếu các key có định nghĩa mà không tồn tại mapping thì message default sẽ được trình bày
    • Chúng ta tạo trang inserter.html

    • Chúng ta thực hiện clean and build, deploy và test ứng dụng

    • Click vào link để chuyển sang trang tạo mới

    • Các quá trình testing được diễn ra với từng field validation như sau

  • Cấu trúc project cuối cùng như sau

Chúc mừng các bạn đã hoàn tất và nắm các khái niệm về sử dụng annotation trong Struts 2.x Framework, cách thức thiết kế, mô hình ứng dụng và cài đặt ứng dụng web theo các kiến thức bổ sung của  Struts2 Framework. Qua đó chúng ta thấy được thêm các ưu điểm và khuyết điểm của framework này. Qua bài này, chúng ta có nhiều lựa chọn hơn khi xây dựng ứng dụng struts2 framework với cách cấu hình hay dùng annotation hay kết hợp cả hai để tạo sự uyển chuyển khi lập trình

Chúng tôi hy vọng nội dung của bài này giúp ích các bạn trong việc cài đặt mô hình ứng dụng web với nhiều framework để tạo sự thuận lợi trong lựa chọn của quí vị. Chúng ta đã nghiên cứu và áp dụng một số kỹ thuật đặc biệt khi làm ứng dụng web với Struts2 Framework trong bài này.

Rất mong sự góp ý chân thành và chia sẻ của quí vị về vấn đề này. Hẹn gặp lại quý vị ở các chủ đề khác. Quí vị có bài đóng góp có thể gửi cho chúng tôi để đóng góp chia sẻ kiến thức đến mọi người về framework này. Chúng tôi sẽ đăng lên web và để đầy đủ tên của quí vị và vô cùng trân trọng sự đóng góp chia sẻ đó.

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

Đăng nhận xét