Các bước 2 - Xử lý Ngoại lệ

Strutscung cấp một cách dễ dàng hơn để xử lý ngoại lệ không cần thiết và chuyển hướng người dùng đến trang lỗi chuyên dụng. Bạn có thể dễ dàng cấu hình Struts để có các trang lỗi khác nhau cho các trường hợp ngoại lệ khác nhau.

Struts làm cho việc xử lý ngoại lệ trở nên dễ dàng bằng cách sử dụng bộ đánh chặn "ngoại lệ". Bộ đánh chặn "ngoại lệ" được bao gồm như một phần của ngăn xếp mặc định, vì vậy bạn không phải làm gì thêm để định cấu hình nó. Nó có sẵn bên ngoài hộp sẵn sàng để bạn sử dụng.

Chúng ta hãy xem một ví dụ Hello World đơn giản với một số sửa đổi trong tệp HelloWorldAction.java. Ở đây, chúng tôi đã cố tình giới thiệu một Ngoại lệ NullPointer trongHelloWorldAction mã hành động.

package com.tutorialspoint.struts2;

import com.opensymphony.xwork2.ActionSupport;

public class HelloWorldAction extends ActionSupport{
   private String name;

   public String execute(){
      String x = null;
      x = x.substring(0);
      return SUCCESS;
   }
   
   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }
}

Hãy để chúng tôi giữ nội dung của HelloWorld.jsp như sau -

<%@ page contentType = "text/html; charset = UTF-8" %>
<%@ taglib prefix = "s" uri = "/struts-tags" %>

<html>
   <head>
      <title>Hello World</title>
   </head>
   
   <body>
      Hello World, <s:property value = "name"/>
   </body>
</html>

Sau đây là nội dung của index.jsp -

<%@ 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>Hello World</title>
   </head>
   
   <body>
      <h1>Hello World From Struts2</h1>
      <form action = "hello">
         <label for = "name">Please enter your name</label><br/>
         <input type = "text" name = "name"/>
         <input type = "submit" value = "Say Hello"/>
      </form>
   </body>
</html>

Của bạn struts.xml nên trông giống như -

<?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 = "hello" 
         class = "com.tutorialspoint.struts2.HelloWorldAction" 
         method = "execute">
         <result name = "success">/HelloWorld.jsp</result>
      </action>

   </package>
</struts>

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:

Nhập giá trị "Struts2" và gửi trang. Bạn sẽ thấy trang sau -

Như thể hiện trong ví dụ trên, bộ đánh chặn ngoại lệ mặc định thực hiện rất tốt việc xử lý ngoại lệ.

Bây giờ chúng ta hãy tạo một trang lỗi dành riêng cho Ngoại lệ của chúng ta. Tạo một tệp có tênError.jsp với các nội dung sau -

<%@ 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></title>
   </head>
   
   <body>
      This is my custom error page
   </body>
</html>

Bây giờ chúng ta hãy cấu hình Struts để sử dụng trang lỗi này trong trường hợp ngoại lệ. Hãy để chúng tôi sửa đổistruts.xml 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 = "hello" 
         class = "com.tutorialspoint.struts2.HelloWorldAction" 
         method = "execute">
         <exception-mapping exception = "java.lang.NullPointerException"
         result = "error" />
         <result name = "success">/HelloWorld.jsp</result>
         <result name = "error">/Error.jsp</result>
      </action>

   </package>
</struts>

Như thể hiện trong ví dụ trên, bây giờ chúng ta đã cấu hình Struts để sử dụng Error.jsp dành riêng cho NullPointerException. Nếu bạn chạy lại chương trình ngay bây giờ, bạn sẽ thấy kết quả sau:

Ngoài ra, khuôn khổ Struts2 đi kèm với một trình đánh chặn "ghi nhật ký" để ghi lại các ngoại lệ. Bằng cách cho phép trình ghi nhật ký ghi lại các ngoại lệ chưa được ghi nhận, chúng tôi có thể dễ dàng xem xét dấu vết ngăn xếp và tìm ra những gì đã xảy ra

Ánh xạ ngoại lệ toàn cầu

Chúng tôi đã thấy cách chúng tôi có thể xử lý ngoại lệ hành động cụ thể. Chúng tôi có thể đặt một ngoại lệ trên toàn cầu sẽ áp dụng cho tất cả các hành động. Ví dụ: để bắt các ngoại lệ NullPointerException giống nhau, chúng ta có thể thêm<global-exception-mappings...> thẻ bên trong thẻ <package ...> và thẻ <result ...> của nó phải được thêm vào bên trong thẻ <action ...> trong tệp struts.xml 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">
      <global-exception-mappings>
         <exception-mapping exception = "java.lang.NullPointerException"
         result = "error" />
      </global-exception-mappings>

      <action name = "hello" 
         class = "com.tutorialspoint.struts2.HelloWorldAction" 
         method = "execute">
         <result name = "success">/HelloWorld.jsp</result>
         <result name = "error">/Error.jsp</result>
      </action>

   </package>
</struts>