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

Mở rộng kiến thức về Struts 2 Framework – Interceptor và Validation, xây dựng ứng dụng mở rộng từ ứng dụng đầu tiên áp dụng các kiến thức về Struts 2 Framework để xây dựng ứng dụng tiếp cận với thực tế

Mở rộng kiến thức về Struts 2 Framework – Interceptor và Validation, xây dựng ứng dụng mở rộng từ ứng dụng đầu tiên áp dụng các kiến thức về Struts 2 Framework để xây dựng ứng dụng tiếp cận với thực tế

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 Interceptor và Validation để hỗ trợ xây dựng web với khả năng chuyển trang và giao tiếp giữa context trong ứng dụng và đảm bảo tính đúng đắn của người dùng khi nhập dữ liệu cho ứng dụng. Dựa trên khái niệm này, chúng ta sẽ áp dụng chúng để mở rộng ứng dụng đã được thực hiện trong bài Tổng quan về Struts2 Framework

Mở rộng kiến thức về Struts 2 Framework – Interceptor và Validation, xây dựng ứng dụng mở rộng từ ứng dụng đầu tiên áp dụng các kiến thức về Struts 2 Framework để xây dựng ứng dụng tiếp cận với thực tế

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 Interceptor và Validation để hỗ trợ xây dựng web với khả năng chuyển trang và giao tiếp giữa context trong ứng dụng và đảm bảo tính đúng đắn của người dùng khi nhập dữ liệu cho ứng dụng. Dựa trên khái niệm này, chúng ta sẽ áp dụng chúng để mở rộng ứng dụng đã được thực hiện trong bài Tổng quan về Struts2 Framework

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

Khái niệm về Interceptor

  • Interceptor là một khái niệm hoàn toàn giống Filter trong khái niệm cơ bản của Servlet, chúng giúp cho việc xây dựng ứng dụng hoàn toàn trở nên linh hoạt và uyển chuyển.
  • Chúng ta đơn giản nghĩ khái niệm filter với fil cà phê giúp lọc cà phê và đặc biệt khả năng lọc 02 chiều đảm bảo lọc được cả request và response
  • Trong quá trình xây dựng ứng dụng, nếu thay đổi nâng cấp ứng dụng đòi hỏi phải thay đổi và chỉnh sửa source code, do vậy nếu áp dụng filter hay interceptor, chúng ta có thể bổ sung việc nâng cao chức năng cho ứng dụng mà không cần thay đổi code mà chỉ cần xen ngang hay đưa filter vào trước các thành phần thực thi tương tự như chen them fil để lọc cà phê cho ngon hơn
  • Ở đây interceptor được kích hoạt trước khi action được kích hoạt và sau khi action xử lý hoàn tất thao tác nghĩa là nó giống như thành phần xử lý của filter và áp dụng đầy đủ các tính chất của filter như
    • Hỗ trợ kiểm tra về bảo mật, validation cho người dùng
    • Upload dữ liệu lên server
    • Và một số tính năng khác
  • Interceptor khi sử dụng phải được khai báo trong thành phần của tập tin struts.xml và được reference trong thành phần cụ thể của từng action được ứng dụng
    • Cú pháp

<action name=”tên action“ class=”tên class có đầy đủ package“>

  <interceptor-ref name=”tên stack interceptor hay tên interceptor” />

  …

  <result name=”control action”>đường dẫn đến tập tin jsp hay result của action</result>

  …

</action>

  • Stack interceptor là một tên để thay thể cho một nhóm các interceptor được sử dụng cho một mục đích cụ thể để tránh lập đi lập lại dài dòng trong lúc quá trình lập trình
  • Struts2 Framework hỗ trợ một số Interceptor Stack sẵn có để hỗ trợ sự thuận tiện cho người dùng trong việc xây dựng ứng dụng web

Interceptor Stack

Mô tả

validationWorkflowStack

Hỗ trợ cho việc validation và toàn bộ qui trình xử lý

fileUploadStack

Hỗ trợ cho upload dữ liệu

chainStack

Hỗ trợ cho giao tiếp giữa các thành phần trong cùng context của ứng dụng

defaultStack

Cung cấp cơ chế lưu trữ và xử lý cùng với debug

executeAndWaitStack

Cung cấp chơ chế hỗ trợ cho upload dữ liệu

 

  • Ở đây chúng tôi sẽ mô tả chi tiết Interceptor Stack của chainStack
    • Copy tất cả object trong ValueStack của action hiện hành đến ValueStack của action kế tiếp được thực thi trong khi thực hiện action kèm theo interceptor chain
    • Cú pháp

<action name=”action” class=”actionClass“>

  <interceptor-ref name=”interceptor1” />

  <result name=”success” type=”chain”>action1</result>

  <result name=”error”>/path1</result>

</action>

    • Dạng này được áp dụng trong các ứng dụng mà người dùng muốn duy trì giá trị form truyền dữ liệu từ request đầu tiên cho đến action cuối cùng xử lý tương tự như RequestDispatcher

Validations

  • Tiếp theo chúng tôi sẽ giới thiệu về cơ chế validation trong Struts2 Framework
  • Struts2 hỗ trợ các thành phần sẵn có cho việc validation để nhằm khắc phục tính phức tạp cho người dùng khi viết code cho validation tương tự như Struts1 Validation Framework
  • Struts2 hỗ trợ việc validation ở cả 02 phía client lẫn server
  • Strust2 cũng hỗ trợ 02 cơ chế cho việc validation
    • Thực hiện cài đặt validator cho phép người dùng code tạo nên validation
    • Sử dụng validator framework thông qua interceptor do Struts2 Framework cung cấp và thực hiện khai báo qua tập tin xml
  • Để thực hiện validation với cài đặt validator, người lập trình cần thực hiện một số nội dung như sau
    • Action class phải kế thừa từ ActionSupport và/ hoặc cài đặt thêm interface ValidationAware để trong action cài đặt hàm validate
    • Việc cài đặt ValidationAware để hỗ trợ người dùng về các message khi thực hiện thông báo lỗi và kích hoạt các interceptor trong hỗ trợ xử lý
    • Cơ thế làm việc của workflow Interceptor
      • Khi người dùng nhập liệu và nhấn submit form để gửi dữ liệu về server thì workflow Interceptor được kích hoạt
      • Interceptor này kiểm tra xem action có cài đặt validation hay không, nếu có thì nó kích hoạt hàm validate
      • Nếu có lỗi xảy ra thì validator sẽ tạo ra các error message và add vào thành phần hỗ trợ bởi ValidationAware, cụ thể là hasErrors, để từ hàm này, nếu có các message thì ứng dụng hay action sẽ bị ngắt ngang và đưa thông báo lỗi về phía người dùng
    • Các bước thực hiện

§  Step 1

        • Tạo tất các các view cho ứng dụng với trang jsp
        • Trong các view có các form cần validation, Taglib <s:head />  bắt buộc phải được đặt trong phần header để hỗ trợ trình bày các message error khi lỗi phát sinh vì s:head hỗ trợ phát sinh các thành phần liên quan đến css và javascript khi báo lỗi về phía client

§  Step 2

        • Tạo action class extends từ class ActionSupport
        • Cài đặt hàm validate()
        • Trong quá trình viết code xử lý lỗi, xử dụng hàm addFieldError(String fieldName, String errorMessage) để add lỗi cho ValidationAware
          • Tham số fieldname trùng tên với các thuộc tính cần validation trong action form

§  Step 3: Cấu hình tập tin struts.xml với giá trị đặc biệt result tên là input và trang thông báo lỗi được xác định (thông thường chính là view nhập liệu)

  • Áp dụng validation với Validator Framework
    • Có 02 loại validators
      • Field Validators
        • Một field hay thuộc tính trong action class
        • Cấu hình trong tập tin xml
          • Tên tập tin xml cấu hình validation có dạng TênActionClass-validation.xml
          • Đặt tại package của cùng action xử lý của view có áp dụng validation
          • Mỗi tag <field-validator> phải định nghĩa các thành phần sau
          • Cú pháp

<validators>

  <field name=“tên property cần validation”>

   <field-validator type=”validator được hỗ trợ để bắt lỗi cho field name ở trên”>

      <param name=”tên tham số trong lúc xử lý lỗi như minLength, maxLength”>giá trị</param>

      …

      <message key=”Tên key để tìm ra message tương ứng khi trình bày lỗi”/>

    </field-validator>

   </field>

   ...

</validators>

§  Non-Field Validators

        • Hỗ trợ validation trên một biểu thức, áp dụng nhiều hơn trên một field
        • Kết hợp trình bày sử dụng OGNL để bắt validation
      • Một số validator được Struts2 Framework cung cấp

Validator

Các tham số được dùng

Mô tả

required

Kiểm tra giá trị khác null

requiredstring

trim

Kiểm tra giá trị khác null và khác rỗng và hỗ trợ cắt chuỗi với tham số trim. Mặc định tham số trim được set là true

stringlength

trim, minlength, maxlength

Kiểm tra chuỗi trong khoảng min và max

int

min, max

Kiểm tra số nguyên trong khoảng min và mac

double

minInclusive, maxInclusive, minExclusive, maxExclusive

Kiểm tra số double  trong khoảng min và mac

url

Kiểm tra địa chỉ url

date

min, max

Kiểm tra định dạng ngày trong khoảng min và mac. Định dạng ngày mặc định là MM/DD/YYYY

email

 

Kiểm tra định dạng địa chỉ email

fieldexpression

expression()

Đánh giá biểu thức OGNL dựa trên giá trị ValueStack hiện hành để đưa ra kết quả true hay false

regex

expression(), caseSensitive, trim

Kiểm tra chuỗi regular expression

expression

expression()

Kiểm tra chuổi tương tự như fieldexpression

 

    • Các bước thực hiện cài đặt ứng dụng áp dụng Validator Framework của Struts2
      • Bước 1: Tạo tất cả các trang view sử dụng JSP và sử dụng tag <s:head/> như cài đặt với bước 1 trong cài đặt validator với code
      • Bước 2: Tạo Action class tương tự như bước 2 trong cài đặt validator với code
      • Bước 3: Tạo tập tin xml để khai báo nội dung validation với tên file TênActionClass-validation.xml
        • Khai báo và thiết lập các rang buộc cho các thuộc tính trong Action cần validation và trong các trang form của JSP
      • Bước 4: Tạo tập tin property file có tên Te6nActionClass.properties dùng để khai báo các error message với các key được xác định trong Bước 3
      • Step 5: Cấu hình tập tin struts.xml
        • Khai báo thêm giá trị đặc biệt trong result là input với trang thông báo lỗi
        • Tham chiếu đến các interceptor mà Struts2 cung cấp để hỗ trợ validation như sau
          • params: Tham chiếu đến interceptor tên ParametersInterceptor giúp hỗ trợ thiết lập và truy cập tham số đến ValueStack
          • validation: Tham chiếu đến interceptor tên Validation để hỗ trợ kiểm tra dựa trên tập tin cấu hình xml ở Bước 3 để hỗ trợ kiểm tra validation trong ứng dụng
          • workflow: Tham chiếu đến interceptor workflow để hỗ trợ qui trình áp dụng validation trong ứng dụng

Vận dụng các kiến thức nâng cao về Struts 2 Framework (Interceptor và Validation) 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 mở rộng nội dung bài tổng quan về Struts2 framework) để 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 của bài tổng quan về Struts2 framework đang dừng ở 02 chức năng là login và search với giá trị gần dung ở field lastname. Ở đây ứng dụng tiếp tục mô tả vài chức năng để nâng cấp ứng dụng đó như sau
    • Ứng dụng yêu cầu bổ sung thêm chức năng validation khác null cho ứng dụng khi thực hiện login. Chương trình sẽ thông báo lỗi khi người dùng login mà không nhập giá trị gì cả
    • Hệ thống cho phép người dùng sau khi search xong có thể thực hiện trực tiếp update password và role của một account được lựa chọn hay thực hiện delete một account cụ thể ngay trên lưới của kết quả tìm kiếm
    • 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, email address và số telephone
      • 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 30 ký tự

·         Field password có kích thước từ  6 đến 20 ký tự

·         Field last name có kích thước từ  6 đến 50 ký tự

·         Field email address phải tuân đúng chuẩn email

        • Field telephone phải tuân thủ dạng 00.00000000 nghĩa là có 2 số đầu mã vùng và 8 số điện thoại
  • Ở đây chúng tôi hướng dẫn trước việc sử dụng Struts2 config để chúng ta làm quen với Struts2. Các bài tiếp theo chúng tôi sẽ mở rộng hơn về annotation. Trong bài chúng tôi sẽ thể hiện đầy đủ 02 cách thức validation bằng code lẫn bằng validator.
  • 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
    • JDK 6 update 22
    • Server: Tomcat 6.0.26
    • DBMS: SQL Server 2005
    • Thư viện hỗ trợ: Driver kết nối database SQLServer (sqljdbc.jar hay sqljdbc4.jar), Struts2 Framework taglib
    • Tool Netbeans 6.9.1 phải hỗ trợ Struts2
  • Chúng ta thực hiện chức nâng cấp chức năng Login tương tự bài tổng quan về Struts2 Framework nhưng có hỗ trợ validation bằng cách cài đặt validator class như sau
    • Chúng ta chỉnh sửa trang index.jsp đã làm trong bài trước nhưng bổ sung thêm tag s:head để hỗ trợ thông báo lỗi

      • Chỉnh sửa LoginAction bằng cách cài đặt extends từ ActionSupport và cài đặt hàm validate
        • Trong hàm validate bắt username và password phải khác null nghĩa là kích thước phải lớn hơn 0 vì OGNL EL sẽ ép kiểu null thành kiểu chuỗi
        • Ngoài ra, nhập username nhỏ hơn 4 cũng phải báo lỗi
        • Khi vi phạm điều kiện chúng ta tạo message cùng với các key được add thông qua hàm addFieldError

      • Thực hiện chỉnh sửa bổ sung tập tin struts.xml như sau
        • Bổ sung thêm result với giá trị input và đường dẫn đến chính trang index.jsp để khi có lỗi về nhập xuất không đúng theo điều kiện ràng buộc sẽ quay ngược lại trang index.jsp báo lỗi với hỗ trợ của tag s:head

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

        • Nhấn nút Login mà không nhập gì cả

        • Thực hiện nhập username nhỏ hơn 4 ký tự và nhấn nút Login

        • Nhập đúng thì chương trình sẽ chuyển sang form search

      • Chúng ta đã hoàn tất chức năng Login có hỗ trợ validation bằng cách coding trực tiếp vào Action Class với Struts2 Frameworks
  • Chúng ta thực hiện chức năng delete cho ứng dụng
    • Chúng tôi thực hiện chức năng delete bằng link kết hợp giữa action class và interceptor để truyền dữ liệu sau khi delete thành công sẽ quay lại chính trang search với giá trị cũ để tạo cảm giác cho người dùng về lưới refresh. Ở đây, chúng tôi sẽ áp dụng chain interceptor
    • Chúng ta sẽ thay đổi cập nhật bổ sung trang show.jsp với link delete
      • Sử dụng s:url để tạo ra link tương tự như JSTL 1.1 với tag core c:url
      • Trong url lưu lại giá trị sử dụng OGNL, đây là giá trị truy cập trực tiếp từ action class hay bean cho nên chúng ta không dùng bất kỳ ký hiệu % hay # gì cả
      • Khi đưa url được tạo vào link thì chúng ta mới cần xác định biến trong ValueStack bằng dầu %

      • Chúng ta thực hiện tạo Action Class với tên DeleteAccountAction của package sample.struts2

      • Trong hàm execute của action class trên, chúng tôi có sử dụng hàm xây dựng delete trong class DBOperations như sau

    • Chúng ta thực hiện cấu hình cho tập tin struts.config với các result nhưng để truyền giá trị từ ValueStack hiện hành, sau khi thực thi lại vẫn lưu lại giá trị để truyền đến Action Search để Search lại lần nữa, chúng ta phải sử dụng interceptor chain với khai báo type trong result

    • Clean and Build, Deploy và Test ứng dụng đến chức năng Search

      • Nhấn link Delete, kết quả hiển thị như sau

    • Chúng ta đã hoàn tất chức năng Delete áp dụng taglib của Struts2 Framework và Interceptor chain với thành phần truy xuất và giao tiếp với các thành phần trong các ứng dụng thông qua ValueStack
  • Chúng ta thực hiện chức năng Update với nút lệnh, và lần nữa chúng ta sẽ thực hiện chức năng này với Interceptor chain
    • Thực hiện thay đổi trang show.jsp bổ sung nút lệnh Update
    • Thay đổi password thành control hỗ trợ password với taglib s:password của Struts2. Lưu ý, password là control không cho phép hiển thị giá trị, do vậy để đón nhận và hiển thị giá trị của password thành các ký tự đặc biệt, chúng ta cần thiết lập thuộc tính showPassword đến true
    • Bổ sung hidden form với s:hidden với 02 giá trị username và giá trị search của form Search để thực hiện chain trong action Search sau khi update thành công. Lưu ý: vì giá trị được truy cập được đưa vào control, chúng ta phải dùng OGNL để access giá trị và biến thành chuỗi đưa vào control do vậy phải dùng ký hiệu %
    • Bổ sung form với taglib s:form để truyền dữ liệu vào valueStack đưa đến action để xử lý
    • Để form của Struts2 đưa vào form của người lập trình không bị bể form vì bản chất s:form của Strus2 được hỗ trợ css và table html do vậy chúng ta phải thiết lập thuộc tính theme đến simple để không phát sinh table lần nữa gây bể form trong lúc hiển thị

    • Chúng ta thực hiện action tên UpdateAccountAction đặt trong sample.struts2 để thực hiện chức năng Update

      • Ở đây chúng tôi thể hiện ví dụ để yêu cầu Struts2 Framework gọi hàm update thay vì hàm mặc định là hàm execute để cho thấy tính linh động của Framework này
      • Trong hàm update, chúng tôi gọi hàm updateAccount được xây dựng trong class DBOperations như sau

      • Chúng ta thực hiện tập tin struts.xml
        • Trong phần action chúng ta thực hiện xác định điều hướng gọi hàm xử lý bằng cách thiết lập tham số method đến tên hàm
        • Thực hiện áp dụng interceptor chain để có thể thực hiện lại chức năng Search sau khi Update

      • Clean and Build, Deploy và Test ứng dụng đến chức năng Search

        • Thay đổi giá trị, thêm số 1 password, gỡ check Roles và nhấn nút Update

      • Chúng ta thực hiện hoàn tất chức năng Update với một số kỹ thuật đặc biệt được áp dụng trong ứng dụng
  • Chúng ta thực hiện chức năng Register – đăng ký cho ứng dụng
    • Bổ sung link Register vào trang index.jsp

    • Tạo trang register.jsp với các control như yêu cầu đề bài, trong đó các control yêu cầu nhập liệu bắt buộc thì thuộc tính required sẽ bật lên thành true

    • Tạo trang fail.jsp để thông báo lỗi
      • Trong đó thực hiện truy cập valueStack để truy cập các Attribute của request để lấy thông tin báo lỗi nếu có trong quá trình xử lý để in ra thông báo cho người dùng

      • Tạo action có tên RegisterAction đặt trong package sample.struts2
        • Extends từ ActionSupport class và cài đặt ValidationAware

        • Trong hàm execute, thực hiện gọi hàm insertAccount của class DBOperations như sau
          • Trong quá trình xử lý áp dụng cơ chế của Struts2 Framework để truy cập và cập nhận request của valueStack trong bài Tổng quan về Struts 2 Framework để thực hiện lưu trữ và chuyển lỗi cho người dùng nếu có

      • Tạo tập tin cấu hình về validation theo dạng tên ActionClass-validation.xml. Ở đây sẽ tạo tập tin RegisterAction-validation.xml đặt tại package sample.struts2
        • Sử dụng các thành phần validator kết hợp cú pháp để khai báo các field cùng tham số trong bảng tra của validator đã nêu trong phần lý thuyế

      • Tạo tập tin properties có tên ActionClass.properties để khai báo các message tương ứng với các message key đã được khai báo trong tập tin validation.xml ở trên. Ở đây sẽ là RegisterAction.properties đặt tại package sample.struts2

      • Cấu hình tập tin struts.xml với action đặc biệt input như lập trình validation trong Action class nhưng phải reference đến 03 interceptor của Struts2 Framework, cụ thể là params, validation và workflow

      • Cấu trúc project hiện hành như sau

      • Clean and Build Project, Deploy và Test

        • Nhấn nút register

        • Nhập tên nhỏ hơn 6 ký tự

        • Tương tự cho nhập tên nhiều hơn 30 ký tự
        • Nhập tên đúng

        • Tương tự cho password, lastname
        • Nhập email sai

        • Nhập phone nhưng nhập không đúng định dạng

        • Nhập đúng nhưng nhập confirm password sai

      • Nhập đúng  và nhấn register

Chúc mừng các bạn đã hoàn tất và nắm các khái niệm về interceptor cùng validation 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 các ưu điểm và khuyết điểm của framework này. Ở đây chúng ta mới đi về cơ bản và cấu hình bằng struts.xml

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 liên quan đến Struts2 Framework trong việc sử dụng annotation để cấu hình

1 nhận xét:

  1. Bài viết chất lượng và chi tiết, cám ơn thầy Khánh

    Trả lờiXóa