Struts2之异常处理

时间:2022-11-27 00:45:38

异常处理很重要,异常处理不是定义在验证阶段的,就拿登录这个功能来说吧,假如用户填入的信息都符合规范,通过了验证阶段,但去数据库中查询该用户信息时,发现数据库中没有与其匹配的信息,则会抛出异常,转向错误页面。


1.先来自定义一个异常,该异常继承Exception父类

[java] view plain copy
  1. package com.exception ;  
  2.   
  3. //自定义异常  
  4. public class MyException extends Exception {  
  5.       
  6.     private String message;  
  7.       
  8.     public MyException(String message)  
  9.     {  
  10.         super(message);  
  11.         this.message = message ;  
  12.     }  
  13.   
  14.     public String getMessage() {  
  15.         return message;  
  16.     }  
  17.   
  18.     public void setMessage(String message) {  
  19.         this.message = message;  
  20.     }  
  21.       
  22.   
  23. }  

2.LoginAction类的部分代码,假设用户输入的账号和密码不是hello,world 则抛出异常

[java] view plain copy
  1. public String execute() throws Exception  
  2. {  
  3.     if(!"hello".equals(usename) || !"world".equals(password))  
  4.     {  
  5.         throw new MyException("用户名或密码错误,您发现了吧!");  
  6.     }  
  7.       
  8.     return "success" ;  
  9. }  

3.异常又分为 局部异常处理 和 全局异常处理

在struts.xml中声明捕捉异常,使其转成自定义错误提示界面


局部异常处理定义在action标签内

struts.xml

[html] view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE struts PUBLIC  
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
  4.     "http://struts.apache.org/dtds/struts-2.0.dtd">  
  5.       
  6. <struts>  
  7.       
  8.    <package name="struts2" extends="struts-default">      
  9.        
  10.       <!-- name="login" 这个名字可以自己定义 要和 提交表单的那个action名字一致 -->  
  11.        
  12.       <action name="login" class="com.struts2.LoginAction">  
  13.               
  14.             <!-- 局部 异常处理 -->  
  15.             <exception-mapping result="myexception1"  
  16.                exception="com.exception.MyException">             
  17.             </exception-mapping>  
  18.             <!-- 异常跳转的界面 -->  
  19.             <result name="myexception1">/error.jsp</result>  
  20.                
  21.                
  22.             <!-- name="success"   
  23.                                   这个名字要和LoginAction.java 的 execute() 方法的返回值一致   
  24.             -->  
  25.             <result name="success">/result.jsp</result>  
  26.               
  27.       </action>  
  28.      
  29.    </package>   
  30.   
  31. </struts>  

全局异常处理,定义在action标签外:

struts.xml

[html] view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE struts PUBLIC  
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
  4.     "http://struts.apache.org/dtds/struts-2.0.dtd">  
  5.       
  6. <struts>  
  7.       
  8.    <package name="struts2" extends="struts-default">  
  9.         
  10.       <!-- 全局 异常处理 -->  
  11.       <global-results>  
  12.           <result name="myexception1">/error.jsp</result>  
  13.       </global-results>  
  14.         
  15.       <global-exception-mappings>  
  16.           <exception-mapping result="myexception1"  
  17.                exception="com.exception.MyException">             
  18.           </exception-mapping>  
  19.       </global-exception-mappings>  
  20.        
  21.       <!-- name="login" 这个名字可以自己定义 要和 提交表单的那个action名字一致 -->  
  22.        
  23.       <action name="login" class="com.struts2.LoginAction">  
  24.               
  25.                
  26.             <!-- name="success"   
  27.                                   这个名字要和LoginAction.java 的 execute() 方法的返回值一致   
  28.             -->  
  29.             <result name="success">/result.jsp</result>  
  30.               
  31.       </action>  
  32.      
  33.    </package>   
  34.   
  35. </struts>  


4.错误页面error.jsp,

[html] view plain copy
  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
  2. <%@ taglib prefix="s"  uri="/struts-tags"%>    
  3. <html>  
  4.   <body>  
  5.     <!-- 这个exception 是 exception="com.exception.MyException" -->  
  6.     <s:property value="exception.message"/>  
  7.   </body>  
  8. </html>  

小结:

局部异常处理比全局异常处理高,并且可覆盖全局异常处理,如果定义了全局异常映射,那么会对所有的Action生效,反之定义了局部异常映射则会对当前Action生效,

如果在全局区域和局部区域定义了相同的异常映射,首先去局部异常区域找result结果页面,如果找到了,则直接跳转到错误结果页面,不管全局有没有相同的结果,都被局部所覆盖,如果在局部区域没找到,则去全局区域找。