Struts 2 异常处理 - 异常拦截器

2025年3月17日 | 阅读 3 分钟

在我们的 Web 应用程序中,任何时候都可能发生异常。

为了解决这个问题,Struts 2 提供了一种全局异常处理机制,我们可以向用户显示全局结果。

Struts 2 会自动记录未捕获的异常,并将用户重定向到错误处理页面。


理解异常拦截器的内部工作原理

如果发生异常,它会被包装在 ExceptionHolder 中,并推送到 value stack 中,以便我们可以轻松地从结果访问异常对象。

建议将此拦截器作为第一个拦截器,以便它可以处理所有异常,无论它是由其他拦截器抛出的。


异常拦截器的参数

为异常拦截器定义了 3 个参数。 全部都是可选的。

参数描述
logEnabled指定是否启用日志。 可以传递 true 或 false。
logLevel指定日志级别。 它可以是 trace、debug、info、warn、error、fatal。 默认日志级别是debug
logCategory指定日志类别,例如 com.mycompany.app。 默认为 com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor。

Struts 2 中异常处理的例子

对于异常处理,我们在 struts.xml 文件中指定 global-result 和 global-exception-mappings。

struts.xml

package 的global-results子元素指定此包的全局结果。

global-result 的result子元素指定将作为视图呈现给用户的结果页面。

package 的global-exception-mappings子元素指定此包的所有操作的异常映射。

global-exception-mapping 的exception-mapping子元素为给定的异常类型映射给定的结果。 在此示例中,我们使用 Exception,它是许多异常类(例如 IOException、ArithmeticException 等)的父类。 这意味着如果发生任何异常,将调用指定的结果。

请注意,global-results 必须在 global-exception-mappings 之前指定,因为我们在 global-exception-mappings 中使用 global result。


显示异常

我们可以通过打印 exception 或 exceptionStack 在浏览器上显示异常。

exception 对象打印异常名称,而 exceptionStack 打印异常详细信息。

globalresult.jsp

异常处理的完整例子

完成此示例所需的其他资源如下

  1. 输入页面 (index.jsp)
  2. Action 类 (Login.java)
  3. 视图组件 (globalresult.jsp, welcome.jsp 和 error.jsp)

1) 创建 index.jsp 用于输入

此 jsp 页面使用 struts UI 标签创建一个表单。 它接收用户的姓名和密码。

index.jsp

2) 创建 action 类

这个 Action 类包含两个字段 name 和 password 以及一个方法 execute。 在这里,如果密码匹配 struts,我们会自行抛出异常。

这是一个虚拟示例,如果您注释掉 execute 方法中提到的行,则不会发生异常。

Login.java

3) 创建视图组件

有三个视图组件 globalresult.jsp 显示异常消息,welcome.jsp 显示包含用户名的欢迎消息,error.jsp 显示错误消息。

globalresult.jsp
welcome.jsp
error.jsp