19
Báo cáo Struts 2 I. Cách thức hoạt động của struts 2 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() .

Baocao Struts 2 VNSon

Embed Size (px)

DESCRIPTION

Struts 2

Citation preview

Page 1: Baocao Struts 2 VNSon

Báo cáo Struts 2

I. Cách thức hoạt động của struts 2 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

Page 2: Baocao Struts 2 VNSon

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

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

Page 3: Baocao Struts 2 VNSon

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).

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.

Page 4: Baocao Struts 2 VNSon

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 DepatcherVD:

<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ácTham số:actionName : là tên action sẽ redirect tớinamespace: 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" class="..."> <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" class="..."> <result>dashboard.jsp</result> <result name="error" type="redirect-action">error</result> </action>

<action name="error" class="..."> <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

Page 5: Baocao Struts 2 VNSon

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ớiVD:

<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 FreeMakerTham 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 VelocityTham 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

Page 6: Baocao Struts 2 VNSon

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).

Page 7: Baocao Struts 2 VNSon

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ọiVD:

<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.

III. Cách cấu hình struts 2: 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

Page 8: Baocao Struts 2 VNSon

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

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.

Page 9: Baocao Struts 2 VNSon

o Đô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.

o Cách khai báo

<action name=”*ActionName” class=”ClassAction” method=”{1}”>….</action> <action name=”ActionName_*” class=”ClassAction” method=”{1}”>….</action>

o 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. Xem thêm hình số 1.1 để hiểu về wildcard.

- 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:

o Khai báo không dùng type là default

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

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

</result>

Page 10: Baocao Struts 2 VNSon

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

<result> <param name="location">/ThankYou.jsp</param>

</result>o Khai báo sử dụng type default, param cũng default

<result>/ThankYou.jsp</result>

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.

IV. 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.

Page 11: Baocao Struts 2 VNSon

Hình 5 : Interceptor trong Action Life Circle

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

Page 12: Baocao Struts 2 VNSon

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

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.

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();

Page 13: Baocao Struts 2 VNSon

}}

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

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" class=".."/><interceptor name=" myinterc2" class=".."/>

</interceptors><action name="login" class="tutorial.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" class=".."/><interceptor name="logger" class=".."/><interceptor-stack name="myStack">

<interceptor-ref name="timer"/><interceptor-ref name="logger"/>

</interceptor-stack></interceptors><action name="login" class="tutuorial.Login">

<interceptor-ref name="myStack"/><result name="input">login.jsp</result>

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

</package>

Ghi Chú :

- To change name of action suffix extension so we must declare configure in struts.xml below :<constant name="struts.action.extension" value="whatever" />Notes : If value of struts.action.extension is empty then Its value

must be “,”.Ex :

Page 14: Baocao Struts 2 VNSon

<struts><constant name="struts.action.extension" value="whatever" /><constant name="struts.devMode" value="true" />

<package name="default" extends="struts-default" namespace="/">

<action name="top"><result>top.html</result>

</action>

<action name="daily" class="shanon.action.DailyAction"><result name="success">daily.jsp</result>

</action></package>

</struts>

struts.properties

struts.custom.i18n.resources=MessageResourcesstruts.ui.theme=simplestruts.devMode=true#struts.locale=en#we don't want to show extensionsstruts.action.extension= ,struts.configuration.xml.reload=false#struts.i18n.reload=true#struts.custom.i18n.resources=globalstruts.enable.DynamicMethodInvocation=false#struts.enable.SlashesInActionNames=true

Notes : If extension is empty, I configure in struts.properties : struts.action.extension= ,

Page 15: Baocao Struts 2 VNSon