ActionServlet: Đóng vai trò như là một controller trong mô hình MVC, hay nói cách khác Action Servlet là sự thực thi controller của Struts đối với mô hình MVC. ActionServlet lấy về các request từ phía người dùng và ánh xạ chúng đến thành phần <action> trong file struts-config.xml.
Action: định nghĩa một tác vụ có thể được gọi bởi người dùng. Nó cũng
định nghĩa lớp sẽ sử lý các request từ phía người dùng và trang JSP sẽ hiển thị kết quả về cho người sử dụng.
Lớp Action: chứa toàn bộ những xử lý cho các yêu cầu của người dùng.
ActionForm: đi kèm với thẻ <action> trong file struts-config.xml, nó quản lý toàn bộ các dữ liệu được submit lên từ phía người dùng và có thể thực hiện validate các dữ liệu đó.
Trang JSP :được sử dụng để trả về trang HTML để thể hiện kết quả đã
được sử lý cho người dùng.
3.4. Các file cấu hình cần thiết để xây dựng một ứng dụng Struts
web.xml: file này chứa toàn bộ các cấu hình của ActionServlet, các sự ánh xạ của các yêu cầu từ phía người dùng đến ActionServlet, và tất các StrutsTag LibraryDefinitions (TLDs).
struts-config.xml: file này chứa tất cả các thông tin cấu hình cho một ứng dựng xây dựng dựa trên Struts.
ApplicationResources.properties: file này trung tâm chứa các nội dung tĩnh được sử dụng trong toàn bộ ứng dụng Struts. Nó cho phép các nhà phát triển dễ dàng thay đổi nội dung các text và các nội dung dùng chung sử dụng trong ứng dụng.
Các thư viện thẻ Struts để xây dựng các thành phần trình diễn trong một ứng dụng:
<templete>: Cung cấp cho nhà phát triển ứng dụng một tập các thẻ JSP để chia nhỏ giao diện người dùng thành các thành phần có thể dễ dàng tháo rắp.
<bean>: Cung cấp cho nhà phát triển ứng dụng một tập các thẻ JSP để quản lý đầu ra từ một JavaBean.
<logic>: Có thể được sử dụng để ứng dụng các điều kiện logic trong một trang JSP.
<html>: Có thể sử dụng để tạo ra các thành phần form
3.5. Hoạt động của struct1 Framework
Controller trung tâm điều hành luồng ứng dụng, ủy quyền cho các bộ xử lý thích hợp gọi là Action
• Action Handlers có thể sử dụng các model • components
• Model đóng gói trạng thái hoặc logic nghiệp vụ
• Điều khiển được chuyển tiếp (forward) cho Controller với View phù hợp
• 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 độ linh động gữa tầng View và Model
Ba thành phần chính trong Struts • Servlet controller (Controller)
• Java Server Pages hoặc bất kỳ công nghệ hiển thị nào khác (View)
Struts tập trung chủ yếu vào phần Controller • Struts có sự độc lập giữa Model & View
• Struts có thể sử dụng bất kỳ công nghệ Model &View nào 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ề 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
3.3.1. Kiến trúc tầng controller trong Sruct1 Framework
Nhiệm vụ
• 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 (actionmapping)
• Đọc file cấu hình để xác định luồng điều khiển
Thành phần
• ActionServlet (Struts cung cấp) Thực hiện vai trò của Controller.
Xử lý các user requests.
Xác định xem user cần gì, căn cứ vào request nhận được. Lấy dữ liệu từ model (nếu cần thiết).
Lấy ra view phù hợp trả về cho người dùng.
Ủy nhiệm hầu hết những công việc này cho lớp Action chịu trách nhiệm khởi tạo và dọn dẹp tài nguyên load các cấu hình ứng dụng trong web.xml.
• RequestProcessor (Struts 1 cung cấp cho mỗi module) processPath
Xác định đường dẫn (path) được request. Sau đó sẽ được sử dụng để lấy về một ActionMapping.
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
processMapping
Xác định ActionMapping ứng với đường dẫn yêu cầu. processRoles
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 và dừng xử lý request.
processActionForm
Tạo một thực thể ActionForm (nếu cần thiết) kết hợp với mapping trên (nếu có), với tầm vực (scope) phù hợp. processPopulate
Gắn ActionForm với request. processValidate
Thực hiện validate (nếu được yêu cầu) trên ActionForm gắn với request này (nếu có).
processForward
Nếu mapping biểu diễn một forward, forward đến đường dẫn được chỉ định trong mapping.
processInclude
Nếu mapping biểu diễn một include, include kết quả của việc gọi đến đường dẫn (path) trong request này
processActionCreate
Tạo một thực thể của lớp được đặc tả trong ActionMapping đang xét (nếu cần).
processActionPerform
Là lúc mà phương thức perform() hoặc execute() sẽ được gọi processForwardConfig
Cuối cùng, phương thức xử lý của RequestProcessor lấy về ActionForward trả về từ lớp Action, và sử dụng nó để chọn ra resource tiếp theo (nếu có).
Thường ActionForward sẽ dẫn đến các trang trình diễn (presentation page), sinh ra response trả về cho client. • Action (kế thừa lớp Action do Struts cung cấp)
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 nó. 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à 1. JSP
2. Tile definition 3. Velocity template 4. Action khác
Lớp Java thực hiện các “công việc” trong ứng dụng • Xử lý request
• Thực hiện các xử lý logic nghiệp vụ Có thể đơn giản hoặc phức tạp
• 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ụ
• cho các thành phần Model
Kế thừa org.jakarta.struts.action.Action. Override Phương thức execute() (trong Struts 1.1). Được gọi bởi controller
publicActionForward execute( ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws Exception;
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 (Scopevariables) được sử dụng để tạo trang trả về cho người dùng. Trả về đối tượng ActionForward phù hợp thiết kế lớp Action 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 request. Lớp Action phải hoạt động ở chế độ multithreaded safe. Chỉ sử dụng các biến local (as opposed to instanace variables). Chỉ nên tạo các lớp Action đơn giản.
Sử dụng các thành phần Model cho các xử lý
• logic nghiệp vụ phức tạp
• Action Mapping (tạo bởi lập trình viên)
Struts controller ActionServlet cần biết 1 số thông tin để map mỗi request URI gửi đến 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 trong file struts- config.xml.
struts-config.xml chứa 3 phần tử quan trọng để mô tả các actions: 1. <form-beans> chứa các định nghĩa FormBean bao gồm tên và
kiểu (classname)
Phần tử này chứa các định nghĩa form bean.
Sử dụng phần tử <form-bean> cho mỗi form bean, bao gồm 2 thuộc tính quan trọng sau:
name: the name of the request request (and session level attribute that this form bean will be stored as)
type: tên lớp đầy đủ của form bean
2. <action-mapping> chứa các định nghĩa action Sử dụng một phần tử <action> cho mỗi action được định nghĩa
Phần tử này chứa các định nghĩa action. Mỗi action cần định nghĩa ứng với một phần tử <action>
Mỗi phần tử <action> cần định nghĩa các thuộc tính sau: • path: Đường dẫn tới action (tương đối so với context của
ứng dụng) (URI của request) • type: Tên đầy đủ của lớp Action
• name: Tên của phần tử <form-bean> sử dụng với action này
• input: Tên của trang hiển thị khi có lỗi validate input form • scope: Tầm vực của form bean được tạo
• validate: Có thực hiện vailidate input form hay không. 3. <global-forwarsd> chứa các định nghĩa global Forward
Forwards là các thực thể của lớp ActionForward được trả về từ phương thức execute() của lớp Action
Thực hiện map các logical names với các resources cụ thể (thường là các trang JSPs)
Phần tử <forward> có các thuộc tính sau: • name: logical name của forward
• Đượ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
• redirect: redirect (false) hay là redirect (true)
3.3.2. Các thành phần Model (Model Components)
Model được chia thành:
1. Internal state của hệ thống
Internal state của hệ thống được biểu diễn bằng: JavaBeans
Enterprise JavaBeans POJO's
JDO JDBC
2. Business logic thay đổi các trạng thái đó
Request – chỉ thấy trong 1 trang JSP, cũng như bất kỳ trang hoặc servlet nào được included trong trang JSP này, hoặc được forwarded từ nó.
Session – thấy được cho tất cả các trang JSP và các servlet trong session của 1 user, trên 1 hoặc nhiều requests.
Application – thấy được cho tất cả các trang JSP và các servlets trong ứng dụng web.
Các trang JSP và servlets trong cùng 1 ứng dụng web chia sẻ cùng 1 tập các bean 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 dùng.
1. System State Bean
I. Struts không định nghĩa lớp chuẩn cho loại bean này II. Xác định trạng thái hiện tại
Có thể được biểu diễn bởi tập một hoặc nhiều các lớp JavaBeans, các lớp có các thuộc tính xác định trạng thái hiện tại.
III. Với hệ thống quy mô nhỏ, hoặ với các thông tin
trạng thái (state information) không cần lưu trữ lâu dài:
Tập các system state beans có thể chứa toàn bộ tri thức hệ thống có được
IV. Với ứng dụng quy mô lớn
Các System state beans có thể biểu diễn thông tin được lưu trữ lâu dài trong các CSDL ngoài
2. BusinessLogic Bean
I. Struts không định nghĩa lớp chuẩn cho loại bean này Có thể là một JavaBean thông thường
Có thể là EJB có trạng thái hoặc phi trạng thái
II. Đóng gói các functional logic (làm thay đổi trạng thái hệ thống) thành các phương thức
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
III. Lý tưởng nhất là phải được thiết kế sao cho chúng không biết mình được thực thi trên môi trường Web
Không nên tham chiếu đến bất kỳ đối tượng nào trong ứng dụng Web Tăng tính tái sử dụng
3.3.3. Các thành phần View (View Components)
Cho phép nhanh chóng tạo form cho các ứng dụng. Phối hợp hoạt động với controller Servlet. Đối tượng ActionForward sẽ thông báo đến với Servlet controller trang JSP nào sẽ được trả về (dispatched)
Các trang JSP sử dụng ActionForm để lấy dữ liệu output từ Model để hiển thị
Struts có tập các thư viện thẻ (tag libraries) • Dễ phát triển các nội dung động
• Đơn giản trao đổi giữa HTML designer và LTV
3.4. Ưu điểm và nhược điểm của Struts (so với MVC RequestDispatcher) 3.4.1. Ưu điểm của Struts
• Thay vì viết hàng loạt những thông tin vào chương trình Java, hầu hết những giá trị Struts được thể hiện trong file.xml và file property. Phương pháp này cho phép người lập trình Web và Java chỉ chú tâm vào phần công việc cụ thể của họ (cài đặt businesslogic, hiển thị những giá trị cụ thể cho clients, vv.. ) mà không cần quan tâm về tổng thể hệ thống.
Formbeans:
• Trong JSP, ta có thể sử dụng thuộc tính property = ”*” với jsp:setProperty để tự động sinh ra JavaBean component dựa trên những thông số yêu cầu chuyển đến. ApacheStruts mở rộng thêm khả năng này và thêm vào vài tiện ích khác, tất cả nhằm phục vụ cho việc đơn giản hóa tiến trình xử lý những thông số yêu cầu từ client.
Beantags:
• ApacheStruts cung cấp 1 tập customJSPtags (cụ thể là bean:write) cho phép dể dàng xuất ra những thuộc tính của JavaBean
components.
HTMLtags:
• ApacheStruts cung cấp 1 tập custom JSP tags để tạo HTML forms- những cái hổ trợ cho Java Bean components. Sự hổ trợ bean/form này phục vụ 2 mục đích sau:
+ Nó cho phép ta khởi tạo các giá trị field của form từ các đối tượng Java.
+ Nó cho phép ta hiển thị lại các form với 1 vài hoặc tất cả những giá trị nhập vào lúc trước 1 cách nguyên vẹn.
Kiểm tra giá trị các field của form:
• Apache Struts tích hợp sẵn những khả năng cho việc kiểm tra những giá trị form được định dạng theo yêu cầu. Nếu những giá trị không định dạng hoặc định dạng sai, form có thể tự động hiển thị những thông báo lỗi. Cách ràng buộc này có thể thực hiện trên server (Java) hoặc trên client (JavaScript).
Kiểm tra giá trị các field của form:
3.4.2. Nhược điểm của Struts
• Để sử dụng MVC với chuẩn RequestDispatcher, ta cần nghiên cứu sâu với chuẩn JSP và Servlet APIs. Để sử dụng MVC với Struts, ta còn phải hiểu rõ cả framework rộng lớn và phức tạp, nó tương tự như việc tìm hiểu cả cái cốt lõi của hệ thống. Điều bất lợi này đặc biệt đáng kể với những dự án nhỏ, những dự án có ít thời gian để thực hiện, và những lập trình viên có ít kinh nghiệm ta mất rất nhiều thời gian trong việc nghiên cứu Struts khi thực hiện đề án. • So sánh với chuẩn servlet và JSP APIs, Struts có ít tài liệu hỗ trợ • Với những ứng dụng Struts, có nhiều lỗi bên dưới hơn những ứng
dụng Web dựa trên ngôn ngữ Java bình thường. Vì thế, ứng dụng Struts thì:
1. Khó tìm hiểu.
CHƯƠNG 4
ÁP DỤNG STRUTS 1 FRAMEWORK VÀ ỨNG DỤNG DEMO TRIỂN KHAI THỰC TẾ
Chư ơ ng trình: Website ẩm thực Nghệ an
Minh họa chức năng cập nhật tài khoản.
Tổng quan về ứng dụng Website ẩm thực Nghệ an:
Nghệ an là một trong những vùng miền có nhiều đặc sản nổi tiếng khắp cả nước, do đó chúng ta cần 1 phương tiện như một trang web chính thức để giới thiệu cho bạn bè 4 phương biết đến và thưởng thức:
- Giới thiệu, quảng bá và cung cấp các món ngon, địa điểm nhà hàng an toàn, chất lượng cho người dùng lựa chọn.
- Tin tức – văn hóa, sự kiện, mách nhỏ những mẹo vặt về ẩm thực trong tuần, tháng.
- Các thông tin về sức khỏe dưỡng chất để có đủ năng lượng giúp cho học tập và làm việc.
- Website ẩm thực của chúng tôi còn là nơi để những người quan tâm đến ẩm thực có thể trao đổi, bình luận, học hỏi và chia sẻ những bí quyết của mình.
- Ngoài ra website của chúng tôi còn có 1 phần “không gian sáng tạo” để mọi người có thể thoải mái sáng tạo ra những món ăn mới làm cho kho món ăn Việt ngày càng phong phú hơn, giúp những bạn trẻ ưa thích sáng tạo được thể hiện bản thân, cá tính của mình qua các món ăn.
Hoạt động chính của website Ẩm thực Nghệ an Người quản trị :
Người quản trị được đăng nhập vào hệ thống với account = Admin Có quền chỉnh sửa cập nhật các thông tin chung ( thông tin các thành
viên, món ăn, nhà hàng, thông tin món ngon, quán ngon, vv..).
Người dùng:
Có quền login vào hệ thống sau khi đã đăng kí thông tin trên hệ thống.
Xem, góp ý, liên hệ, bình chọn, tìm kiếm các thông tin chung trong hệ thống.
Người dùng còn có quền đăng bài viết. Tạo ra thực đơn ăn uống cho chính mình. Có chức năng tìm kiếm.
4.1. Quá trình thực hiện
4.1.1. Các trang hiển thị (View)
QuanLyThanhVien.jsp
<body>
<html:form action="/updateNguoiDung"> <br>
<h2 align="center" style="color: 0000FF">THÔNG TIN NGƯỜI DÙNG</h2>
<div align="center">
<fieldset style="width: 500">
<legend style="color: 0000FF"> Thông tin danh sách </legend>
<table width="300px" height="30" bgcolor=""
border="0"
align="center"> <TR>
<th align="left">Tên Đăng Nhập:</th>
<td><html:text
property="tenDangNhap" disabled="true" /></td> </TR>
<TR align="left">
<th>Họ và Tên:</th>
<td><html:text property="hoTen"
disabled="true"/></td>
</TR>