Khởi tạo Project và Lưu ý Phiên Bản
Khi thiết lập project mới trên IntelliJ IDEA, hãy chọn tích hợp sẵn Spring và Struts2. Một điểm quan trọng cần lưu ý là phiên bản Struts2, vì đường dẫn class của Filter sẽ thay đổi tùy thuộc vào phiên bản cụ thể được sử dụng.
Sau khi chọn thư mục lưu trữ và hoàn tất wizard, IDE sẽ tự động tải về các thư viện jar cần thiết. Cấu trúc thư mục ban đầu sẽ được sinh ra tự động.
Điều chỉnh cấu hình web.xml
Tệp web.xml được tạo ra mặc định cần được kiểm tra và hiệu chỉnh lại để đảm bảo tương thích:
- Xác minh class của Struts2 Filter có khớp với phiên bản đã chọn hay không. Nếu không khớp, cần sửa lại đường dẫn dẫn đến
StrutsPrepareAndExecuteFilter. - Thêm listener
ContextLoaderListenercho Spring. Lưu ý rằng nếu thiếu filespring-web(ví dụ phiên bản 4.3.18), cần tải về và bổ sung vào thư mục lib. Có thể tải từ repository chính thức của Spring.
Dưới đây là cấu hình web.xml đã được chuẩn hóa:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name>IntegratedApp</display-name>
<welcome-file-list>
<welcome-file>signin.jsp</welcome-file>
</welcome-file-list>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<filter>
<filter-name>struts2Filter</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
Đảm bảo cấu hình output path trong IDEA đã trỏ đúng đến thư mục chứa các thư viện jar trong lib.
Xây dựng Action Handling
Tạo một class Action mới trong thư mục src để xử lý logic nghiệp vụ, ví dụ AuthenticationController.java:
import com.opensymphony.xwork2.ActionSupport;
public class AuthenticationController extends ActionSupport {
private String userId;
private String passCode;
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getPassCode() {
return passCode;
}
public void setPassCode(String passCode) {
this.passCode = passCode;
}
@Override
public String execute() throws Exception {
if ("administrator".equals(userId) && "secure123".equals(passCode)) {
return SUCCESS;
} else {
return LOGIN;
}
}
}
Cấu hình Spring Container
Tạo file applicationContext.xml để định nghĩa bean và inject Action vào container Spring. Sử dụng scope prototype để đảm bảo mỗi request có một instance mới:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="authBean" class="AuthenticationController" scope="prototype"/>
</beans>
Cấu hình Struts2 Mapping
File struts.xml sẽ định nghĩa luồng điều hướng giữa Action và các view:
<?xml version="1.0" encoding="UTF-8"?>
<struts>
<package name="core" namespace="/" extends="struts-default">
<action name="Authenticate" class="AuthenticationController">
<result name="success">/WEB-INF/jsp/dashboard.jsp</result>
<result name="login">/signin.jsp</result>
</action>
</package>
</struts>
Triển khai Giao diện người dùng
Tạo thư mục jsp bên trong WEB-INF và xây dựng trang kết quả dashboard.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Chào mừng ${userId}</title>
</head>
<body>
<h1>Xác thực thành công!</h1>
</body>
</html>
Cập nhật trang đăng nhập signin.jsp tại root của web app:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Trang đăng nhập</title>
</head>
<body>
<h1>Đăng nhập hệ thống</h1>
<form action="Authenticate.action" method="post">
<table>
<tr>
<td>Tên người dùng:</td>
<td><input type="text" name="userId"></td>
</tr>
<tr>
<td>Mật khẩu:</td>
<td><input type="password" name="passCode"></td>
</tr>
<tr>
<td colspan="2" style="text-align: center"><input type="submit" value="Đăng nhập"></td>
</tr>
</table>
</form>
</body>
</html>
Xử lý sự cố tương thích thư viện
Khi triển khai lên Tomcat, có thể gặp lỗi liên quan đến Log4j2 hoặc khởi tạo Dispatcher thất bại do xung đột phiên bản Struts2 đi kèm mặc định của IDEA. Thông báo lỗi thường đề cập đến việc không tìm thấy logging implementation hoặc lỗi reflection khi inject container.
Giải pháp hiệu quả là thay thế toàn bộ các file jar của Struts2 cũ bằng phiên bản mới nhất tải từ trang chủ chính thức. Sau khi xóa các thư viện cũ và cập nhật lại classpath với bộ jar mới, project sẽ khởi động thành công. Khi nhập đúng thông tin xác thực, ứng dụng sẽ chuyển hướng đến trang dashboard như mong đợi.