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

Tổng quan về Struts 2 Framework – một Framework hỗ trợ xây dựng ứng dụng Web áp dụng MVC Pattern nâng cao từ Struts 1.x Framework, xây dựng ứng dụng đầu tiên áp dụng Struts 2 Framework

Tổng quan về Struts 2 Framework – một Framework hỗ trợ xây dựng ứng dụng Web áp dụng MVC Pattern nâng cao từ Struts 1.x Framework, xây dựng ứng dụng đầu tiên áp dụng Struts 2 Framework

Mục đích: Chủ đề của bài này đề cập đến khái niệm tổng quát của Struts 2.x Framework. Chúng tôi sẽ tiếp cận tổng quát khái niệm từng thành phần của Struts dựa trên tổng quát mô hình MVC Pattern và nền tảng căn bản của Struts1 Framework để chúng ta tiếp cận Framework này một cách nhanh chóng dự trên kiến thức cơ bản mà chúng ta đã có về Struts 1. Dựa trên khái niệm này, chúng ta sẽ áp dụng Struts 2 Framework này trong phần phân tích và thiết kế ứng dụng web cụ thể để thấy rõ cách thức thiết kế, cách cài đặt ứng dụng cụ thể sử dụng Struts 2 trong việc xây dựng ứng dụng Web

Tổng quan về Struts 2 Framework

  • Đây là Framework hỗ trợ thiết kế và xây dựng ứng dụng web theo mô hình MVC 2 thông qua việc cung cấp hàng loạt các thư viện và tiện ích để hỗ trợ người dùng phát triên ứng dụng Web theo mô hình MVC một cách nhanh chóng và dễ dàng
  • Struts 2 Framework hỗ trợ việc xây dựng ứng dụng Web theo mô hình MVC2 nhưng đơn giản hóa hơn mô hình Struts 1 Framework như là rút gọn tập tin cấu hình hay sử dụng annotation thay thế cho tập tin cấu hình
  • Một số đặc tính cải tiến của Strut2 Framework
    • JavaBeans được sử dụng thay thế Action form và có phương thức chỉ định để kích hoạt thực thi (mặc định là phương thức execute không có tham số truyền và kiểu trả về là kiểu String) nhằm tăng khả năng tái sử dụng của các object trong các ứng dụng và các framework khác. Đặc biệt, chúng dễ dàng thuật tiện cho testing từng thành phần chức năng và thành phần
    • Sử dụng cả annotation và tập tin cấu hình XML rút gọn
    • Sử dụng ngôn ngữ mới Object Graphic Notation Language (OGNL) thay thế cho EL của JSP
    • Sử dụng bộ taglib duy nhất thay cho 4-5 bộ taglib trong Struts 1 Framework và JSTL 1.1 trong JSP
  • Để nhanh chóng tiếp cận Struts2 chúng ta sẽ so sánh điểm khác biệt trên Struts1

Struts 1

Struts 2

Sử dụng ActionServlet làm Controller

Sử dụng FilterDispatcher làm Controller

Dùng HTML form kết hợp với ActionForm object để đón nhận giá trị nhập và xử lý validation nếu cần

Các thuộc tính trong Action class (cụ thể là Java class) để đón nhận giá trị nhập từ form và thực hiện xử lý cùng với validation nếu cần

Action bắt buộc implement Action interface

Action class không cần bắt buộc implement Action interface

Duy nhất một instance của Action đón nhận để xử lý mọi request. Cơ chế để đảm bảo xử lý đồng bộ (thread-safe) đòi hỏi phức tạp hơn

Một request sẽ có một instance đón nhận xử lý

Cung cấp rất nhiều taglib gây khó khăn cho người dung khi tiếp cận và sử dụng

Cung cấp duy nhất một taglib duy nhất đảm bảo đầy đủ các thành phần hỗ trợ xử lý từ đơn giản đến nâng cao, kể cả JSTL

Sử dụng EL và JSTL

Sử OGNL để xử lý

Dùng cơ chế biên dịch của JSP để kết nối các thành phần trong xử lý

Sử dụng ValueStack để cho phép taglib truy vập giá trị trong quá trình xử lý

Chia thành module để chuyển đổi thao tác và đòi hỏi kết hợp của switchAction để tạo sự kết hợp giữa các thành phần khi làm việc theo nhóm

Sử dụng cơ chế interceptor để đảm bảo tích hợp nhiều thành phần và nâng cấp ứng dụng một cách uyển chuyển linh hoạt, đặc biệt là tích hợp mà không làm ảnh hưởng các thành phần có sẵn khi làm việc theo nhóm

  • Cơ chế hoạt động tương tự như mô hình MVC của Struts1 Framework nhưng điểm khác biệt nó là pull-framework nghĩa là dữ liệu được lấy trực tiếp từ action để đưa đến view
    • Controller: FilterDispatcher là servlet Filter có nhiệm vụ đón nhận request và dựa trên cấu hình (có thể là xml hay annotation) để xác định action cụ thể để đón nhận request cho xử lý
    • Model: Action là một java class đảm bảo đặc tính của một object trong mô hình hướng đối tượng và thỏa tính chất của JavaBean
    • View: Result là một kết xuất hay một dạng xác định action hay trang chuyển về và trình bày trên Web Browser
  • Cơ chế hoạt động của Struts 2 Framework

    • Khi user gửi yêu cầu truy xuất ứng dụng web, request được chuyển đến FilterDispatcher, đây là Filter được tạo sẵn trong Framework để làm chức năng như Controller
    • FilterDispatcher dựa trên tập tin cấu hình xác định xem action có được ứng dụng Interceptor hay không
    • Nếu có, framework sẽ gọi Interceptor theo tuần tự. Khi gọi xong một Interceptor, framework sẽ checking tiếp Interceptor trong stack cho đến khi Interceptor cuối cùng
    • Nếu không có áp dụng interceptor hay interceptor cuối cùng được thực thi thì framework sẽ gọi action
    • Action đón nhận dữ liệu, thực hiện xử lý và kích hoạt phương thức chỉ định thực thi (mặc định là phương thức execute – người dùng có thể định nghĩa phương thức tên khác và chỉ định trong tập tin cấu hình)
    • Sau khi hàm execute xử lý hoàn tất, phương thức sẽ trả ra Result – có thể nhãn tương tự như ActionMapping bên Struts1.
    • Tại bước này, nếu ứng dụng có áp dụng interceptor là Result sẽ được apply theo chiều ngược chiều gọi ban đầu để trả kết quả trở về hay chuyển đến action tiếp theo
  • Nhìn tổng quan mô hình hoạt động giống hoàn toàn khái niệm Struts1 và MVC2, điểm khác biệt ở đây là tất cả mọi thứ phải thông qua struts.xml hay annotation và một phần nào đó Struts che dấu FilterDispatcher đối với người lập trình để tạo nên tính linh hoạt trong việc xây dựng và bảo trì ứng dụng  Web, đặc biệt là việc mapping kết xuất giữa các trang không còn lệ thuộc và đặt trong code servlet dẫn đến việc mapping trở nên linh hoạt và uyển chuyển hơn
  • Điểm đặc biệt của Struts2 áp dụng FilterDispatcher so với Struts1 với Action Servlet theo đánh giá chủ quan của tác giả bài viết là Filter có thể lọc 02 chiều so với Servlet và đặc biệt làm giảm tải việc xử lý cuối cùng và nó cũng là điểm ứng dụng của DispatcherAction trong Struts1

Struts-Action.tif

  • Các thành phần chính yếu và thường dùng của Struts2 Framework
    • FilterDispatcher
      • Khởi tạo Action class
      • Thực thi phương thức chỉ định theo tập tin cấu hình hay annotation
      • Đọc giá trị string trả về sau khi thực thi để xác định result hay view về phía người dùng
      • Trong quá trình thực thi, Filter thực hiện
        • Tìm kiếm phương thức execute() hay phương thức được chỉ định trong cấu hình
        • Phát sinh result hay view tương ứng dựa trên kết quả String trả về của hàm execute hay phương thức chỉ định
      • Cú pháp mapping trong web.xml

<filter>

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

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

</filter>

<filter-mapping>

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

    <url-pattern>/*</url-pattern>

</filter-mapping>

    • Action Class hay ActionSupport Class
      • Chứa đựng các thuộc tính mapping trên form và các thành phần xử lý của object (business logic) và phương thức chỉ định thực thi
      • Là java class bình thường và không cần thiết phải extends Action hay ActionSupport class
      • Struts2 Framework cung cấp cơ chế tự động mapping các tham số trong request trong form đến các thuộc tính trong Action với các thuộc tính cùng tên và có phương thức setXxx
        • Trong quá trình mapping struts2 framework sử dụng OGNL thay thế EL để ép kiểu tự động từ form đến kiểu dữ liệu của Action property – do vậy, không nhất thiết lúc nào cũng khai báo kiểu dữ liệu là String và thực hiện ép kiểu bằng tay
    • Struts Config (struts.xml)

<!DOCTYPE struts PUBLIC “-//Apache Software Foundation//DTD Struts Configuration 2.0//EN” “http://struts.apache.org/dtds/struts-2.0.dtd”>

  <struts>

      [<include file=”xml File”/>]

         <package name=”default” namespace=”/” extends=”struts-default” [method=”method_name”]>

            <action name=”action_Name” class=”package.className”>

                   <result name=”stringValue”>/pageView</result>

                   …

            </action>

       </package>

   </struts>

      • package: nhóm thông tin cấu hình của những thành phần có chung thuộc tính
        • name: xác định tên của package
        • namespace: phân biệt giữa các package khác tránh xung đột giữa các action với nhau
        • extends: xác định class cha tương tự như khái niệm kế thừa
        • abstract: bằng true nếu lớp là kế thừa
      • action: ánh xạ một action với một class action
        • name: xác định tên action
        • class: xác định java class để xử lý action
        • method: xác định phương thức được gọi khi request được chuyển tới. Nếu tham số này không tồn tại thì phương thức execute mặc định được tìm kiếm và thực thi
      • result: xác định tên result hay page kết xuất của một action
        • name: xác định tên result. Nếu không có mặc định là giá trị success
        • type: xác định loại result. Nếu không có mặc định là FilterDispatcher thực hiện forward đến trang kết quả
          • chain: chuyển đến action tiếp theo và copy giá trị đế valueStack và chuyển sang Action mới
          • redirect: chuyển trang như gọi response.sendRedirect
          • redirectAction: chuyển đến Action khác sử dụng phương thức response.sendRedirect
      • include: Cho phép nhúng nhiều module hay tích hợp nhiều module vào trong ứng dụng
        • file: xác định tên file được include vào tập tin struts.xml
      • ActionSupport class mở rộng từ Action và được hỗ trợ validation và I18n và nhiều thành phần khác vì nó được implement từ nhiều thành phần như Validateable, ValidationAware, TextProvider, LocalProvider, and Serializable interfaces
    • Result và ResultType
      • Result được gửi làm hai thành phần
      • Result
        • Định nghĩa action tiếp theo trong việc xử lý khi Action hoàn tất xử lý
      • Result type
        • Xác định chi tiết của việc chuyển Result như chain, redirect, redirectAction, …

    • Ví dụ

          Action

public class TestAction

  ...

  public String execute(){

    if (username.equals(“admin”)) {

       setMessage(MESSAGE + getUserName());

       return “success”;

    } else {

       return “error”;

    }

  }

}

          struts.xml

...

<action name=” testAction“ class=”example.TestAction“>

     <result name=”success”>/example/DisplayDetails.jsp</result>

     <result name=”error”>/example/error.jsp</result>

</action>

...

    • ValueStack
      • Stack lưu trữ object trong Frameworks và các thành phần trong một request
      • Hỗ trợ người dùng sử dụng taglib truy cập các giá trị trong ValueStack
      • Cung cấp cho việc truy cập liên quan đến context hiện hành làm việc từ request, session đến application …
      • Các thành phần của Action cùng các thuộc tính của nó sẽ được lưu trong Value Stack với kiểu là object Stack (xem như là truy cập trực tiếp vào Action không cần chỉ định đối tượng) và có thể truy cập thuộc tính trực tiếp của Action (Các giá trị trùng tên nhau thì giá trị cao nhất trong stack được truy cập). Khi truy cập các giá trị này thì không cần phải dùng ký hiệu gì cả
      • Các thành phần attribute hay scope, hay các đối tượng khác trong servlet container sẽ được đưa thành context object (hay context map). Do đó, muốn truy cập những đối tượng này cần xác định cụ thể tầm vực với ký hiệu dấu # ở trước

      • Một số đối tượng mặc định của ValueStack

    • ActionContext
      • Vùng lưu trữ tổng để chứa tất cả dữ liệu liên quan đến request và nằm hoàn toàn trong trong ValueStacks
      • Khi dữ liệu được truyền đến container hay struts 2 framework thì interceptor params hỗ trợ trích xuất dữ liệu và đưa cặp name và value của parameter vào ValueStack
      • Ví dụ

      • Do vậy, để truy cập vào ValueStacks của các đối tượng thuộc context Object, chúng ta phải truy xuất thông qua ActionContext
    • Một số taglib hỗ trợ, chúng ta sẽ tiếp cận trong các thành phần cụ thể trong từng ứng dụng trong từng bài
      • Về giao diện có hỗ trợ đầy đủ các control trình bày giao diện, đặc biệt các control hỗ trợ thuộc tính label cho phép developer đính kèm theo control là nhãn trình bày mà không cần phải tốn công ghi tên nhãn trước control
      • Ngoài ra, về form, mặc định form của taglib sẽ phát sinh ra dạng table cùng với layout để trình bày form với đầy đủ các thành phần của css cùng javascript để hỗ trợ cho việc xử lý và trình bày. Do vậy, để đơn giản form và việc phát sinh form tự động chúng ta áp dụng thuộc tính theme=”simple” để form phát sinh mà không apply template hay layout phức tạp dẫn đến tình trạng bể form khi xử lý giao diện đặc biệt trong table
      • Để hỗ trợ trình bày hay in dữ liệu từ thuộc tính của action hay JavaBean, Struts 2 taglib cung cấp tag property
      • Vì tích hợp các tag của JSTL để không còn sử dụng JSTL, các tag trong struts 2 tương tự JSTL ngoại trừ tag forEach và forToken được thay bằng iterator. Hơn thế nữa tag if đã có elseif và else, ….
  • OGNL
    • Viết tắt của Object Graph Navigation Language 
    • Hỗ trợ tương tự như EL của JSP nhưng cho phép truy cập ValueStack thay đổi giá trị trong ValueStack lẫn trong JavaBean (EL chỉ cho phép truy cập không cho thay đổi)
    • Loại dữ liệu của OGNL thường là Map.
    • Trong expression, chúng ta có thể truy cập trực tiếp thành phần dùng OGNL mà không cần phải có ký hiệu đặc biệt gì cả, đơn giản rất nhiều so với EL. Lưu ý, các thành phần này phải nằm trong context mặc định của ứng dụng như root. Trong Struts2, context cao nhất là ActionContext hay các object được tạo từ JavaBeans.
    • Để reference đến thành phần object bên trong hay khác root, chúng ta phải dùng dấu #. Ví dụ như để truy cập thuộc tính USER trong session, chúng ta phải truy cập #session.USER
    • Để định trị giá trị 1 cách chính xác, chúng ta dùng cú pháp %{} thay cho ${} trong EL. Đối với thành phần trong JavaBean chúng ta có thể ghi trực tiếp tên thuộc tính mà không cần cú pháp nêu trên
  • Truy cập HttpServletRequest
    • Chúng ta có 02 cách: truy cập từ ActionContext hay implement class với ServletRequestAware
      • Để truy cập từ ActionContext trong code Java

HttpServletRequest request = ServletActionContext.getRequest();

      • Implement class action với ServletRequestAware, chúng ta
        • Khai báo biến HttpServletRequest request;
        • public HttpServletRequest getServletRequest() { return this.request; }
        • Gọi hàm getServletRequest khi cần truy cập request
  • Truy cập HttpSession
    • Chúng ta có 02 cách: truy cập từ ActionContext hay implement class với SessionAware
      • Để truy cập từ ActionContext trong code Java

Map attibutes = ActionContext.getContext().getSession();

      • Implement class action với SessionAware, chúng ta
        • Khai báo biến Map session;
        • Public Map getSession() { return this.session; }
        • Gọi hàm getSession khi cần truy cập request
  • Các bước thực hiện xây dựng ứng dụng web áp dụng Struts2 Framework
    • Bước 1: Tạo ứng dụng project Web application
      • Chọn Web Servers hỗ trợ JavaEE và có hỗ trợ JavaEE 5
      • Chọn hay đưa các thành phần hỗ trợ Struts 2 Frameworks
    • Bước 2: Tạo tất cả giao diện cho ứng dụng – trang JSP
    • Bước 3: Tạo tất cả action class để đón nhận xử lý
      • Định nghĩa các thuộc tính theo form nhập liệu trong các view từ bước 2 và định nghĩa đầy đủ get và set cho chúng
      • Cài đặt phương thức execute()  hay bất kỳ thực hiện xử lý cho action khi có yêu cầu
    • Bước 4: Cấu hình tập tin struts.xml hay thiết lập kết nối bằng annotation giữa View và Action
    • Step 5: Build, Deploy và Test ứng dụng

Vận dụng Struts 2 Framework 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 nội dung tương tự bài trên Struts1 framework hay MVC Pattern trên Web – Mô hình thiết kế ứng dụng theo dạng Model – View – Controller để cho thấy việc phân tích MVC có lợi, đặc biệt khi áp dụng trên một framework cụ thể như Struts)

  • Ứng dụng ở đây mô tả việc xây dựng một ứng dụng cung cấp chức năng như sau
    • Ngưởi dùng muốn truy cập vào hệ thống phải thực hiện login để kiểm tra username và password có hợp lệ hay không
    • Hệ thống thông qua DB kiểm tra tính xác thực của dữ liệu
      • Nếu username và password không chính xác hay không tồn tại ứng dụng thông báo cho người dùng thông tin “Invalid username and password” và cho người dùng trở về trang Login thông qua một Link có tên là try again và cung cấp một Link Register cho phép người dùng đăng ký một account mới
      • Nếu user tồn tại thì chương trình bày form Search. Đặc biệt, trên đầu trang phải sử dụng session để lưu trữ user và tất cả các trang phải có câu “Welcome, tênUser”
    • Form Search cho phép người dùng tìm kiếm một user bất kỳ khi biết một phần tên của họ
      • Kết quả Search sẽ trình bày trên lưới dữ liệu
      • Nếu tìm không thấy sẽ in ra câu “No Result is matched!”
    • Trên lưới tìm kiếm cho phép người sử dụng update hay delete dữ liệu
  • Mô tả yêu cầu của bài trên thể hiện đầy đủ chức năng cơ bản của một ứng dụng thực tế và kết nối DB. Chúng tôi sẽ phân tích và làm bài theo từng chức năng và áp dụng Sruts Framework từng chức năng một từng bước từng bước một.
  • Ở đâ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 về interceptor, validation …
  • Mô Hình Strut2 ứng dụng cho yêu cầu tổng quát hóa như sau

  • DB chúng tôi 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
    • Tools sử dụng ở đây là Netbeans 6.9.1
    • JDK 6 update 22, JDK 7 update 51, JDK 8 update 66
    • Server: Tomcat 6.0.26, 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 6.9.1, hay 8.x phải hỗ trợ Struts2
  • Hỗ trợ plug-in struts2 cho Netbeans 6.9.1, 8.x (tham khảo bài viết tại địa chỉ http://www.kieutrongkhanh.net/2017/06/huong-dan-install-plugin-struts-2-vao.html )
  • Các bước thực hiện
    • Tạo Web Application
      • JavaEE version: JavaEE 5
      • Nhấn Next, tại bước Chọn Frameworks, chọn Struts 2 và gỡ bỏ dấu check “Create example page” trong tag Configuration

      • Nhấn Finish, cấu trúc project trên Netbeans cập nhật với các tập tin cấu hình struts.xml, taglib và các library

      • Tập tin web.xml được tự động cập nhật mapping với FilterDispatcher như sau

    • Chúng ta thực hiện chức năng Login tương tự bài MVC Pattern trên Web – Mô hình thiết kế ứng dụng theo dạng Model – View – Controller
      • Chúng ta tạo trang login.html với HTML thuần như sau

      • Chúng ta cần thiết lập trang chạy đầu tiên là Login. Tuy nhiên, mô hình MVC dựa trên Filter làm controller sẽ lấy đường dẫn mặc định như là http://localhost:8084/ContextPath/ trước khi lấy được welcome File. Do vậy, việc chờ đến welcome file là không thể được. Chính vì điều đó, chúng ta sẽ thiết lập welcome file là chuỗi rỗng

      • Như vậy, với đường dẫn là chuỗi rỗng thì phải luôn qua Filter khi ứng dụng được kích hoạt. Do vậy, chúng ta sẽ tạo action với tên là chuỗi rỗng để chuyển đến trang trực tiếp login.html mà không cần thông qua action class xử lý gì cả. Chúng ta cập nhật tập tin struts.xml như sau

        • Như vậy, chúng ta test thử và thấy rằng trang login đã được thiết lập chạy đầu tiên thông qua Filter hay Struts2
      • Chúng ta tiếp tục tạo trang invalid.html với thành phần try again tương tự welcome file để hỗ trợ gọi lại trang login.html

      • Chúng ta thực hiện tạo Action cho việc xử lý Login
        • Chọn menu File, new File, chọn Struts2 trong Categories và Struts Action trong File Types

        • Nhấn Next, đặt tên trong Class Name và chọn package tương ứng

        • Nhấn Finish, Action hay Java Class được phát sinh như sau

        • Chúng ta thực hiện chỉnh sửa trong Action Form như sau
          • Định nghĩa các thuộc tính mapping với form login
          • Định nghĩa các phương thức get/set của các thuộc tính
          • Cài đặt phương thức execute xử lý login để khi login đúng ra trả ra nhãn “success”, sai trả ra nhãn “fail” – đây là các result để chúng ta thực hiện mapping trong struts.xml
          • Lưu ý
            • Trong hàm execute, chúng ta thực hiện lưu trữ giá trị user vào trong session khi login thành công và sẽ dùng ngôn ngữ OGNL để trình bày kết quả ra trang search.jsp          
            • Toàn bộ việc kết nối DB và xử lý DAO để có dữ liệu từ DB – tham khảo trong các bài MVC (có thể tham khảo tại địa chỉ http://www.kieutrongkhanh.net/2017/06/topic-su-dung-filter-nhu-la-controller.html )
            • Trong hàm chúng ta đã sử dụng cách thức lấy session như trong phần nội dung lý thuyết và đưa attribute vào trong nó để lưu trữ giá trị username khi login thành công

      • Chúng ta tạo trang search.jsp để trình bày kết quả khi login đúng
        • Chúng ta sử dụng OGNL để lấy session và sử dụng taglib property để get dữ liệu từ session của Action Context ra

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

      • Chúng ta thực hiện mapping các view, action thông qua tập tin struts.xml
        • Tập tin này không được nằm trong thư mục WEB-INF như trong struts1 mà nó nằm ngay thư mục gốc của source-code package
        • Netbeans không hỗ trợ cơ chế tool để hỗ trợ add, nhưng chúng ta sẽ gõ tay mapping và dùng tổ hợp phím Ctrl + Space bar để chọn nhằm đảm bảo tính chính xác vì tập tin xml được hỗ trợ visual thông qua DTD khai báo
        • Chúng ta thực hiện bổ sung vào struts.xml như sau
          • Chúng ta khai báo action với name là action định nghĩa trong form
          • Action này được mapping với Action class qua thuộc tính class
          • Và kết xuất xử lý được struts2 framework kích hoạt hàm execute và kết quả trả về sẽ mapping với các result để cho view cụ thể
          • Trong trường hợp action không tồn tại hay result không tồn tại thì trong quá trình thực thi lỗi 404 sẽ xuất hiện (cải tiến lỗi tốt hơn so với struts1 – chỉ có báo trang trắng)

      • Chúng ta thực hiện Build, Deploy và Testing

        • Nhập đúng

      • Nhập sai

      • Chúng ta đã hoàn tất chức năng Login với Struts2 Frameworks
  • Chúng ta thực hiện chức năng search cho ứng dụng
    • Trên trang search.jsp, chúng ta bổ sung form search sử dụng các tag lib như sau

        • Lưu ý: action chúng ta là searchLikeLastname, để sau này áp dụng chúng ta nên áp dụng Action sẽ là tên action với chữ action đầu viết hoa+Action ở sau như phần chức năng trên action là login thì tên Action class chúng ta sẽ là LoginAction. Ở đây Action Class của chúng ta sẽ là SearchLikeLastnameAction
      • Chúng ta thực hiện tạo Action Class
        • Gõ tên class và package, ở đây sẽ là SearchLikeLastnameAction và package sẽ là sample.struts2, thực hiện thay đổi class phát sinh như sau
          • Khai báo thuộc tính để đón nhận giá trị search từ form
          • Khai báo danh sách List để đón nhận kết quả trả về để chúng ta đón nhận kết quả trả về. Chúng ta làm như thế vì bản chất Struts2 đã hỗ trợ dạng backing bean và ngôn ngữ OGNL để chúng ta truy xuất các thành phần trong ActionContext thông qua ValueStack. Trong quá trình xử lý kết quả của Action được lưu trữ trong action context và như chúng tôi đã giảng giải lý thuyết, thành phần interceptor hỗ trợ trích xuất và đưa dữ liệu và valueStack và mapping với Action hay JavaBeans, và Struts2 cung cấp cơ chế cho chúng ta truy cập ValueStack. Do vậy, chúng ta không cần lấy request rồi attribute như Struts1 hay mô hình MVC. Đây là tính tối ưu của Struts2 hơn Struts1 cho người lập trình nhưng nó làm tăng tính phức tạp và xử lý nhiều cho container
          • Phát sinh get và set cho 02 thành phần này
          • Cài đặt hàm execute xử lý tìm kiếm và gán giá trị cho list, trả về kết quả nhãn “success”

        • Ngoài ra, Struts2 sử dụng JDK 5 trở lên do vậy chúng tôi sử dụng dạng dữ liệu generic để xây dựng ứng dụng, tạo sự tiện lợi trong ánh xạ dữ liệu trong quá trình lập trình
      • Cập nhật trang search.jsp trình bày dữ liệu
        • Sử dụng taglib của struts2 để truy cập dữ liệu thông qua action và Action Context, không sử dụng bất kỳ EL hay JSTL

        • Lưu ý: tag iterator của taglib cung cấp chúng ta thuộc tính status, đây là thuộc tính giúp tạo ra đối tượng IteratorStatus để cung cấp hàng loạt util cho chúng ta truy cập trong lúc quá trình duyệt vòng lặp. Một số thuộc tính của Iterator Status như sau

        • Chúng ta có thể áp dụng để lấy record đầu tiên, cuối cùng, đếm số thứ tự … mà không sử dụng dài dòng như JSTL 1.1 và EL như trong mô hình MVC
      • Chúng ta thực hiện mapping các view với action trong tập tin struts.xml

      • Start Server Tomcat, Build Project, Deploy và Test đến chức năng search, sau khi login thành công

        • Nhấn nút search

        • Nếu không có

    • Chúng ta tiếp tục với chức năng Delete
      • Giao diện delete được cập nhật trong trang search.jsp (đã trình bày ở trên) như sau

      • Tạo DeleteRecordAction để xử lý như sau (lưu ý phải get luôn tham số nhắc nhở cho lần search lại để fresh lưới)

      • Cập nhật struts.xml với việc gọi lại Action Search thông qua Result Type là redirectAction và sử dụng EL để lấy giá trị lần cuối cùng search truyền thẳng vào chức năng search với parameter trùng với tên parameter hay control trong form search

      • Thực hiện clean and Build và deploy ứng dụng để thực hiện chứn năng xóa

    • Thực hiện tiếp tục với chức năng Update
      • Cập nhật giao diện cho trang search.jsp (đã thể hiện toàn bộ trong phần ở trên) như sau

      • Tạo UpdateRecordAction tương tự như delete như sau

      • Mapping Action tương tự như Delete như sau

    • Chúng ta đã hoàn tất các chức năng yêu cầu với coding cực kỳ đơn giản. Cấu trúc project hiện nay như sau

Chúc mừng các bạn đã hoàn tất và nắm tổng quát khái niệm về Struts 2.x Framework cơ bản, cách thức thiết kế, mô hình ứng dụng và cài đặt ứng dụng web theo 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 nhận thấy với chức năng cơ bản và đơn giản, struts 2 đã hỗ trợ làm được ứng dụng web. Ở nội dung bài này, chúng ta chỉ mớii 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ị.

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 từ cơ bản đến nâng cao, sử dụng annotation để cấu hình, validation, interceptor, xử lý toàn bộ ứng dụng MVC hay Struts1 Framework với Struts2 Framework

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

Đăng nhận xét