You are on page 1of 20

9/10/2011

Nội dung

Bộ môn Công nghệ Phần mềm  1. Struts là gì, tại sao sử dụng Struts?
Viện CNTT & TT  2. Kiến trúc của Struts
Trường Đại học Bách Khoa Hà Nội  Controller
 Model
View
LẬP TRÌNH WEB HƯỚNG JAVA

 3. web.xml
Bài 19: Cơ bản về Struts  4. Internationalization
 5. Input Validation
Giảng viên: ThS. Trịnh Tuấn Đạt  6. Xử lý lỗi
Bộ môn CNPM  7. Chọn View trả về
Email: trinhtuandat.bk@gmail.com/dattt@soict.hut.edu.vn
DatTT-DSE-SOICT-HUST 1 DatTT-DSE-SOICT-HUST 2

Jakarta Struts
 Struts là một Web application framework mã
nguồn mở, là một phần của Apache Jakarta
1.1. Struts là gì? project
 http://jakarta.apache.org/struts/

DatTT-DSE-SOICT-HUST 3 DatTT-DSE-SOICT-HUST 4

1.1. Struts là gì? Struts cho phép các LTV ...


 Model-View-Controller (MVC) framework  Phát triển ứng dụng web JSP/Servlet theo
 Được sử dụng để xây dựng các ứng dụng Web sử mô hình MVC
dụng Servlets và JSPs
 Sử dụng các đối tượng có sẵn của framework
Ứng dụng Struts là ứng dụng Web, chạy được trên bất kỳ
trong file cấu hình XML

Sevlet container nào, bao gồm cả tất cả các J2EE


compliant App servers  Sử dụng các mẫu thiết kế xây dựng sẵn của
 Tuân theo các mẫu thiết kế framework
Singleton, composition view, delegate

 Sử dụng các đặc tính nâng cao như input
Dễ học & sử dụng
validation, internationalization

 Có kèm các thư viện thẻ JSP custom tag

DatTT-DSE-SOICT-HUST 5 DatTT-DSE-SOICT-HUST 6

1
9/10/2011

1.2. Tại sao sử dụng Struts?


 Struts đã đảm nhiệm những phần phức tạp nhất khi
xây dựng ứng dụng MVC
1.2. Tại sao sử dụng Struts  Dễ học và sử dụng
 Nhiều tính năng
 Nhiều công cụ hỗ trợ của bên thứ 3 (third party
tools)
 Linh động và dễ mở rộng (Flexible & extensible)
 Cộng đồng sử dụng đông đảo
 Ổn định và vẫn đang liên tục phát triển
 Mã nguồn mở
DatTT-DSE-SOICT-HUST 7 DatTT-DSE-SOICT-HUST 8

1.2. Tại sao sử dụng Struts?


 Tích hợp tốt với Java EE (J2EE)
 Hỗ trợ taglib tốt
 Xử lý lỗi thống nhất, theo cả 2 cơ chế 2. Kiến trúc của Struts
programmatic và declarative
 Tích hợp với Tiles framework (Struts nâng
cao)

DatTT-DSE-SOICT-HUST 9 DatTT-DSE-SOICT-HUST 10

Model-View-Control (model 2) Struts hoạt động như thế nào


MVC Design Pattern

1
Request
(Controller)
Servlet
BROWSER

Redirect 3 2

5 (View) (Model)
Java Bean
Response JSP 4

Servlet Container (EIS)

DatTT-DSE-SOICT-HUST 11 DatTT-DSE-SOICT-HUST 12

2
9/10/2011

Struts: Kiến trúc MVC Struts: Kiến trúc MVC


 Controller trung tâm điều hành luồng ứng dụng, ủy  3 thành phần chính trong Struts
quyền cho các bộ xử lý thích hợp gọi là Action  Servlet controller (Controller)
 Action Handlers có thể sử dụng các model  Java Server Pages hoặc bất kỳ công nghệ hiển
components thị nào khác (View)
 Model đóng gói trạng thái hoặc logic nghiệp vụ  Application Business Logic ở dạng bất kỳ phù hợp
 Điều khiển được chuyển tiếp (forward) cho với ứng dụng (Model)
Controller với View phù hợp
 Struts tập trung chủ yếu vào phần Controller
 Việc forward có thể được xác định bằng việc tra cứu từ
tập các mappings trong file cấu hình, cho phép tăng độ  Struts có sự độc lập giữa Model & View
linh động gữa tầng View và Model  Struts có thể sử dụng bất kỳ công nghệ Model &
View nào
DatTT-DSE-SOICT-HUST 13 DatTT-DSE-SOICT-HUST 14

Struts: Kiến trúc MVC


 File cấu hình chứa các action mappings
 Ánh xạ URL với các Action
 Controller sử dụng các mapping này để trả về 2.1. Controller
HTTP requests cho Action nào của ứng dụng
 Xác định forwarding/navigation
 Mapping phải mô tả được
 Đường dẫn của yêu cầu: request path
 Action xử lý request nhận được

DatTT-DSE-SOICT-HUST 15 DatTT-DSE-SOICT-HUST 16

Controller có nhiệm vụ gì? Các thành phần Controller


 Giống như 1 switch trong kiến trúc MVC
 Tất cả các request phải đi qua controller
 Chịu trách nhiệm điều khiển luồng cho các
xử lý request (action mapping)
 Đọc file cấu hình để xác định luồng điều khiển

DatTT-DSE-SOICT-HUST 17 DatTT-DSE-SOICT-HUST 18

3
9/10/2011

Controller trong Struts Framework Nhiệm vụ của LTV


 Struts framework cung cấp servlet:  Viết lớp Action (kề thừa lớp Action) cho mỗi
 org.apache.struts.action.ActionServlet request có thể nhận được
 Phải cấu hình Servlet mapping cho servlet này  Phải override phương thức execute() (phương
trong file web.xml thức perform() trong Struts 1.0)
 Các cấu hình liên quan tới Struts khác được  Viết action mapping trong file cấu hình
tạo lập trong file struts-config.xml  struts-config.xml
 Action Mapping định nghĩa các ánh xạ giữa URI  Cập nhật file web.xml, thực hiện mapping
của request gửi đến với 1 lớp Action cụ thể cho ActionServlet
 web.xml
DatTT-DSE-SOICT-HUST 19 DatTT-DSE-SOICT-HUST 20

Các thành phần Controller trong Struts


Framework

 ActionServlet (Struts cung cấp)


 RequestProcessor (Struts 1.1) (Struts cung cấp) 2.1.1. ActionServlet
 Cho mỗi module
(Framework cung cấp)
 Action (LTV viết)
 LTV kế thừa lớp Action do Struts cung cấp
 Action Mapping (Tạo bởi LTV)
 LTV tạo các action mapping trong file struts-config.xml
 Struts framework sẽ tạo các đối tượng ActionMapping và
truyền chúng cho đối tượng Action

DatTT-DSE-SOICT-HUST 21 DatTT-DSE-SOICT-HUST 22

Nhiệm vụ của ActionServlet? Nhiệm vụ của ActionServlet? (2)

 Thực hiện vai trò của Controller  Chịu trách nhiệm khởi tạo và dọn dẹp tài
 Xử lý các user requests nguyên
 Xác định xem user cần gì, căn cứ ào request  loads các cấu hình ứng dụng trong web.xml
nhận được  Duyệt lần lượt các goes through an enumeration
 Lấy dữ liệu từ model (nếu cần thiết), và of all init-param elements, looking for those
 Lấy ra view phù hợp trả về cho người dùng elements who's name starts with config/ for
modules
 Ủy nhiệm hầu hết những công việc này cho
 Để truy cập vào module foo, sử dụng URL như:
lớp Action
 http://localhost:8080/myApp/foo/someAction.do

DatTT-DSE-SOICT-HUST 23 DatTT-DSE-SOICT-HUST 24

4
9/10/2011

Điều khiển luồng bởi Controller Luồng Struts (Struts 1.0)


Http://myhost/authorize.do

Server configured to pass *.do extensions to


org.apache.struts.action.ActionServlet via a
web.xml configuration file

ActionServlet object inspects the URI and tries to match it


against an ActionMapping located in the struts-config.xml file

Instance of appropriate Action class is found and it’s execute()


is called.

Action object handles the request and returns a next view.


View is identified by ActionForward objerct.
DatTT-DSE-SOICT-HUST 25 DatTT-DSE-SOICT-HUST 26

Nhiệm vụ của RequestProcessor?


 processPath
2.1.2. RequestProcessor  Xác định đường dẫn (path) được request. Sau đó sẽ được
sử dụng để lấy về một ActionMapping.
(Framework cung cấp)  processLocale
 Chọn một locale (nếu chưa chọn locale nào) và đặt nó
vào trong request.
 processContent
 Thiết lập content type mặc định (tùy chọn cách encoding)
cho tất cả các response nếu được yêu cầu

DatTT-DSE-SOICT-HUST 27 DatTT-DSE-SOICT-HUST 28

What Does RequestProcessor Do? What Does RequestProcessor Do?


 processMapping  processPopulate
 Xác định ActionMapping ứng với đường dẫn yêu cầu.  Gắn ActionForm với request, nếu có
processRoles

 processValidate
 Nếu mapping được kết hợp với một role, cần đảm bảo
user có role tương ứng đó. Nếu không, tạo ra một error  Thực hiện validate (nếu được yêu cầu) trên
và dừng xử lý request. ActionForm gắn với request này (nếu có).
 processActionForm  processForward
 Tạo một thực thể ActionForm (nếu cần thiết) kết hợp với  Nếu mapping biểu diễn một forward, forward
mapping trên (nếu có), với tầm vực (scope) phù hợp
đến đường dẫn được chỉ định trong mapping.

DatTT-DSE-SOICT-HUST 29 DatTT-DSE-SOICT-HUST 30

5
9/10/2011

What Does RequestProcessor Do? What Does RequestProcessor Do?

 processInclude  processForwardConfig
 Nếu mapping biểu diễn một include, include kết  Cuối cùng, phương thức xử lý của
quả của việc gọi đến đường dẫn (path) trong RequestProcessor lấy về ActionForward trả về từ
request này lớp Action, và sử dụng nó để chọn ra resource
 processActionCreate tiếp theo (nếu có).
 Tạo một thực thể của lớp được đặc tả trong  Thường ActionForward sẽ dẫn đến các trang
ActionMapping đang xét (nếu cần). trình diễn (presentation page), sinh ra response
trả về cho client.
 processActionPerform
 Là lúc mà phương thức perform() hoặc execute()
sẽ được gọi
DatTT-DSE-SOICT-HUST 31 DatTT-DSE-SOICT-HUST 32

Action Mapping trong file cấu hình Struts

 Struts controller ActionServlet cần biết 1 số


2.1.3. Action Mapping thông tin để map mỗi request URI gửi đến
(LTV viết) với lớp Action phù hợp
 Các yêu cầu này được đóng gói trong một
Java interface là ActionMapping
 Struts framework sẽ tạo đối tượng
ActionMapping cho mỗi phần tử cấu hình
<ActionMapping> trong file struts-config.xml

DatTT-DSE-SOICT-HUST 33 DatTT-DSE-SOICT-HUST 34

Struts Config File (struts-config.xml) Struts Config File (struts-config.xml)

 struts-config.xml chứa 3 phần tử quan trọng  <form-beans>


để mô tả các actions:  Phần tử này chứa các định nghĩa form bean.
 <form-beans> chứa các định nghĩa FormBean  Sử dụng phần tử <form-bean> cho mỗi form
bao gồm tên và kiểu (classname) bean, bao gồm 2 thuộc tính quan trọng sau:
 <action-mapping> chứa các định nghĩa action  name: the name of the request request (and session
 Sử dụng một phần tử <action> cho mỗi action được level attribute that this form bean will be stored as)
định nghĩa  type: tên lớp đầy đủ của form bean
 <global-forwards> chứa cá định nghĩa global
forward

DatTT-DSE-SOICT-HUST 35 DatTT-DSE-SOICT-HUST 36

6
9/10/2011

struts-config.xml: <form-beans> Struts Config File (struts-config.xml)

1.<?xml version="1.0" encoding="ISO-8859-1" ?>  <action-mappings>


2.<!DOCTYPE struts-config PUBLIC  Phần tử này chứa các định nghĩa action. Mỗi
3. "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" action cần định nghĩa ứng với một phần tử
4. "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
<action>
5.<struts-config>

6. <!-- ========== Form Bean Definitions ================= -->


7. <form-beans>

8. <form-bean name="submitForm"
9. type="submit.SubmitForm"/>

10. </form-beans>

DatTT-DSE-SOICT-HUST 37 DatTT-DSE-SOICT-HUST 38

Struts Config File (struts-config.xml) struts-config.xml: <action-mappings>

 <action-mappings>
1.<!-- ========== Action Mapping Definitions ============ -->
 Mỗi phần tử <action> cần định nghĩa các thuộc 2. <action-mappings>
tính sau: 3. <action path="/submit"
 path: Đường dẫn tới action (tương đối so với context 4. type="submit.SubmitAction"
5. name="submitForm"
của ứng dụng) (URI của request) 6. input="/submit.jsp"
 type: Tên đầy đủ của lớp Action 7. scope="request"
8. validate="true">
 name: Tên của phần tử <form-bean> sử dụng với 9. <forward name="success" path="/submit.jsp"/>
action này 10. <forward name="failure" path="/submit.jsp"/>
11. </action>
 input: Tên của trang hiển thị khi có lỗi validate input
form 12. </action-mappings>

 scope: Tầm vực của form bean được tạo 13.</struts-config>


 validate: Có thực DatTT-DSE-SOICT-HUST
hiện validate input form hay không 39 DatTT-DSE-SOICT-HUST 40

struts-config.xml: <action-mappings> Action Mapping Config File


 <global-forwards>
1. <action-mappings>
 Forwards là các thực thể của lớp ActionForward
2. <action được trả về từ phương thức execute() của lớp
3. path="/logon"
4. type="org.apache.struts.webapp.example.LogonAction" Action
5. name="logonForm"
6. scope="request"  Thực hiện map các logical names với các
7.
8.
input="/logon.jsp"
validate="true" />
resources cụ thể (thường là các trang JSPs)
9. </action-mappings>
 Phần tử <forward> có các thuộc tính sau
 name: logical name của forward
10.</struts-config>
 Được sử dụng trong phương thức execute() của lớp Action để
forward đến tài nguyên tiếp theo
 path: resource sẽ được forward đến
DatTT-DSE-SOICT-HUST 41
 redirect: redirect DatTT-DSE-SOICT-HUST
(true) hay forward (false) 42

7
9/10/2011

Global Forwarding Local Forwarding


1.<struts-config> 1.<!-- Edit mail subscription -->
2. <form-beans> 2.<action
3. <form-bean 3. path="/editSubscription"
4. name="logonForm" 4. type="org.apache.struts.webapp.example.EditSubscriptionAction"
5. type="org.apache.struts.webapp.example.LogonForm" /> 5. name="subscriptionForm"
6. </form-beans> 6. scope="request"
7. <global-forwards 7. validate="false">
8. type="org.apache.struts.action.ActionForward"> 8. <forward
9. <forward 9. name="failure"
10. name="logon" 10. path="/mainMenu.jsp"/>
11. path="/logon.jsp" 11. <forward
12. redirect="false" /> 12. name="success"
13. </global-forwards> 13. path="/subscription.jsp"/>
14. 14.</action>

DatTT-DSE-SOICT-HUST 43 DatTT-DSE-SOICT-HUST 44

ActionForm Bean (Form bean)


2.1.4. ActionForm  Viết bởi LTV
(LTV phải cung cấp, nếu không sử  Định nghĩa một ActionForm bean (bản chất là 1 lớp Java
kế thừa lớp ActionForm) cho input form
dụng DynaActionForm)  Định nghĩa trong file struts-config.xml
 <form-bean>
 Tên thuọc tính của lớp <Action>
 Chỉ chứa các phương thức getter & setter cho các
thuộc tính (không có xử lý nghiệp vụ)
 Cung cấp cơ chế validation chuẩn tắc

DatTT-DSE-SOICT-HUST 45 DatTT-DSE-SOICT-HUST 46

ActionForm Bean & Controller Viết một ActionForm Bean?


 Với mỗi ActionForm bean được định nghĩa trong file  Chỉ cần viết phương thức getter và setter cho
servlet-config.xml, Controller (ActionServlet) sẽ mỗi thuộc tính của một input form
Kiểm tra session scope cho 1 thực thể của ActionForm
Không có bất kỳ đoạn code xử lý nghiệp vụ nào


bean
 Nếu không tồn tại, controller sẽ tạo mới một thực thể  Thêm 1 phương thức validate chuẩn tắc:
 Gọi phương thức setter tương ứng của ActionForm bean validate()
cho tất cả các tham số request có tên trùng với tên của
thuộc tính của bean  Controller sẽ gọi đến phương thức này
 Truyền đối tượng ActionForm bean làm tham số của  Định nghĩa một thuộc tính (cùng với phương
phương thức execute() của lớp Action thức getXxx và setXxx) cho mỗi trường xuất
hiện trong input form
DatTT-DSE-SOICT-HUST 47 DatTT-DSE-SOICT-HUST 48

8
9/10/2011

1.<%@ page language="java" %>

Model: ActionForm
2.<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
3.<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
4.<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>

5.<html>
1.package submit;
6.<head><title>Submit example</title></head>
Ví dụ: submit.jsp

7.<body> 2.import javax.servlet.http.HttpServletRequest;


3.import org.apache.struts.action.*;
8.<h3>Example Submit Page</h3>
4.public final class SubmitForm extends ActionForm {

9.<html:errors/> 5. /* Last Name */


6. private String lastName = "Hansen"; // default value
10.<html:form action="submit.do"> 7. public String getLastName() {
8. return (this.lastName);
11.Last Name: <html:text property="lastName"/><br> 9. }
12.Address: <html:textarea property="address"/><br> 10. public void setLastName(String lastName) {
13.Sex: <html:radio property="sex" value="M"/>Male 11. this.lastName = lastName;
14. <html:radio property="sex" value="F"/>Female<br> 12. }
15.Married: <html:checkbox property="married"/><br> 13. /* Address */
16.Age: <html:select property="age"> 14. private String address = null;
17. <html:option value="a">0-19</html:option> 15. public String getAddress() {
18. <html:option value="b">20-49</html:option> 16. return (this.address);
17. }
19. <html:option value="c">50-</html:option> 18. public void setAddress(String address) {
20. </html:select><br> 19. this.address = address;
21. <html:submit/> 20. }
DatTT-DSE-SOICT-HUST 49 21.... DatTT-DSE-SOICT-HUST 50
22.</html:form>

struts-config.xml: <form-beans> struts-config.xml: <action-mappings>

1.<?xml version="1.0" encoding="ISO-8859-1" ?>


1.<!-- ========== Action Mapping Definitions ============ -->
2.<!DOCTYPE struts-config PUBLIC 2. <action-mappings>
3. "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"
4. "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd"> 3. <action path="/submit"
4. type="submit.SubmitAction"
5. name="submitForm"
5.<struts-config> 6. input="/submit.jsp"
7. scope="request"
6. <!-- ========== Form Bean Definitions ================= --> 8. validate="true">
7. <form-beans> 9. <forward name="success" path="/submit.jsp"/>
10. <forward name="failure" path="/submit.jsp"/>
8. <form-bean name="submitForm" 11. </action>
9. type="submit.SubmitForm"/>
12. </action-mappings>
10. </form-beans>
13.</struts-config>
DatTT-DSE-SOICT-HUST 51 DatTT-DSE-SOICT-HUST 52

DynaActionForm trong Struts 1.1

 Thay vì tạo một lớp con cho ActionForm với


các phương thức get/set cho mỗi thuộc tính 2.1.5. Action
của bean, LTV có thể liệt kê các thuộc tính (LTV tự viết)
này, cùng với kiểu, giá trị mặc định trong file
cấu hình Struts
 NÊN sử dụng DanaActionForm khi có thể

(Struts nâng cao)

DatTT-DSE-SOICT-HUST 53 DatTT-DSE-SOICT-HUST 54

9
9/10/2011

Action Class Diagram Lớp Action


 Tập trung vào luồng điều khiển
 Xử lý client request bằng cách gọi cách đối tượng khác
(BusinessLogic beans) trong phương thức execute() của

 Trả về một đối tượng ActionForward định danh một
destination resource mà điều khiển sẽ được forward đến
 Destination resource có thể là
 JSP
 Tile definition
 Velocity template
 Action khác

DatTT-DSE-SOICT-HUST 55 DatTT-DSE-SOICT-HUST 56

Lớp Action là gì? Ví dụ Action: Logon


 Lớp Java thực hiện các “công việc” trong ứng dụng  Ứng dụng cần
 Xử lý request  Xác thực người dùng
Thực hiện các xử lý logic nghiệp vụ
Thiết lập User Session


 Có thể đơn giản hoặc phức tạp
 Xử lý lỗi
 Lớp action đơn giản tự thực hiện xử lý logic nghiệp vụ
 Lớp action phức tạp ủy quyền các xử lý logic nghiệp vụ  Cần viết code lớp “LogonAction”
cho các thành phần Model
 Chức năng của lớp Action giống như mẫu thiết kế Facade

DatTT-DSE-SOICT-HUST 57 DatTT-DSE-SOICT-HUST 58

Phương thức execute(..) của lớp Action


Nhiệm vụ của LTV: Action Class (Chỉ trong Struts 1.1)

 Kế thừa org.jakarta.struts.action.Action  Được gọi bởi controller


 Override
 Phương thức execute() (trong Struts 1.1) public ActionForward execute(
 Phương thức perform() (trong Struts 1.0) ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception;

DatTT-DSE-SOICT-HUST 59 DatTT-DSE-SOICT-HUST 60

10
9/10/2011

Phương thức perform(..) của lớp Action


(Chỉ trong Struts 1.0) Phương thức execute() của lớp Action

 Deprecated  Thực hiện các xử lý cần thiết với request


 Cập nhật các đối tượng phía server (Scope
public ActionForward perform( variables) được sử dụng để tạo trang trả về
ActionMapping mapping, cho người dùng
ActionForm form,  Trả về đối tượng ActionForward phù hợp
HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException;

DatTT-DSE-SOICT-HUST 61 DatTT-DSE-SOICT-HUST 62

Ví dụ: lớp Action Hướng dẫn thiết kế lớp Action


1.package submit;

2.import javax.servlet.http.*;  Controller Servlet tạo 1 thực thể duy nhất


cho lớp Action, và sử dụng nó cho tất cả các
3.import org.apache.struts.action.*;

4.public final class SubmitAction extends Action {

5. public ActionForward execute(ActionMapping mapping,


request
6.
7.
ActionForm form,
HttpServletRequest request,
 Lớp Action phải hoạt động ở chế độ multi-
8. HttpServletResponse response) { threaded safe
9.
10.
SubmitForm f = (SubmitForm) form; // get the form bean
// and take the last name value  Chỉ sử dụng các biến local (as opposed to
11.
12.
String lastName = f.getLastName();
// Translate the name to upper case
instanace variables)
Chỉ nên tạo các lớp Action đơn giản
13. //and save it in the request object
14. request.setAttribute("lastName", lastName.toUpperCase()); 
15.
16.
17.
// Forward control to the specified success target
return (mapping.findForward("success"));
 Sử dụng các thành phần Model cho các xử lý
18. } logic nghiệp vụ phức tạp
19.}
DatTT-DSE-SOICT-HUST 63 DatTT-DSE-SOICT-HUST 64

Ví dụ 2: Lớp Action struts-config.xml: ActionMapping


1.package submit;
2.import javax.servlet.http.*;
3.import org.apache.struts.action.*;
4.public final class SubmitAction extends Action {
5. public ActionForward execute(ActionMapping mapping, 1. <!-- ========== Action Mapping Definitions ============ -->
6. ActionForm form, 2. <action-mappings>
7. HttpServletRequest request,
8. HttpServletResponse response) {
3. <action path="/submit"
9. SubmitForm f = (SubmitForm) form; // get the form bean 4. type="submit.SubmitAction"
10. // and take the last name value 5. name="submitForm"
11. String lastName = f.getLastName(); 6. input="/submit.jsp"
12. if (lastName.startsWith(“Passion”)){ 7. scope="request"
13. // Translate the name to upper case
14. //and save it in the request object
8. validate="true">
15. request.setAttribute("lastName", lastName.toUpperCase()); 9. <forward name="success" path="/submitSuccess.jsp"/>
16. // Forward control to the specified success target 10. <forward name="failure" path="/submitFailure.jsp"/>
17. return (mapping.findForward("success")); 11. </action>
18. }
19. else{
12. </action-mappings>
20. return (mapping.findForward("failure"));
21. }
22. } 13.</struts-config>
DatTT-DSE-SOICT-HUST 65 DatTT-DSE-SOICT-HUST 66
23.}

11
9/10/2011

Các lớp Action xây dựng sẵn


 ForwardAction
 DispatchAction 2.2. Các thành phần Model
(Model Components)

(LTV viết)
(Advanced Struts)

DatTT-DSE-SOICT-HUST 67 DatTT-DSE-SOICT-HUST 68

Model Components Model components


 Model được chia thành:
 Internal state của hệ thống
 Business logic thay đổi các trạng thái đó
 Internal state của hệ thống được biểu diễn bằng:
 JavaBeans
 Enterprise JavaBeans
 POJO's
 JDO
 JDBC
 ...

DatTT-DSE-SOICT-HUST 69 DatTT-DSE-SOICT-HUST 70

Model Components Model Components


 JavaBeans và Scope  Các trang JSP và servlets trong cùng 1 ứng
 Page – chỉ thấy trong 1 trang JSP, trong vòng đời dụng web chia sẻ cùng 1 tập các bean
của request hiện tại  Ví dụ
 Request – chỉ thấy trong 1 trang JSP, cũng như  Servlet code
bất kỳ trang hoặc servlet nào được included MyCart mycart = new MyCart(...);
trong trang JSP này, hoặc được forwarded từ nó request.setAttribute("cart", mycart);
 Session – thấy được cho tất cả các trang JSP và  JSP page
các servlet trong session của 1 user, trên 1 hoặc
<jsp:useBean id="cart" scope="request"
nhiều requests
class="com.mycompany.MyApp.MyCart"/>
 Application – thấy được cho tất cả các trang JSP
và các servlets trong ứng dụng web
DatTT-DSE-SOICT-HUST 71 DatTT-DSE-SOICT-HUST 72

12
9/10/2011

Các thành phần Model trong Struts


Framework

 ActionForm Bean
 Lưu ý ActionForm Bean là một Model component,
mặc dù nó chỉ biểu diễn dữ liệu nhập bởi người Struts Model Components
dùng
 SystemState Bean
 Chỉ là thuật ngữ mức khái niệm: Struts không System State Bean & Business
cung cấp các API lập trình logic Bean
 BusinessLogic Bean
 Chỉ là thuật ngữ mức khái niệm: Struts không
cung cấp các API lập trình
DatTT-DSE-SOICT-HUST 73 DatTT-DSE-SOICT-HUST 74

System State Bean System State Bean


 Struts không định nghĩa lớp chuẩn cho loại bean  Với hệ thống quy mô nhỏ, hoặ với các thông tin
này trạng thái (state information) không cần lưu trữ lâu
 Xác định trạng thái hiện tại dài:
 Có thể được biểu diễn bởi tập một hoặc nhiều các lớp  Tập các system state beans có thể chứa toàn bộ tri thức
JavaBeans, các lớp có các thuộc tính xác định trạng thái hệ thống có được
hiện tại  Với ứng dụng quy mô lớn
 Ví dụ: hệ thống giỏ hàng-shopping cart:  Các System state beans có thể biểu diễn thông tin được
 Chứa một bean tượng trưng cho giỏ hàng được quản lý lưu trữ lâu dài trong các CSDL ngoài
độc lập cho mỗi người mua hàng  Ví dụ: đối tượng CustomerBean tương ứng với 1 row nào đó
trong bảng CUSTOMERS
 Bao gồm tập các items mà người mua hàng đã chọn mua
 Có thể sử dụng EJB

DatTT-DSE-SOICT-HUST 75 DatTT-DSE-SOICT-HUST 76

BusinessLogic Bean BuesinessLogic Bean


 Struts không định nghĩa lớp chuẩn cho loại  Lý tưởng nhất là phải được thiết kế sao cho
bean này chúng không biết mình được thực thi trên
 Có thể là một JavaBean thông thường môi trường Web
 Có thể là EJB có trạng thái hoặc phi trạng thái  Không nên tham chiếu đến bất kỳ đối tượng nào
 Đóng gói các functional logic (làm thay đổi trong ứng dụng Web
trạng thái hệ thống) thành các phương thức  Tăng tính tái sử dụng
 Hệ thống lớn: phương thức nằm luôn trong các
beans biểu diễn trạng thái hệ thống
 Hệ thống nhỏ: phương thức nằm trong các lớp
Action
DatTT-DSE-SOICT-HUST 77 DatTT-DSE-SOICT-HUST 78

13
9/10/2011

View components

2.3. Các thành phần View


(View Components)

LTV phải cung cấp

DatTT-DSE-SOICT-HUST 79 DatTT-DSE-SOICT-HUST 80

View Components View


 Các JSP files cho từng ứng dụng  Đối tượng ActionForward thông báo với
 Tập các JSP custom tag libraries Servlet controller trang JSP nào sẽ được trả
 Các Resource files cho tính năng về (dispatched)
internationalization  Các trang JSP sử dụng ActionForm để lấy dữ
 Cho phép nhanh chóng tạo form cho các ứng liệu output từ Model để hiển thị
dụng  Struts có tập các thư viện thẻ (tag libraries)
 Phối hợp hoạt động với controller Servlet  Dễ phát triển các nội dung động
 Đơn giản trao đổi giữa HTML designer và LTV

DatTT-DSE-SOICT-HUST 81 DatTT-DSE-SOICT-HUST 82

Forms và FormBean Interactions Ví dụ: submit.jsp


1.<%@ page language="java" %>

Nếu user gây lỗi (vd: nhập liệu), ứng dụng


2.<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
 3.<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
4.<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
cần cho phép họ sửa đổi lại giá trị cũ 5.<html>

Với JSP:
6.<head><title>Submit example</title></head>
 7.<body>

 <input type="text" name="username" 8.<h3>Example Submit Page</h3>

value="<%= loginBean.getUsername() >"/>


9.<html:errors/>

10.<html:form action="submit.do">
 Với Struts, chỉ cần 11.Last Name: <html:text property="lastName"/><br>
12.Address: <html:textarea property="address"/><br>
13.Sex: <html:radio property="sex" value="M"/>Male
 <html:text property="username"/>; 14. <html:radio property="sex" value="F"/>Female<br>
15.Married: <html:checkbox property="married"/><br>
16.Age: <html:select property="age">
17. <html:option value="a">0-19</html:option>
18. <html:option value="b">20-49</html:option>
19. <html:option value="c">50-</html:option>
20. </html:select><br>
DatTT-DSE-SOICT-HUST 83 21. <html:submit/> DatTT-DSE-SOICT-HUST 84
22.</html:form>

14
9/10/2011

Ví dụ: submit.jsp
1.<logic:present name="lastName" scope="request">
2.Hello
3.<logic:equal name="submitForm" property="age" value="a">
4. young

3. web.xml
5.</logic:equal>
6.<logic:equal name="submitForm" property="age" value="c">
7. old
8.</logic:equal>
9.<bean:write name="lastName" scope="request"/>
10.</logic:present>

11.</body>
12.</html>

DatTT-DSE-SOICT-HUST 85 DatTT-DSE-SOICT-HUST 86

Web App Deployment Descriptor


(web.xml) Ví dụ: web.xml
1.<!DOCTYPE web-app
 Ứng dụng Struts là một ứng dụng Web 2. PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
3. "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
 Tuân thủ theo luật chung
4.<web-app>
 Phải có file deployment descriptor - web.xml 5. <display-name>Advanced J2EE Programming Class Sample App</display-name>
6.
 web.xml chứa: 7. <!-- Standard Action Servlet Configuration (with debugging) -->
8. <servlet>
 Cấu hình mapping cho ActionServlet 9. <servlet-name>action</servlet-name>
10. <servlet-class>
 Định nghĩa Resource file trong <init-param> 11. org.apache.struts.action.ActionServlet
 Chỉ định file servlet-config.xml trong <init-param> 12. </servlet-class>
13. <init-param>
 Định nghĩa các thư viện thẻ Struts 14.
15.
<param-name>application</param-name>
<param-value>ApplicationResources</param-value>
 web.xml được lưu trữ trong WEB-INF/web.xml 16. </init-param>
17. <init-param>
18. <param-name>config</param-name>
19. <param-value>/WEB-INF/struts-config.xml</param-value>
20. </init-param>
DatTT-DSE-SOICT-HUST 87 21.</servlet> DatTT-DSE-SOICT-HUST 88

Ví dụ: web.xml
1. <!-- Standard Action Servlet Mapping -->
2. <servlet-mapping>
3. <servlet-name>action</servlet-name>
4. <url-pattern>*.do</url-pattern>
5. </servlet-mapping>

4. Internationalization
6.
7. <!-- Struts Tag Library Descriptors -->
8. <taglib>
9. <taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri>
10. <taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
11. </taglib>
12. <taglib>
13. <taglib-uri>/WEB-INF/struts-html.tld</taglib-uri>
14. <taglib-location>/WEB-INF/struts-html.tld</taglib-location>
15. </taglib>
16. <taglib>
17. <taglib-uri>/WEB-INF/struts-logic.tld</taglib-uri>
18. <taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
19. </taglib>
DatTT-DSE-SOICT-HUST 89 DatTT-DSE-SOICT-HUST 90
20.</web-app>

15
9/10/2011

Internationalization Internationalization: Nhiệm vụ của LTV

 Mở rộng của java.util.ResourceBundle  Tạo resource file cho ngôn ngữ mặc định
 org.apache.struts.util.MessageResources  Tạo các resource files cho mỗi ngôn ngữ
 Chỉ giới hạn hỗ trợ hiển thị. Nhập liệu tùy muốn hỗ trợ
theo thiết bị client  Định nghĩa tên của các resource như các
 Cấu hình resource bundles trong web.xml file tham số khởi tạo
 Trong trang JSP
 Sử dụng <html:errors/> để hiển thị các thông
báo lỗi theo locale

DatTT-DSE-SOICT-HUST 91 DatTT-DSE-SOICT-HUST 92

Resource files Ví dụ: ApplicationResource.properties

 MyApplication.properties 1.errors.header=<h4>Validation Error(s)</h4><ul>


2.errors.footer=</ul><hr>
 Chứa thông điệp viết bằng ngôn ngữ mặc định
 Mỗi thông điệp có dạng (vd Tiếng Anh): 3.error.lastName=<li>Enter your last name
4.error.address=<li>Enter your address
 prompt.hello=Hello 5.error.sex=<li>Enter your sex
 MyApplication_xx.properties 6.error.age=<li>Enter your age

 Chứa cùng thông điệp tương đương, nhưng ở


các ngôn ngữ khác, có mã ngôn ngữ theo chuẩn
ISO là "xx"
 prompt.hello=Bonjour

DatTT-DSE-SOICT-HUST 93 DatTT-DSE-SOICT-HUST 94

Ví dụ: web.xml
1. <servlet>
2. <servlet-name>action</servlet-name>
3. <servlet-class>

5. (Input) Validation
4. org.apache.struts.action.ActionServlet
5. </servlet-class>
6. <init-param>
7. <param-name>application</param-name>
8. <param-value>
9. com.mycompany.mypackage.MyApplication
10. </param-value>
11. </init-param>
12. <!-- ... -->
13.</servlet>

DatTT-DSE-SOICT-HUST 95 DatTT-DSE-SOICT-HUST 96

16
9/10/2011

Validation: Nhiệm vụ của LTV (Struts 1.0) validate() method


 Chỉ định sẽ thực hiện validate input bằng thuộc tính  Được gọi bởi controller servlet
validate của phần tử <action> (con của phần tử  Sau khi đã lấy xong các thuộc tính của bean
<action-mapping>) trong file servlet-config.xml  Nhưng trước khi phương thức execute() của lớp Action
 validate=”true” tương ứng được gọi
 Chỉ định trang JSP cần được hiển thị khi validation  Tùy chọn
không thành công  Phương thức mặc định trả về null
 input=”/errorpage.jsp”  Cú pháp:
 Override phương thức validate() trong lớp  public ActionErrors validate(ActionMapping mapping,
ActionForm HttpServletRequest request);
 Tùy chọn

DatTT-DSE-SOICT-HUST 97 DatTT-DSE-SOICT-HUST 98

Ví dụ: phương thức validate() Phương thức validate()


 Trong ứng dụng Login  Sau khi thực hiện validate
 Cần đảm bảo nhập đồng thời cả “username” và  Nếu không xảy ra lỗi validate nào, trả về null
“password”  Nếu xảy ra lỗi validate, trả về 1 thực thể của lớp
ActionErrors
 Cần đảm bảo “password” có ít nhất là 6 ký tự  Mỗi ActionError chứa khóa thông điệp lỗi (error message key)
trong MessageResources bundle của ứng dụng
 Controller servlet lưu trữ mảng ActionErrors như 1 thuộc tính
request để sử dụng cho các thẻ <html:errors>
 Controller sau đó forwards điều khiển tở lại input form (xác định
trong thuộc tính input ho Actionmapping tương ứng)

DatTT-DSE-SOICT-HUST 99 DatTT-DSE-SOICT-HUST 100

Lớp ActionError struts-config.xml: Validation


 Là cơ chế được sử dụng để trả về các lỗi khi
thực hiện validate input 1. <!-- ========== Action Mapping Definitions ============ -->
2. <action-mappings>
 Đóng gói lại các lỗi
3. <action path="/submit"
 Các message key được sử dụng để tìm kiếm ra 4. type="hansen.playground.SubmitAction"
message text phù hợp từ các resource file 5.
6.
name="submitForm"
input="/submit.jsp"

ActionErrors là một tập các ActionError


7. scope="request"
 8. validate="true">
9. <forward name="success" path="/submit.jsp"/>
10. <forward name="failure" path="/submit.jsp"/>
11. </action>

12. </action-mappings>

13.</struts-config>
DatTT-DSE-SOICT-HUST 101 DatTT-DSE-SOICT-HUST 102

17
9/10/2011

ActionForm Ví dụ: submit.jsp


1.<%@ page language="java" %>
1.public final class SubmitForm extends ActionForm { 2.<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
2. 3.<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
3.... 4.<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
4. public ActionErrors validate(ActionMapping mapping,
5. HttpServletRequest request) { 5.<html>
6.<head><title>Submit example</title></head>
6. ...
7.<body>
7.
8.<h3>Example Submit Page</h3>
8. // Check for mandatory data
9. ActionErrors errors = new ActionErrors();
10. if (lastName == null || lastName.equals("")) { 9.<html:errors/>
11. errors.add("Last Name", new ActionError("error.lastName"));
12. } 10.<html:form action="submit.do">
13. if (address == null || address.equals("")) { 11.Last Name: <html:text property="lastName"/><br>
14. errors.add("Address", new ActionError("error.address")); 12.Address: <html:textarea property="address"/><br>
15. } 13.Sex: <html:radio property="sex" value="M"/>Male
16. if (sex == null || sex.equals("")) { 14. <html:radio property="sex" value="F"/>Female<br>
17. errors.add("Sex", new ActionError("error.sex")); 15.Married: <html:checkbox property="married"/><br>
18. } 16.Age: <html:select property="age">
19. if (age == null || age.equals("")) { 17. <html:option value="a">0-19</html:option>
20. errors.add("Age", new ActionError("error.age")); 18. <html:option value="b">20-49</html:option>
21. } 19. <html:option value="c">50-</html:option>
22. return errors; 20. </html:select><br>
23. } 21. <html:submit/>
24... DatTT-DSE-SOICT-HUST 103 22.</html:form> DatTT-DSE-SOICT-HUST 104
25.}

Validator Framework trong Struts 1.1

 Validation logic có thể được mô tả trong file


cấu hình struts-config.xml
 Thay vì phải viết code phương thức Java: 6. Xử lý lỗi (Error Handling)
validate()

(Struts nâng cao)

DatTT-DSE-SOICT-HUST 105 DatTT-DSE-SOICT-HUST 106

CustomExceptionHandler (1.1) ExceptionHandler tự định nghĩa (1.1)

 Tự định nghĩa lớp ExceptionHandler, được  Cấu hình bộ xử lý ngoại lệ trong struts-
gọi đến khi phương thức execute() của 1 config.xml
Action ném ra 1 Exception <global-exceptions>
<exception
 Là lớp con của key="some.key"
org.apache.struts.action.ExceptionHandler type="java.io.IOException"
 Phương thức execute() phải xử lý Exception và
handler="com.yourcorp.ExceptionHandler"/>
trả về 1 đối tượng ActionForward để thông báo </global-exceptions>
với Struts sẽ forward đến đâu tiếp
 com.yourcorp.ExceptionHandler.execute() sẽ
được gọi khi có bất kỳ một IOException nào
DatTT-DSE-SOICT-HUST 107
được ném ra bởi một Action
DatTT-DSE-SOICT-HUST 108

18
9/10/2011

CustomExceptionHandler (1.1) Ví dụ: ném ra một Exception


1.package hansen.playground;

Có thể có tác dụng global hoặc cho từng


2.import javax.servlet.http.*;
 3.import org.apache.struts.action.*;

action
4.public final class SubmitAction extends Action {
5. public ActionForward execute(ActionMapping mapping,
6. ActionForm form,
7. HttpServletRequest request,
8. HttpServletResponse response) {
<action ...> 9. SubmitForm f = (SubmitForm) form; // get the form bean
<exception 10.
11.
// and take the last name value
String lastName = f.getLastName();
key="some.key" 12. if (lastName.startsWith(“Passion”)){
13. // Translate the name to upper case
type="java.io.IOException" 14. //and save it in the request object
15. request.setAttribute("lastName", lastName.toUpperCase());
16. // Forward control to the specified success target
17. return (mapping.findForward("success"));
handler="com.yourcorp.ExceptionHandler"/> 18. }
19. else{
</action> 20. throw new WrongLastNameExcetion(lastName);
21. }
22. }
DatTT-DSE-SOICT-HUST 109 DatTT-DSE-SOICT-HUST 110
23.}

ExceptionHandler tự định nghĩa (1.1)

 Các ExceptionHandler khác nhau cho các lỗi


khác nhau
7. View Selection
<global-exceptions>
<exception handler=
"com.cavaness.storefront.CustomizedExceptionHandler"
key="global.error.message"
path="/error.jsp"
scope="request"
type="java.lang.Exception"/>
<exception handler=
"com.cavaness.storefront.SecurityExceptionHandler"
key="security.error.message"
path="/login.jsp"
scope="request"
type="com.cavaness.storefront.SecurityException"/>
</global-exceptions> DatTT-DSE-SOICT-HUST 111 DatTT-DSE-SOICT-HUST 112

View Selection: Nhiệm vụ của LTV struts-config.xml: ActionMapping

 Trong file struts-config ,


 Với mỗi outcome (giá trị của thuộc tính name của 1. <!-- ========== Action Mapping Definitions ============ -->
thẻ <forward>), chỉ định “trang JSP sẽ được
2. <action-mappings>

forward tới” nhờ thẻ con <forward>, con của thẻ 3. <action path="/submit"
4. type="hansen.playground.SubmitAction"
<action> hoặc thẻ <global-forwards> 5. name="submitForm"
6. input="/submit.jsp"
 Trong phương thức execute() của lớp Action, 7. scope="request"
8. validate="true">
 Trả về đối tượng ActionForward, ứng với 9. <forward name="success" path="/submit.jsp"/>
outcome nào. 10. <forward name="failure" path="/submit.jsp"/>
11. </action>

12. </action-mappings>

13.</struts-config>
DatTT-DSE-SOICT-HUST 113 DatTT-DSE-SOICT-HUST 114

19
9/10/2011

Ví dụ: Action Class


1.package hansen.playground;

2.import javax.servlet.http.*;
3.import org.apache.struts.action.*;

4.public final class SubmitAction extends Action {

5. public ActionForward execute(ActionMapping mapping,


6. ActionForm form,
7. HttpServletRequest request,
8. HttpServletResponse response) {

9. SubmitForm f = (SubmitForm) form; // get the form bean


10. // and take the last name value
11. String lastName = f.getLastName();
12. // Translate the name to upper case
13. //and save it in the request object
14. request.setAttribute("lastName", lastName.toUpperCase());
15.
16. // Forward control to the specified success target
17. return (mapping.findForward("success"));
18. }
19.} DatTT-DSE-SOICT-HUST 115

20

You might also like