exeption Interceptor - Xử lý ngoại lệ




Trong ứng dụng web của chúng ta, tại bất cứ thời điểm nào cũng có thể xuất hiện exception. Để giải quyết vấn đề này, Struts 2 cung cấp một kỹ thuật xử lý ngoại lệ toàn cục, tại đây chúng ta có thể hiển thị một global result tới người dùng.

Struts 2 tự động log các Uncaught Exception và điều hướng người dùng tới trang Error Handler.

Trình làm việc nội tại của exception Interceptor

Nếu xảy ra ngoại lệ nào, nó được bao trong ExceptionHolder và được đẩy vào trong ValueStack để mà chúng ta có thể dễ dàng truy cập đối tượng Exception từ result.

Ghi chú: Mình đề nghị bạn nên tạo Interceptor này như là Interceptor đầu tiên, để mà nó có thể xử lý tất cả exception, dù cho nó được ném bởi các Interception khác.

Các tham số của exception Interceptor

Có ba tham số được định nghĩa cho exception Interceptor. Tất cả tham số này là tùy ý.

1. logEnabled: xác định rằng log nên được kích hoạt hay là không. Bạn có thể truyền true hoặc false.

2. logLevel: xác định log level, nó có thể là trace, debug, info, warn, error, fatal. Theo mặc định là debug.

3. logCategory: xác định log category, ví dụ như com.mycompany.app. Mặc định là com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor

Ví dụ về Xử lý ngoại lệ trong Struts 2

Để xử lý ngoại lệ, bạn xác định global-result và global-exception-mappings trong struts.xml file.

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="aa" extends="struts-default">

<global-results>
<result name="myresult">globalresult.jsp</result>
</global-results>

<global-exception-mappings>
<exception-mapping result="myresult" exception="java.lang.Exception"></exception-mapping>
</global-exception-mappings>

<action name="login" class="com.Login">
<result>welcome.jsp</result>
<result name="error">error.jsp</result>
</action>

</package>
</struts>  
  • Phần tử con global-results của package xác định global-result cho package này.

  • Phần tử con result của global-result xác định result page mà sẽ được truyền tới người dùng như là một view.

  • Phần tử con global-exception-mappings của package xác định ánh xạ ngoại lệ cho tất cả các action của package này.

  • Phần tử con exception-mapping của global-exception-mappings ánh xạ result đã choc ho kiểu ngoại lệ đã cung cấp. Trong ví dụ này, chúng ta sử dụng Exception mà là cha của các lớp exception như IOException, ArithmeticException, … Nghĩa là nếu có bất cứ ngoại lệ nào xuất hiện, thì result đã cho sẽ được triệu hồi.

Ghi chú: Chú ý rằng global-result phải được xác định trước global-exception-mappings như khi chúng ta sử dụng trong ví dụ trên.

Hiển thị exception trong Struts 2

Chúng ta có thể hiển thị exception trên trình duyệt bằng việc in exception hoặc exceptionStack. Đối tượng exception in tên của ngoại lệ trong khi exceptionStack in chi tiết về ngoại lệ đó.

globalresult.jsp

<p>Exception Name: <s:property value="exception" /> </p>
<p>Exception Details: <s:property value="exceptionStack" /></p>

Ví dụ đầy đủ về xử lý ngoại lệ trong Struts 2

Để hoàn thành ví dụ này, bạn cần các resource khác, đó là:

Tạo input page

JSP page này tạo một form bởi sử dụng struts-tags. Nó nhận name và password 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:password name="password" label="Password"></s:password>
<s:submit value="login"></s:submit>
</s:form>

Tạo lớp Action

Lớp action này chứa hai trường là name và password và một phương thức là execute. Tại đây, chúng ta ném exception nếu như mật khẩu là không kết nối với struts. Đây là ví dụ giả, nếu bạn comment ở dòng dưới đây trong phương thức execute thì exception sẽ không xảy ra.

login.java

package com;
public class Login {
private String name,password;
//phuong thuc getter va setter

public String execute(){
	if(password.equals("struts")){
		int a=12/0;//Neu ban comment dieu nay, exception se khong xay ra
		return "success";
	}else
		return "error";
}
}  

Tạo các thành phần view

Có ba thành phần view, đó là: globalresult.jsp hiển thị exception message, welcome.jsp hiển thị welcome message với username và error.jsp hiển thị error message.

globalresult.jsp

<%@ taglib uri="/struts-tags" prefix="s" %>

Sorry an exception occured!
<p>Exception Name: <s:property value="exception" /> </p>
<p>Exception Details: <s:property value="exceptionStack" /></p>
<form>
<input type="button" value="back" onclick="history.back()">
</form>

welcome.jsp

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

error.jsp

Xin loi, xay ra loi voi username hoac password ban nhap vao!!
<jsp:include page="index.jsp"></jsp:include>