Struts 2 - Khung xác thực
Trong chương này, chúng ta sẽ xem xét sâu hơn về khung xác thực Struts. Tại lõi Struts, chúng ta có khung xác thực hỗ trợ ứng dụng chạy các quy tắc để thực hiện xác thực trước khi phương thức hành động được thực thi.
Xác nhận phía máy khách thường đạt được bằng cách sử dụng Javascript. Tuy nhiên, không nên chỉ dựa vào xác nhận phía máy khách. Các phương pháp hay nhất gợi ý rằng việc xác nhận nên được giới thiệu ở tất cả các cấp trong khuôn khổ ứng dụng của bạn. Bây giờ chúng ta hãy xem xét hai cách để thêm xác thực vào dự án Struts của chúng tôi.
Ở đây, chúng tôi sẽ lấy một ví dụ về một Employee tên và tuổi sẽ được ghi lại bằng cách sử dụng một trang đơn giản và chúng tôi sẽ đặt hai xác thực này để đảm bảo rằng người dùng luôn nhập tên và tuổi phải nằm trong khoảng từ 28 đến 65.
Chúng ta hãy bắt đầu với trang JSP chính của ví dụ.
Tạo trang chính
Hãy để chúng tôi viết tệp JSP trang chính index.jsp, sẽ được sử dụng để thu thập thông tin liên quan đến Nhân viên được đề cập ở trên.
<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Employee Form</title>
</head>
<body>
<s:form action = "empinfo" method = "post">
<s:textfield name = "name" label = "Name" size = "20" />
<s:textfield name = "age" label = "Age" size = "20" />
<s:submit name = "submit" label = "Submit" align="center" />
</s:form>
</body>
</html>
Index.jsp sử dụng thẻ Struts mà chúng ta chưa đề cập đến, nhưng chúng ta sẽ nghiên cứu chúng trong các chương liên quan đến thẻ. Nhưng hiện tại, chỉ cần giả sử rằng thẻ s: textfield in một trường đầu vào và s: submit in ra một nút gửi. Chúng tôi đã sử dụng thuộc tính nhãn cho mỗi thẻ để tạo nhãn cho mỗi thẻ.
Tạo chế độ xem
Chúng tôi sẽ sử dụng tệp JSP success.jsp sẽ được gọi trong trường hợp hành động được xác định trả về SUCCESS.
<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Success</title>
</head>
<body>
Employee Information is captured successfully.
</body>
</html>
Tạo hành động
Vì vậy, chúng ta hãy xác định một lớp hành động nhỏ Employeerồi thêm một phương thức được gọi là validate() như hình dưới đây trong Employee.javatập tin. Đảm bảo rằng lớp hành động của bạn mở rộngActionSupport lớp, nếu không phương thức xác thực của bạn sẽ không được thực thi.
package com.tutorialspoint.struts2;
import com.opensymphony.xwork2.ActionSupport;
public class Employee extends ActionSupport {
private String name;
private int age;
public String execute() {
return SUCCESS;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void validate() {
if (name == null || name.trim().equals("")) {
addFieldError("name","The name is required");
}
if (age < 28 || age > 65) {
addFieldError("age","Age must be in between 28 and 65");
}
}
}
Như được hiển thị trong ví dụ trên, phương thức xác thực kiểm tra xem trường 'Tên' có giá trị hay không. Nếu không có giá trị nào được cung cấp, chúng tôi sẽ thêm lỗi trường cho trường 'Tên' với thông báo lỗi tùy chỉnh. Thứ hai, chúng tôi kiểm tra xem giá trị đã nhập cho trường 'Tuổi' có nằm trong khoảng từ 28 đến 65 hay không, nếu điều kiện này không đáp ứng, chúng tôi sẽ thêm lỗi phía trên trường đã xác thực.
Tệp cấu hình
Cuối cùng, chúng ta hãy kết hợp mọi thứ lại với nhau bằng cách sử dụng struts.xml tập tin cấu hình như sau:
<?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.devMode" value = "true" />
<package name = "helloworld" extends = "struts-default">
<action name = "empinfo"
class = "com.tutorialspoint.struts2.Employee"
method = "execute">
<result name = "input">/index.jsp</result>
<result name = "success">/success.jsp</result>
</action>
</package>
</struts>
Sau đây là nội dung của web.xml tập tin -
<?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_3_0.xsd"
id = "WebApp_ID" version = "3.0">
<display-name>Struts 2</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<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>
</web-app>
Bây giờ, nhấp chuột phải vào tên dự án và nhấp vào Export > WAR Fileđể tạo tệp Chiến tranh. Sau đó, triển khai WAR này trong thư mục ứng dụng web của Tomcat. Cuối cùng, khởi động máy chủ Tomcat và cố gắng truy cập URLhttp://localhost:8080/HelloWorldStruts2/index.jsp. Điều này sẽ tạo ra màn hình sau:
Bây giờ không nhập bất kỳ thông tin cần thiết nào, chỉ cần nhấp vào Submitcái nút. Bạn sẽ thấy kết quả sau:
Nhập thông tin bắt buộc nhưng nhập sai trường Từ, hãy để chúng tôi nói tên là "kiểm tra" và tuổi là 30, và cuối cùng nhấp vào Submitcái nút. Bạn sẽ thấy kết quả sau:
Việc xác thực này hoạt động như thế nào?
Khi người dùng nhấn nút gửi, Struts 2 sẽ tự động thực thi phương thức xác thực và nếu có “if”các câu lệnh được liệt kê bên trong phương thức là true, Struts 2 sẽ gọi phương thức addFieldError của nó. Nếu bất kỳ lỗi nào đã được thêm vào, thì Struts 2 sẽ không tiến hành gọi phương thức thực thi. Thay vào đó, khuôn khổ Struts 2 sẽ trở lạiinput là kết quả của việc gọi hành động.
Do đó, khi xác thực không thành công và Struts 2 trả về input, khung công tác Struts 2 sẽ hiển thị lại tệp index.jsp. Vì chúng tôi đã sử dụng thẻ biểu mẫu Struts 2 nên Struts 2 sẽ tự động thêm các thông báo lỗi ngay phía trên biểu mẫu đã nộp.
Những thông báo lỗi này là những thông báo chúng tôi đã chỉ định trong cuộc gọi phương thức addFieldError. Phương thức addFieldError nhận hai đối số. Đầu tiên, làform tên trường mà lỗi áp dụng và thứ hai, là thông báo lỗi hiển thị phía trên trường biểu mẫu đó.
addFieldError("name","The name is required");
Để xử lý giá trị trả về của input chúng tôi cần thêm kết quả sau vào nút hành động của chúng tôi trong struts.xml.
<result name = "input">/index.jsp</result>
Xác thực dựa trên XML
Phương pháp thứ hai để thực hiện xác thực là đặt một tệp xml bên cạnh lớp hành động. Xác thực dựa trên XML của Struts2 cung cấp nhiều tùy chọn xác thực hơn như xác thực email, xác thực phạm vi số nguyên, trường xác thực biểu mẫu, xác thực biểu thức, xác thực regex, xác thực yêu cầu, xác thực chuỗi yêu cầu, xác thực độ dài chuỗi, v.v.
Tệp xml cần được đặt tên '[action-class]'-validation.xml. Vì vậy, trong trường hợp của chúng tôi, chúng tôi tạo một tệp có tênEmployee-validation.xml với các nội dung sau -
<!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator 1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
<field name = "name">
<field-validator type = "required">
<message>
The name is required.
</message>
</field-validator>
</field>
<field name = "age">
<field-validator type = "int">
<param name = "min">29</param>
<param name = "max">64</param>
<message>
Age must be in between 28 and 65
</message>
</field-validator>
</field>
</validators>
Tệp XML bên trên sẽ được lưu giữ lý tưởng trong CLASSPATH của bạn cùng với tệp lớp. Hãy để chúng tôi có lớp hành động Nhân viên của chúng tôi như sau mà không cầnvalidate() phương pháp -
package com.tutorialspoint.struts2;
import com.opensymphony.xwork2.ActionSupport;
public class Employee extends ActionSupport{
private String name;
private int age;
public String execute() {
return SUCCESS;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Phần còn lại của thiết lập sẽ vẫn như ví dụ trước, bây giờ nếu bạn chạy ứng dụng, nó sẽ tạo ra kết quả giống như những gì chúng ta nhận được trong ví dụ trước.
Ưu điểm của việc có tệp xml để lưu trữ cấu hình cho phép tách xác thực khỏi mã ứng dụng. Bạn có thể nhờ một nhà phát triển viết mã và một nhà phân tích kinh doanh để tạo các tệp xml xác thực. Một điều cần lưu ý nữa là các loại trình xác thực có sẵn theo mặc định.
Có rất nhiều trình xác thực khác đi kèm với Struts theo mặc định. Trình xác thực phổ biến bao gồm Trình xác thực ngày, Trình xác thực Regex và Trình xác thực độ dài chuỗi. Kiểm tra liên kết sau để biết thêm chi tiết Struts - Trình xác thực dựa trên XML .