Tạo ứng dụng với Struts Framework (Struts Framework-Phần 2)


Trong phần 1 tôi đã giới thiệu tổng quan về cấu trúc, phương thức hoạt động,... của Framework Struts. Trong phần 2 này , tôi sẽ tiếp tục hướng dẫn các bạn xây dựng một ứng dụng đơn giản  để các bạn có thể nắm rõ về Framework này.

Chuẩn bị

1. JDK, download tại http://www.oracle.com/technetwork/java/javase/downloads/index.html
2. Tomcat. Download tại http://tomcat.apache.org/ (Hoặc bạn có thể dùng nhiều server khác như Glassfish, JBoss, Websphere, Weblogic ... )
3. Eclipse IDE for Java EE Developers , có thể download tại http://www.eclipse.org/downloads ( Hoặc bạn có thể sử dụng các IDE khác như Netbean ...)
4. Các tập tin thư viện của Apache Struts2 (.JAR). Download tại http://struts.apache.org/download.cgi . Để thực hiện ứng dụng này các bạn cần các tập tin .jar sau:

 - commons-fileupload-1.2.2.jar
 - commons-io-2.0.1.jar
 - commons-lang-2.4.jar
 - commons-logging-api-1.1.jar
 - commons-logging-1.1.1.jar
 - freemarker-2.3.19.jar
 - javassist-3.11.0.GA.jar
 - ognl-3.0.6.jar
 - struts2-core-2.3.14.jar
 - xwork-core-2.3.14.jar

(Lưu ý rằng tùy thuộc vào phiên bản hiện tại của Struts2,  phiên bản của tập tin jar trên có thể thay đổi. )

Mô tả ứng dụng

Mục tiêu của chúng ta là xây dựng một trang đăng nhập sử dụng Struts Framework. Người dùng sẽ nhập các thông tin để đăng nhập và hệ thống sẽ thực hiện xác thực, nếu thành công thì một trang "Welcome" sẽ xuất hiện và hiển thị thông điệp : "Xin chào , <username>…!" Nếu nười dùng không được xác thực, hệ thống sẽ thông báo lỗi và trả lại trang đăng nhập ban đầu .

Bắt đầu xây dựng ứng dụng


Hướng dẫn này tôi thực hiện trên Eclipse SDK 4.2.2 , trên các IDE khác cách thực hiện tương tự. Open Eclipse,  vào File -> New ->  Project => Chọn Dynamic Web Project  trong New Project wizard :


=> Chọn Next.
- Nhập tên Project trong Project Name (Ví du: "LoginPageWithStruts"). Trong phần Target runtime chọn môi trường chạy project là Apache Tomcat v6.0 (Nếu Tomcat chưa được khai báo tại đây bạn vào New Runtime để cấu hình với tomcat đã được cài trên máy). Cuối cùng nhấn Finish:



- Bây giờ Copy tất cả các file thư viện Struts vào thư mục WebContent -> WEB-INF -> lib (Tạo mới thư mục này nếu chưa có )



Mapping Struts2 vào WEB.xml

 Như đã giới thiệu trong phần 1, ứng dụng Struts sẽ thực hiện định nghĩa Filter trong tập tin mô tả triển khai (web.xml). Chúng ta sẽ định nghĩa lớp org.apache.struts2.dispatcher.FilterDispatcher trong web.xml.
 Mở tập tin web.xml trong thư mục WEB-INF rồi nhập đoạn code sau vào:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>LoginPageWithStruts</display-name>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>Login.jsp</welcome-file>
</welcome-file-list>
</web-app>

Đoạn code trên sẽ map bộ lọc Struts với  url /*. Url mặc định cho ứng dụng struts sẽ trở thành action /* . Lưu ý rằng trong đoạn code trên chúng ta đã định nghĩa tập tin Login.jsp như là một tập tin khởi đầu (Welcome file).

Lớp Action

Chúng ta cần một lớp Action sẽ xác thực người dùng lúc đăng nhập và giữ giá trị cho Username và Password . Chúng ta sẽ tạo một gói có tên là  net.viralpatel.struts2 trong thư mục source và gói này sẽ chứa các file action.
- Tạo một lớp có tên là: LoginAction trong gói net.viralpatel.struts2 với nội dung như sau :

package net.viralpatel.struts2;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport {
private String username;
private String password;
public String execute() {
if (this.username.equals("minhbangchu") && this.password.equals("minhbanghu123")) {
return "Thành công";
} else {
addActionError(getText("error.login"));
return "Có lỗi xảy ra";
}
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}

 Trong ví dụ đơn giản này, chúng ta sẽ chỉ kiểm tra xem Username và Password có phải tương ứng là : minhbangchu và minhbangchu123 hay không.
 Phương thức execute() trả về một chuỗi String xác định kết quả của trang. Ngoài ta trong Struts , tên của phương thức là không cố đinh, có nghĩa là trong ví dụ này chúng ta định nghĩa phương thức execute() nhưng bạn cũng có thể định nghĩa một phương thức tên là authenticate() để thay thế nếu muốn.
 Trong trường hợp người dùng xác thực không thành công, hệ thống sẽ trả về một thông báo lỗi, thông báo lỗi này (error.login) sẽ được xác định trong file ApplicationResources.properties. Để thực hiện điều này chúng ta phải thực hiện kế thừa (extend) lớp LoginAction với lớp ActionSupport. Lớp  com.opensymphony.xwork2.ActionSupport trong Struts cung cấp các phương thức như getText(), addActionErrors() ...

Resource Bundle

ResourceBundle là thực thể Java rất hữu ích giúp đưa các nội dung tĩnh từ file source. Hầu hết các ứng dụng định nghĩa một tập tin ResourceBundle dạng như :  ApplicationResources.properties chứa các thông tin tĩnh như : Username hay Password và đưa nhưng thông tin này với ứng dụng.

ResourceBundle rất tiện dụng khi chúng ta muốn thêm phần hỗ trợ quốc tế hóa, đa ngôn ngữ cho ứng dụng.

Chúng ta sẽ định nghĩa một file ApplicationResources.properties cho ứng dụng của chúng ta. File property này sẽ xuất hiện trong thư mục WEB-INF/classes khi source được biên soạn.

Để tạo một thư mục source , Nháy chuột phải vào Project của bạn trên Project Explorer và chọn New -> Source Folder => Nhập tên thư mục và Resources và nhấn Finish. => Tạo một file ApplicationResources.properties trong thưu mục resources vừa tạo => Copy nội dung sau vào file ApplicationResources.properties :

label.username= Username
label.password= Password
label.login= Đăng nhập
error.login= Mật khẩu hoặc Tên đăng nhập sai. Vui lòng nhập lại!

Tạo file JSP

Chúng ta sẽ tạo ra 2 file JSP để làm đầu ra cho người dùng. Login.jsp sẽ là điểm bắt đầu cho ứng dụng của chúng ta, file này sẽ chưa form đăng nhập đơn giản với Username và Password. Khi được xác thực thành công , người dùng sẽ nhận được trang Welcome.jsp hiển thị thông điểm chào mừng đã đăng nhập thành công!
 Tạo 2 file JSP : Login.jsp và Welcome.jsp trong thư mục WebContent . Copy đoạn code tương ứng sau:

Login.jsp:
<%@ page contentType="text/html; charset=UTF-8"%><%@ taglib prefix="s" uri="/struts-tags"%><html><head><title>Struts 2 - Login Application | minhbangchu.blogspot.com</title></head>
<body> <h2>Struts 2 - Login Application</h2> <s:actionerror /> <s:form action="login.action" method="post"> <s:textfield name="username" key="label.username" size="20" /> <s:password name="password" key="label.password" size="20" /> <s:submit method="execute" key="label.login" align="center" /> </s:form></body></html>

 Welcome.jsp:
<%@ page contentType="text/html; charset=UTF-8"%><%@ taglib prefix="s" uri="/struts-tags"%><html>
<head><title>Chào mừng đến với Minh bang chủ</title></head>
<body> <h2>Xin chào, <s:property value="username" />...!</h2></body></html>

Lưu ý rằng: Chúng ta sử dụng tag <s:> để tạo textbox và nhãn. Struts có sẵn một bộ thư viện các tag dùng để tạo giao diện người dùng hiệu quả hơn.

File struts.xml

Struts framework đọc cấu hình và định nghĩa các lớp từ một file xml gọi là struts.xml. File này được load từ classpath của project. Chúng ta sẽ định nghĩa file struts.xml trong thư mục resources:

Copy nội dung sau vào file struts.xml :
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="false" />
<constant name="struts.custom.i18n.resources" value="ApplicationResources" />
<package name="default" extends="struts-default" namespace="/">
<action name="login" class="net.viralpatel.struts2.LoginAction">
<result name="success">Welcome.jsp</result>
<result name="error">Login.jsp</result>
</action>
</package>
</struts>

  Lưu ý rằng trong file cấu hình trên, chúng ta đã xác định action Login của ứng dụng. Hai đường dẫn kết quả được map với LoginAction tùy thuộc kết quả thực hiện phương thức execute(). Nếu phương thức execute() trả về thành công, người dùng sẽ nhận được trang Welcome.jsp còn nếu không sẽ là trang Login.jsp.

 Cũng lưu ý răng một hằng số được xác định với tên struts.custom.i18n.resources. Hằng số này xác định file resource bundle mà chúng ta đã tạo ở các bước phía trên. Chúng ta phải ghi rõ tên của file resource bundle (Tên này không bao gồm phần đuôi mở rộng - ApplicationResources without .properties)

  LoginAction của chúng ta chứa phương thức execute() là phương thức get mặc định được gọi bởi Struts. Nếu tên của các phương thức khác nhau, ví dụ authenticate(); thì chúng ta nên xác định tên của phương thức trong tag <action> .
<action name="login" method="authenticate"
 class="net.viralpatel.struts2.LoginAction">

Hoàn thành ứng dụng


 Đến đây ứng dụng nhỏ của chúng ta đã hoàn thành. Bạn thực hiện chạy ứng dụng này trên server tomcat. bằng cách Nháy chuột phải vào tên của Project và chọn Run as -> Run on Server (Shortcut: Alt+Shift+X, R)
Và đây là kết quả :


Link download sourcode của ví dụ mà tôi đã thực hiện tại đây : http://www.mediafire.com/?k1jc2y5sn1zg3

0 Nhận xét:

Đăng nhận xét

Rất mong các ý kiến của các bạn khi đọc bài viết này !