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" ?> <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>