勿以恶小而为之,勿以善小而不为--------------------------刘备
劝诸君,多行善事积福报,莫作恶
上一章简单介绍了Struts2实现类型转换器(十五),如果没有看过,请观看上一章
在开发中,我们常常会遇到很多很多的错误,一般比较常见的是404,500等错误,当项目运行报错之后,浏览器会自做聪明地创建错误的界面,展示错误信息,响应到前台。
然而,这些错误的页面,对于开发者来说,是比较友好的,但对于普通用户来说,却是非常不好的。 所以,必须要避免浏览器创建的错误界面。
一. Tomcat 配置错误界面
在Servlet+JSP 开发时,我们常常通过配置 tomcat 的 web.xml 配置文件进行处理,通过配置不同的错误类型,转到不同的错误页面。
在web.xml 文件中:
404
/WEB-INF/exception/404.jsp
500
/WEB-INF/exception/500.jsp
java.lang.NullPointerException
/WEB-INF/exception/npe.jsp
java.lang.NoSuchMethodException
/WEB-INF/exception/404.jsp
java.lang.Exception
/WEB-INF/exception/exception.jsp
需要在 本项目路径下的 WEB-INF/exception 下创建不同的错误界面就可以了
当运行错误之后, Tomcat 会自动检测错误的类型, 然后会
需要处理一下,常见的几种错误类型, 如 404,500,npe 等异常。 最后,要设置一个统一的异常接收, java.lang.Exception
只能接收 错误代码和 JDK自定义的异常, 无法处理开发者自定义的异常。
二. Struts2 配置异常处理
Struts2 框架提供了异常处理,支持用户自定义异常, 可以在方法中进行判断,也可以配置struts.xml 文件。
但通常,都是以配置文件的形式进行处理
二.一 Struts2 方法处理异常
如在 ExceptionAction.java 中 定义一个 methodException() 的方法,方法里面需要用户自己接收处理异常,但返回的应该是逻辑视图名,而不是throw 抛出异常。
二.一.一 方法处理
public String methodException() throws MyException{
int a=10;
try{
int c=a/0;
}catch(NullPointerException e){
return "npe";
}catch(ArithmeticException e){
return "zero";
}catch(Exception e){
//也可以抛出自定义的异常信息
return "exception";
}
return SUCCESS;
}
在方法里面,捕捉到相应的异常信息,返回到不同的异常信息界面, 代替以前的 throw 异常
二.一.二 配置 struts.xml 文件
/WEB-INF/exception/npe.jsp
/WEB-INF/exception/zero.jsp
/WEB-INF/exception/exception.jsp
与以前的 Action 的配置相同, 这儿配置的是局部的result, 也可以配置全局的result. 全局的result, 整个package 通用,局部的result, 只能被当前 action 使用。
当代码执行错误之后,就会返回到相应的错误界面。
需要自己手动配置视图界面,配置麻烦。
三. Struts2 拦截器配置异常处理
三.一 未配置异常处理
三.一.一 创建 ExceptionAction
package com.yjl.web.action;
import com.opensymphony.xwork2.ActionSupport;
import com.yjl.exception.MyException;
public class ExceptionAction extends ActionSupport{
private static final long serialVersionUID = 1L;
private String comment;
public String toException(){
return "toMyException";
}
public String execException(){
try{
if("两个蝴蝶飞".equals(comment)){
throw new MyException("不能输入这个名字");
}
int c=(Integer.parseInt(comment))/0;
}catch(NumberFormatException e){
//数字转换异常
throw new NumberFormatException();
}catch(NullPointerException e){
//空指针异常
throw new NullPointerException();
}catch(ArithmeticException e){
//算术异常
throw new ArithmeticException();
}catch(Exception e){
//最终父异常
try {
throw new Exception();
} catch (Exception e1) {
e1.printStackTrace();
}
}
return "exceptionshow";
}
public String getComment() {
return comment;
}
public void setComment(String comment) {
this.comment = comment;
}
}
其中,自定义异常类 MyExcetpion 的定义如下:
package com.yjl.exception;
public class MyException extends Exception{
//不要实现setter和getter方法
private String message;
private static final long serialVersionUID = 1301994581545786245L;
public MyException() {
super();
}
public MyException(String message){
super(message);
}
}
三.一.二 配置 struts.xml 文件
/WEB-INF/content/myexception.jsp
/WEB-INF/content/exceptionshow.jsp
/WEB-INF/content/{1}.jsp
三.一.三 编写前端界面
三.一.三.一 编写 /content/myexception.jsp
三.一.三.二 编写 /content/exceptionshow.jsp
展示错误
三.一.四 重启服务器,进行测试
输入网址: http://localhost:8080/Struts_Exception/Exception_toException
跳转到输入的界面
当输入两个蝴蝶飞时:
控制台打印报错(前端没有显示错误):
当输入非数字时,如 abc:
当输入正常的数字,如 207时:
这样的显示效果,对用户来说,是非常不友好的。
三.二 配置异常处理
三.二.一 需要用 ExceptionMappingInterceptor
配置异常捕捉捕捉,需要用 ExceptionMappingInterceptor
已经配置在基本的拦截器栈里面了
不需要单独配置拦截器了
三.二.二 配置节点
配置时,需要用到
里面有两个属性,一个是 exception, 指明异常类型,是全限定名称,一个是 result, 返回视图。 其中这个result 返回视图,可以是全局result,也可以是局部result.
可以配置全局的异常处理,作为
也可以配置局部的异常处理,放在 action 元素下。
三.二.三 创建Action
修改方法 execException, 通过 throws 向外抛出
public String execException() throws Exception{
if("两个蝴蝶飞".equals(comment)){
throw new MyException("不能输入这个名字");
}
try{
int c=(Integer.parseInt(comment))/0;
}catch(NumberFormatException e){
//数字转换异常
throw new NumberFormatException();
}catch(NullPointerException e){
//空指针异常
throw new NullPointerException();
}catch(ArithmeticException e){
//算术异常
throw new ArithmeticException();
}catch(Exception e){
throw new Exception();
}
return "exceptionshow";
}
三.二.四 配置 struts.xml 文件
/WEB-INF/exception/number.jsp
/WEB-INF/exception/arithmetic.jsp
/WEB-INF/exception/npe.jsp
/WEB-INF/exception/exception.jsp
/WEB-INF/content/myexception.jsp
/WEB-INF/content/exceptionshow.jsp
/WEB-INF/exception/number2.jsp
/WEB-INF/exception/myexception.jsp
三.二.五 编写 jsp 页面
三.二.五.一 编写 /content/number.jsp
全局number
三.二.五.二 编写 /content/arithmetic.jsp
算术异常
三.二.五.三 编写 /content/npe.jsp
空指向异常界面
三.二.五.四 编写 /content/exception.jsp
其他非常见性异常界面
三.二.五.五 编写 /content/number2.jsp
局部number2
三.二.五.六 编写 /content/myexception.jsp
自定义异常
三.二.六 重启服务器,测试运行
输入路径: http://localhost:8080/Struts_Exception/Exception_toException
当输入两个蝴蝶飞时, 会显示自定义异常
当输入非数字,如字母 abc时, 全局和局部都 配置了,以局部为准
当输入正常数字,如 207 时
异常信息处理正确,跳转正确
三.二.七 显示错误信息
如将自定义异常信息给改变了: 重新编写 /content/myexception.jsp 页面
重启服务器,重新输入 两个蝴蝶飞, 就会显示错误信息了
本章节代码链接为:
链接:https://pan.baidu.com/s/1uWATk85QCp7dT5kieG-ksQ
提取码:3hmb
谢谢您的观看!!!