Custom Interceptor trong Struts 2



Trong Struts 2, bạn có thể tạo Interceptor riêng cho mình bằng cách triển khai Interceptor Interface trong một lớp và ghi đè 3 phương thức trong vòng đời của nó.

Để tạo Custom Interceptor, Interceptor Interface phải được triển khai. Nó có 3 phương thức là:

1. public void init(): Được triệu hồi chỉ một lần và được sử dụng để khởi tạo Interceptor.

2. public void intercept(ActionInvocation ai): Được triệu hồi với mỗi request, nó được sử dụng để định nghĩa trình logic của tiến trình xử lý. Nếu nó trả về chuỗi, thì result page sẽ được triệu hồi. Nếu nó trả về phương thức invoke() của ActionInvocation Interface, thì Interceptor hoặc action kế tiếp sẽ được triệu hồi.

3. public void destroy(): Được triệu hồi chỉ một lần và được sử dụng để hủy Interceptor.

Ghi chú: Interceptor có thể thay đổi flow của ứng dụng bởi trả về chuỗi.

Ví dụ để tạo Custom Interceptor trong Struts 2

Trong ví dụ này, chúng ta tạo Custom Interceptor mà chuyển đổi yêu cầu xử lý dữ liệu thành chữ hoa. Bạn theo hai bước để tạo Custom Interceptor:

Bước 1: Tạo một Interceptor (phải triển khai Interceptor Interface)

Chúng ta chuyển đổi thuộc tính name của lớp action thành chữ hoa.

MyInterceptor.java

package com;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
import com.opensymphony.xwork2.util.ValueStack;

public class MyInterceptor implements Interceptor{

	public void init() {}
	public String intercept(ActionInvocation ai) throws Exception {
		ValueStack stack=ai.getStack();
		String s=stack.findString("name");
		
		stack.set("name",s.toUpperCase());
		return ai.invoke();
	}
	public void destroy() {}
}

Trong phần code trên, phương thức getStack() của ActionInvocation trả về tham chiếu của ValueStack. Chúng ta sẽ lấy giá trị được thiết lập trong thuộc tính name bởi phương thức findString của ValueStack.

Phương thức set của ValueStack thiết lập thuộc tính name với giá trị đã cho. Trong trường hợp này, chúng ta chuyển đổi giá trị của thuộc tính name thành chữ hoa và lưu trữ nó vào trong ValueStack. Phương thức invoke của ActionInvocation trả về thông tin của resource kế tiếp.

Bước 2: Định nghĩa entry của Interceptor trong struts.xml file

Để định nghĩa Interceptor, đầu tiên chúng ta cần khai báo một Interceptor. Phần tử interceptors của package được sử dụng để xác định các interceptor. Phần tử interceptor của interceptors được sử dụng để định nghĩa Custom Interceptor của riêng bạn.

Phần tử con interceptor-ref của action xác định Interceptor mà sẽ được áp dụng cho action này. Tại đây, chúng ta xác định các interceptor là defaultStack và upper.

struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts
Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="abc" extends="struts-default">

<interceptors>
<interceptor name="upper" class="com.MyInterceptor"></interceptor>
</interceptors>

<action name="login" class="com.Login">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="upper"></interceptor-ref>
<result>welcome.jsp</result>
</action>

</package>
</struts>   

Một số resource cần thiết khác

Chúng ta cũng cần một số resource khác như index.jsp, Login.java, welcome.jsp, như sau:

Tạo form để nhận input (index.jsp)

JSP page này tạo một form bởi sử dụng struts-tags. Nó nhận name từ người dùng.

index.jsp

<%@ taglib uri="/struts-tags" prefix="s" %>
<s:form action="login">
<s:textfield name="name" label="Name"></s:textfield>
<s:submit value="login"></s:submit>
</s:form>

Tạo lớp action

:

Lớp action đơn giản chứa thuộc tính name và các phương thức setter và getter.

Login.java

package com;
public class Login {
private String name;

public String getName() {
	return name;
}
public void setName(String name) {
	this.name = name;
}
public String execute(){
	return "success";
}
}

Tạo thành phần view

JSP page này hiển thị name đã được nhập bởi người dùng.

welcome.jsp

<%@ taglib uri="/struts-tags" prefix="s" %>
Welcome, <s:property value="name"/>