Lưu Quang Triệu

Không ngừng sáng tạo thì sẽ không sợ bị diệt vong

Cách thức hoạt động của struts 2

Posted by millionking on November 11, 2011

  1. a. Kiến trúc Struts 2 Framework

Hình 1: Kiến Trúc Của Struts 2 Framework

 i. ActionContextCleanup :  là tùy chọn và được sử dụng khi tích hợp với các công nghệ như SiteMash Plugin.

ii. FilterDepatcher: là bộ lọc nó Sử dụng ActionMapper để xác định xem Action nào được call và sau đó giao quyền lại cho ActionProxy

iii. ActionProxy:  lấy những action từ struts.xml  qua sự giúp đỡ của  ConfigurationManager từ đó tạo ra những ActionInvocation thực hiện gọi Action mà ta đã config trong struts.xml trước đó nó gọi tới những interceptor (nếu được config). Và sau đó lấy về kết quả thích hợp tái tạo lại các trang jsp theo mẫu nào đó và trả về lại cho người dùng.

iv. Action là một lớp do developer tự định nghĩa, đây là lớp làm việc cơ bản , Là một POJO (Plain old java object) có phương thức execute() .

v. Template: chứa kết quả trả về cho người dùng. Trong Struts2 nó là những result của Action được config trong struts.xml. Có một số loại result sau:

  1. Chain Result
  2. Dispatcher Result
  3. FreeMarker Result
  4. HttpHeader Result
  5. Redirect Result
  6. Redirect Action Result
  7. Stream Result
  8. Velocity Result
  9. XSL Result
  10. PlainText Result
  11. b.    Quá Trình Xử Lý Request trong Struts 2 Framework

i. Người sử dụng gửi yêu cầu đến server để yêu cầu một số tài nguyên của ứng dụng

ii. Bộ điều khiển lọc (FilterDispatcher) xem xét yêu cầu và sau đó xác định một Action thích hợp

iii. Các bộ chặn (Interceptors) được ứng dụng: các cấu hình bộ chặn áp dụng cho các chức năng chung như: luồng công việc, thẩm định, tải file … được tự động ứng dụng vào yêu cầu

iv. Thực thi Action: sau khi phương thức action được thực thi để thực hiện các hoạt động liên quan đến cơ sở dữ liệu như sắp xếp hoặc nhận dữ liệu từ cơ sở dữ liệu

v. Sinh kết quả

vi. Sau đó kết quả yêu cầu được trả về thông qua bộ chặn theo chiều ngược lại. Kết quả trả về cho phép chúng ta thực hiện thu dọn hoặc thêm quá trình xử lý

vii. Hiển thị kết quả cho người sử dụng: việc điều khiển cuối cùng được trả về cho trình chứa servlet, nó sẽ gửi kết quả trả về cho trình duyệt của người sử dụng

Hình 2: Tổng quan xử lý request trong Struts 2

Hình 3: Xử lý request trong Struts 2

   II. Action và Result:

a. Action

Khi một request được gởi từ phía người dùng đến server thì nó sẽ được ánh xạ thành một action tương ứng (do mình cấu hình). Và action này sẽ được controller điều hướng cho một classAction tương ứng thực thi (do chúng ta cấu hình).

  • ActionClass : thuộc tầng Model . Nó là đơn vị làm việc cơ bản. Nó là một POJO mà có thêm phương thức execute(). Thường thì ActionClass được kế thừa từ lớp ActionSupport.
  • ActionSupport:  nằm trong package: com.opensymphony.xwork2. ActionSupport nó được implement từ lớp Action, LocaleProvider, TextProvider, Validateable, ValidationAware . Nó có một số thuộc tính final kế thừa từ lớp Action và được xem như là kết quả trả về từ action : ERROR, INPUT, LOGIN, NONE, SUCCESS. Có phương thức chủ yếu là execute() ,và một số phương thức tham khảo tại nguồn.
  • Thực hiện mapping : để thực hiện mapping thì tham khảo ở phần tiêp theo (Cách Cấu Hình Struts).
  1. b.    Result:

Không giống như Struts1 kết quả của một action là một ActionForward. Trong Struts2 khi một phương thức thực thi một action hoàn thành thì kết quả nó trả về là một chuỗi  và tùy vào chuỗi này mà ta có thể cấu hình để struts mapping với một tập các thể hiện của kết quả trả về cho người dùng. (Cách cấu hình xem phần tiếp theo).

Các loại result sau :

  • Depatcher Result.
  • Redirect Action Result
  • Chain Result
  • Redirect  Result
  • FreeMaker Result
  • Velocity Result
  • Plain Text Result
  • Tiles Result
  • HttpHeader Result
  • Stream Result
  • Global Result

i. Depatcher Result

Thực hiện include hoặc là forward đến một view thường là một trang jsp. Nếu trong quá trình khai báo mà ta không khai báo loại result thì mặc định Struts sẽ hiểu result theo kiểu Depatcher

VD:

<result name=”success” type=”dispatcher”>

<param name=”location”>foo.jsp</param>

</result>

ii. Redirect Action Result

Kết quả trả sau khi thực hiện action sẽ sử dụng ActionMapper để redirect để thực hiện một action khác

Tham số:

actionName : là tên action sẽ redirect tới

namespace: là namespace chứa actionName. Nếu namespace là null thì Struts xem actionName nằm trong cùng namespace với action gọi nó.

VD: <package name=”public” extends=”struts-default”>

<action name=”login”>

<result type=”redirect-action”>

<param name=”actionName”>dashboard</param>

<param name=”namespace”>/secure</param>

</result>

</action>

</package>

<package name=”secure” extends=”struts-default” namespace=”/secure”>

<action name=”dashboard”>

<result>dashboard.jsp</result>

<result name=”error” type=”redirect-action”>error</result>

</action>

<action name=”error”>

<result>error.jsp</result>

</action>

</package>

iii. Chain Result

Result này sẽ call đến toàn một action khác với toàn bộ interceptor stack và result của chính bản thân nó.

Cách khai báo hoàn toàn giống với redirect action result chỉ thay chổ type là chain.

Tham số:

  • actionName: là action sẽ chuyển hướng đến
  • namespace: là namespace chứa actionName, nếu là null thì là trong cùng namespace với action hiện tại
  • method: là phương thức sẽ được gọi ở class Action của action đích. Nếu không khai báo thì sử dụng phương thức execute.
  • skipAction: danh sách các action cách nhau bởi dấu “,” là những action có thể được chuyển hướng đến

VD:

<action  name=”login” class=”…”>

<result>/success.jsp</result>

<result name=”error” type=”chain”>error</result>

</action>

<action name=”error” class=”…”>

<result>error.jsp</result>

</action>

iv. Redirect Result

Result này sẽ thực hiện redirect browser tới một vị trí/ trang khác . tương tự như HttpServletSponse.sendRedirect(url).

Tham số

Location : là vị trí cần redirect tới

VD:

<result name=”success” type=”redirect”>

<param name=”location”>foo.jsp</param>

<param name=”parse”>false</param>

</result>

v.      FreeMaker Result

Sẽ render một view sữ dụng template FreeMaker

Tham số

  • Location : nơi lưu template
  • contentType: loại nội dung. Mặc định là “text/html”
  • writeIfCompleted – (mặc định là false), write vào stream khi và chỉ khi không có lỗi nào trong quá trình xử lý mẫu. Cài đặt template_exception_handler=rethrow trong freemarker.properties sẽ có hiệu quả tương tự.

VD:

<result name=”success” type=”freemarker”>foo.ftl</result>

vi. Velocity Result

Giả lập một môi trường thực thi jsp và hiển thị theo mẫu Velocity

Tham số:

Location : là vị trí mẫu để thực hiện xử lý

VD:

<result name=”success” type=”velocity”>

<param name=”location”>foo.vm</param>

</result>

vii. Plain Text Result

Result này thực hiện trả về nội dung theo định dạng text bình thường. Thường được sử dụng khi muốn thể hiện một trang web dưới dạng text bình thường.

Tham số:

  • Location : vị trí file cần show nội dung
  • charSet:  tập ký tự được sữ dụng

VD:

<action name=”displayJspRawContent” >

<result type=”plaintext”>

<param name=”location”>/myJspFile.jsp</param>

<param name=”charSet”>UTF-8</param>

</result>

</action>

viii. Tiles Result

Đây là một plugin trong struts, tạo thuận tiện cho việc tái sữ dụng mã html

ix. HttpHeader Result

Là một custom Result cài đặt trang thái và header của HTTP bằng cách tùy chọn giá trị của valueStack. Thường được dùng để thông báo lỗi cho người dùng.

Tham số

  • status – http servlet trả về mã trạng thái mà sẽ được thiết lập trên một response.
  • headers – giá trị header.
  • error – http servlet trả về mã lỗi mà sẽ được thiết lập trên một response.
  • errorMessage – thông điệp lỗi để thiết lập trên response nếu tham số ‘error’ được thiết lập.

VD:

<result name=”success” type=”httpheader”>

<param name=”status”>204</param>

<param name=”headers.a”>a custom header value</param>

<param name=”headers.b”>another custom header value</param>

</result>

<result name=”proxyRequired” type=”httpheader”>

<param name=”error”>305</param>

<param name=”errorMessage”>this action must be accessed through a prozy</param>

</result>

x. Stream Result

Một loại Result tùy chọn để gửi dữ liệu thô (thông qua InputStream) trực tiếp đến HttpResponse. Rất hữu ích cho phép người sử dụng tải nội dung.

Tham số

  • contentType – mặc định là text/plain.
  • contentLength – độ dài bytes.
  • contentDispostion – giá trị các bố trí nội dung header để chỉ ra tên file (mặc định = inline, các giá trị đặc trưng filename=”document.pdf”.
  • inputName – tên của thuộc tính InputStream từ action chuyển đến (mặc định = inputStream).
  • bufferSize – kích thước của bộ đệm để copy từ input vào output (mặc định = 1024).

VD:

<result name=”success” type=”stream”>

<param name=”contentType”>image/jpeg</param>

<param name=”inputName”>imageStream</param>

<param name=”contentDisposition”>filename=”document.pdf”</param>

<param name=”bufferSize”>1024</param>

</result>

xi. XSL Result

XSL Result sử dụng XSLT để chuyển một đối tượng action sang XML. Những phiên bản mới đây đã được thay đổi đặc tả để thỏa mãn với các luật Xalan.

Tham số

  • location (default) – nơi đến sau khi thực thi.
  • matchingPattern – mẫu chỉ kết hợp với các phần tử mong muốn, mặc định nó kết hợp với mọi thứ.
  • excludingPattern – mẫu loại bỏ các phần tử không mong muốn, mặc định không có gì.

xii. Global Result

Loại kết quả này thường được dùng khi kết quả này được gán cho nhiều action khác nhau thì nếu ta khai báo trong mỗi action thì trở thành dư thừa do đó ta khai báo một lần và khi action thực hiện nếu trả ra đúng với một token nào đó thì result này sẽ được gọi

VD:

<global-results>

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

</global-results>

Lúc này khi bất kì action nào trả về chuỗi error thì sẽ thực hiện depatcher tới Error.jsp

xiii.      Custom Result:

Ngoài các Result trên thì developper có thể tự tạo cho mình một Result.

Để custom một Result thì tạo một class và nó implement từ interface com.opensymphony.xwork2.Result  có phương thức exectue.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

 
%d bloggers like this: