异常处理很重要,异常处理不是定义在验证阶段的,就拿登录这个功能来说吧,假如用户填入的信息都符合规范,通过了验证阶段,但去数据库中查询该用户信息时,发现数据库中没有与其匹配的信息,则会抛出异常,转向错误页面。
1.先来自定义一个异常,该异常继承Exception父类
- package com.exception ;
- //自定义异常
- public class MyException extends Exception {
- private String message;
- public MyException(String message)
- {
- super(message);
- this.message = message ;
- }
- public String getMessage() {
- return message;
- }
- public void setMessage(String message) {
- this.message = message;
- }
- }
2.LoginAction类的部分代码,假设用户输入的账号和密码不是hello,world 则抛出异常
- public String execute() throws Exception
- {
- if(!"hello".equals(usename) || !"world".equals(password))
- {
- throw new MyException("用户名或密码错误,您发现了吧!");
- }
- return "success" ;
- }
3.异常又分为 局部异常处理 和 全局异常处理
在struts.xml中声明捕捉异常,使其转成自定义错误提示界面
局部异常处理,定义在action标签内:
struts.xml
- <?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>
- <package name="struts2" extends="struts-default">
- <!-- name="login" 这个名字可以自己定义 要和 提交表单的那个action名字一致 -->
- <action name="login" class="com.struts2.LoginAction">
- <!-- 局部 异常处理 -->
- <exception-mapping result="myexception1"
- exception="com.exception.MyException">
- </exception-mapping>
- <!-- 异常跳转的界面 -->
- <result name="myexception1">/error.jsp</result>
- <!-- name="success"
- 这个名字要和LoginAction.java 的 execute() 方法的返回值一致
- -->
- <result name="success">/result.jsp</result>
- </action>
- </package>
- </struts>
全局异常处理,定义在action标签外:
struts.xml
- <?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>
- <package name="struts2" extends="struts-default">
- <!-- 全局 异常处理 -->
- <global-results>
- <result name="myexception1">/error.jsp</result>
- </global-results>
- <global-exception-mappings>
- <exception-mapping result="myexception1"
- exception="com.exception.MyException">
- </exception-mapping>
- </global-exception-mappings>
- <!-- name="login" 这个名字可以自己定义 要和 提交表单的那个action名字一致 -->
- <action name="login" class="com.struts2.LoginAction">
- <!-- name="success"
- 这个名字要和LoginAction.java 的 execute() 方法的返回值一致
- -->
- <result name="success">/result.jsp</result>
- </action>
- </package>
- </struts>
4.错误页面error.jsp,
- <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
- <%@ taglib prefix="s" uri="/struts-tags"%>
- <html>
- <body>
- <!-- 这个exception 是 exception="com.exception.MyException" -->
- <s:property value="exception.message"/>
- </body>
- </html>
小结:
局部异常处理比全局异常处理高,并且可覆盖全局异常处理,如果定义了全局异常映射,那么会对所有的Action生效,反之定义了局部异常映射则会对当前Action生效,
如果在全局区域和局部区域定义了相同的异常映射,首先去局部异常区域找result结果页面,如果找到了,则直接跳转到错误结果页面,不管全局有没有相同的结果,都被局部所覆盖,如果在局部区域没找到,则去全局区域找。