Lưu Quang Triệu

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

cấu hình struts 2

Posted by millionking on November 11, 2011

I.            Struts 2 nó cung cấp cho chúng ta 2 cách cấu hình để thực hiện mapping một action từ người dùng với lớp Action thực hiện xử lý yêu cầu đó là cấu hình trong file cấu hình struts.xml và cấu hình theo Annotation

Hình 4: Khai báo cấu hình struts bằng XML hoặc Annotations

  1. a.     Cách 1: Khai báo bằng cách sử dụng XML

Để hiểu hơn về cách cấu hình này thì chúng ta sẽ xem qua ví dụ sau:

<action name=”Login” class=”manning.Login”>

<result>/AccountPage.jsp</result>

<result name=”input”>/Login.jsp</result>

</action>

<action name=”Registration” >

<result>/Registration.jsp</result>

</action>

<action name=”Register” class=”manning.Register”>

<result>/RegistrationSuccess.jsp</result>

<result name=”input”>/Registration.jsp</result>

</action>

                                                                         i.            Action

–          Trong cách khai báo trên thì ứng với mỗi action ta sẽ khai báo trong thẻ “action” trong thẻ action thì có các thuộc tính như

  • Name: là tên của action mà ta sẽ gọi
  • Class : là ActionClass thực hiện xử lý action trên
  • Method: nếu người dùng không khai báo attribute method này thì đồng nghĩa với việc Struts sẽ chọn phương thức execute trong ActionClass mà thực hiện. Còn nếu người dùng khai báo chổ này thì Struts sẽ lấy phương thức được khai báo để thực hiện sử lý cho action đó.

–          Ngoài method như trên còn có một dạng gọi là WildCard method.

  • Đôi khi ta thao tác trên một đối tượng có một tập các action ví dụ như SinhVien có các action mà người dùng thường sử dụng như là delete, insert , update, … thì ta có một cách đơn giản để khai báo mapping cho action là dùng wildcard method.
  • Cách khai báo
    • <action name=”*ActionName”  class=”ClassAction” method=”{1}”>….</action>
    • <action name=”ActionName_*”  class=”ClassAction” method=”{1}”>….</action>
    • Cách sử dụng:
      • <s:form action=”deleteAction.action”>…</s:form>
      • <s:form action=”Action_delete.action”>…</s:form>
      • Với delete là một phương thức trong ClassAction.

–          Thỉnh thoảng thì chúng ta khai báo một action nhưng action đó không tồn tại nên struts sẽ báo lỗi, Chúng ta không muốn đều này xảy ra vì thế mà struts cung cấp thêm cho chúng ta cách config một action gọi là Default action để khi struts thực hiện mapping mà không tìm thấy action nào phù hợp nó sẽ thực hiện action default này.

<package name=”Hello” extends=”action-default”>

<default-action-ref name=”UnderConstruction”>

<action name=”UnderConstruction”>

<result>/UnderConstruction.jsp</result>

</action>

                                                                       ii.            Result

–          Trong thẻ action còn có thẻ con là result.

  • Khi 1 Action được thực hiện thành công, nó sẽ trả về 1 chuỗi.
  • Giá trị của chuỗi được sử dụng để chọn thành phần kết quả
  • 1 action mapping sẽ thường có 1 tập thể hiện các kết quả khác nhau có thể xảy ra.
  • Có các tên kết quả đã được xác định trước(tokens)
  • Ứng dụng có thể định nghĩa các tên kết quả khác(token) để khớp với 1 số trường hợp mong muốn.

–           Result định nghĩa trước gồm:

  • String SUCCESS = “success”;
  • String NONE = “none”;
  • String ERROR = “error”;
  • String INPUT = “input”;
  • String LOGIN = “login”;

–          Result Element:

  • Name: tên result là giá trị trả về khi action thực hiện , nó có thể là tokens có sẳn hoặc là một tokens do mình định nghĩa.
  • Type :kiểu result quy định kiểu result : depatcher, chain….. Nếu người dùng không khai báo thì struts sẽ lấy mặt định là depatcher.
  • Có 3 cách để khai báo result:
    • Khai báo không dùng type là default

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

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

</result>

  • Khai báo sử dụng type defaults

<result>

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

</result>

  • Khai báo sử dụng type default, param cũng default

<result>/ThankYou.jsp</result>

  1. b.    Cách 2: Khai báo bằng cách sử dụng Java Annotations

Đối với cách khai báo dùng Annotations thì ta sẽ xem xét ví dụ sau

@Results({

@Result(name=”input”, value=”/RegistrationSuccess.jsp” )

@Result(value=”/RegistrationSuccess.jsp” )

})

public class Login implements Action {

public String execute() {

//Business logic for login

}

}

Đây là cách khai báo trong lúc cài đặt ActionClass.

Trong 2 cách trên người ta thường dùng nhất là cách dùng XML để cấu hình. Có một số người thì quen sử dụng các công nghệ cũ chỉ thực hiện cấu hình trên XML thì sẽ nhanh chóng tiếp cận hơn là cách dùng Annotation.

   II.            Các bộ interceptor.

Interceptor là một phần rất quan trọng trong Struts2 nó được cấu hình để thực hiện các chức năng như workflow, validation, upload file,…

Khi được config thì khi một action triệu gọi nó sẽ qua các bộ interceptor nếu không bị interceptor điều hướng thì nó sẽ thực hiện action được gọi sau đó sẽ trả về kq và qua interceptor một lần nữa nhưng theo chiều ngược lại  sau đó trà kết quả về cho người dùng.

Hình 5 : Interceptor trong Action Life Circle

  1. a.     Danh sách các Interceptor dựng sẵn

Trong struts 2 cung cấp cho chúng ta một số interceptor sau. Và để sử dụng được những Interceptor này thì khi khai báo package trong Struts thì extends từ package struts-default:

<package name=”default” extends=”struts-default”>

</package>

Interceptor

Tên

Alias Interceptor alias
Chaining Interceptor chain
Checkbox Interceptor checkbox
Cookie Interceptor cookie
Conversion Error Interceptor conversionError
Create Session Interceptor createSession
Debugging Interceptor debugging
Execute And Wait Interceptor execAndWait
Exception Interceptor exception
File Upload Interceptor fileUpload
I18N Interceptor i18n
Logger Interceptor logger
Message Store Interceptor store
Model Driven Interceptor modelDriven
Scoped Model Driven Interceptor scopedModelDriven
Parameters Interceptor params
Prepare Interceptor prepare
Scope Interceptor scope
Servlet Config Interceptor servletConfig
Static Parameters Interceptor staticParams
Roles Interceptor roles
Timer Interceptor timer
Token Interceptor token
Token Session Interceptor tokenSession
Validation Interceptor validation
WorkFlow Interceptor workflow
Parameter Filter Interceptor N/A
Profiling Interceptor profiling
  1. b.    Custom một Interceptor

Ngoài những interceptor trên thì ta cũng có thể tạo ra những interceptor cho chính chúng ta. Trong xwork cung cấp cho chúng ta một Interface Interceptor. Interface này có 3 phương thức chính là:

  • init(): Phương thức được gọi đúng một lần sau khi Interceptor được tạo ra.
  • intercept(): phương thức được gọi mỗi khi action được invoke và Intercept này sẽ thực hiện trước và sau khi action execute.
  • destroy: phương thức gọi khi interceptor bị hủy . Thực hiện giải phóng tài nguyên.

Trong xwork cũng cung cấp cho chúng ta một class abstract AbstractInterceptor lớp này implement từ Interface Interceptor. Nó cung cấp cho chúng ta 2 phương thức init() và destroy() rỗng.

  1. i.     Tạo interceptor

Để tạo một Interceptor thì ta thực hiện tạo một class và cho extends từ class AbstractInterceptor hay implement từ interface Interceptor. Sau đó thực hiện viết lại các phương thức cho phù hợp với muc đích của mình.

VD:

import com.opensymphony.xwork2.ActionInvocation;

import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class SimpleInterceptor extends AbstractInterceptor

{

public String intercept(ActionInvocation invocation) throws Exception{

MyAction action = (MyAction)invocation.getAction();

action.setDate(new Date());

return invocation.invoke();

}

}

Trong khi tạo một Interceptor chúng ta làm việc với 1 interface khá là quan trong là ActionInvocation. Inteface này nó đại diện cho trạng thực thi của một Action.

Trong interface này có phương thức quan trọng là phương thức invoke(). Phương thức này để triệu gọi đến bước kế tiếp trong chuỗi xử lý một action

  1. ii.   Sử  dụng custom interceptor:

Strong struts.xml ta thực hiện khai báo interceptor của mình như sau:

<interceptors>

<interceptor name=”myinterc1″/>

<interceptor name=” myinterc2″/>

</interceptors>

<action name=”login”>

<interceptor-ref name=”myinterc1″/>

<interceptor-ref name=” myinterc2″/>

<result name=”input”>login.jsp</result>

<result name=”success“ type=”redirect-action”>/secure/home</result>

</action>

Có những lúc chúng ta muốn các interceptor của chúng ta thực hiện theo một thức tự và sữ dụng nhiều lần cùng một thứ tự đó thì nếu dùng cách khai báo từng interceptor trong mỗi action thì sẽ dư thừa. Do đó trong struts2 có khái niểm stack để chúng ta khai báo thứ tự của các interceptor mình sẽ dùng.

Để hiểu rõ thì xem ví dụ sau:

<package name=”default” extends=”struts-default”>

<interceptors>

<interceptor name=”timer”/>

<interceptor name=”logger”/>

<interceptor-stack name=”myStack”>

<interceptor-ref name=”timer”/>

<interceptor-ref name=”logger”/>

</interceptor-stack>

</interceptors>

<action name=”login”>

<interceptor-ref name=”myStack”/>

<result name=”input”>login.jsp</result>

<result name=”success“ type=”redirect-action”>/secure/home</result>

</action>

</package>

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: