Struts2配置异常错误处理(十六)上

简介: Struts2配置异常错误处理(十六)

在开发中,我们常常会遇到很多很多的错误,一般比较常见的是404,500等错误,当项目运行报错之后,浏览器会自做聪明地创建错误的界面,展示错误信息,响应到前台。


然而,这些错误的页面,对于开发者来说,是比较友好的,但对于普通用户来说,却是非常不好的。 所以,必须要避免浏览器创建的错误界面。


一. Tomcat 配置错误界面


在Servlet+JSP 开发时,我们常常通过配置 tomcat 的 web.xml 配置文件进行处理,通过配置不同的错误类型,转到不同的错误页面。


在web.xml 文件中:


<!-- 404 页面不存在错误 -->  
<error-page>  
    <error-code>404</error-code>  
    <location>/WEB-INF/exception/404.jsp</location>  
</error-page>  
<!-- 500 服务器内部错误 -->  
<error-page>  
    <error-code>500</error-code>  
    <location>/WEB-INF/exception/500.jsp</location>  
</error-page>   
<!-- java.lang.NullPointerException异常错误,依据这个标记可定义多个类似常见的错误提示-->  
<error-page>  
    <exception-type>java.lang.NullPointerException</exception-type>  
    <location>/WEB-INF/exception/npe.jsp</location>  
</error-page>
<!-- java.lang.NoSuchMethodException异常错误,没有此方法异常,说明路径不正确  -->  
<error-page>  
    <exception-type>java.lang.NoSuchMethodException</exception-type>  
    <location>/WEB-INF/exception/404.jsp</location>  
</error-page>
<!-- java.lang.Exception异常错误,依据这个标记可定义非常见类似错误提示 -->  
<error-page>  
    <exception-type>java.lang.Exception</exception-type>  
    <location>/WEB-INF/exception/exception.jsp</location>  
</error-page> 


需要在 本项目路径下的 WEB-INF/exception 下创建不同的错误界面就可以了


20200420102717755.png


当运行错误之后, Tomcat 会自动检测错误的类型, 然后会 <error-page> </error-page> 节点定义的部分去判断, 根据异常的类型,去展示不同的错误界面。


需要处理一下,常见的几种错误类型, 如 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 文件


<action name="Exception_*" class="com.yjl.web.action.ExceptionAction" method="{1}">
      <result name="npe">/WEB-INF/exception/npe.jsp</result>
      <result name="zero">/WEB-INF/exception/zero.jsp</result>
      <result name="exception">/WEB-INF/exception/exception.jsp</result>
</action>


与以前的 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 文件


<package name="exception" extends="struts-default" namespace="/">
    <action name="Exception_*" class="com.yjl.web.action.ExceptionAction" method="{1}">
      <result name="toMyException">/WEB-INF/content/myexception.jsp</result>
      <result name="exceptionshow">/WEB-INF/content/exceptionshow.jsp</result>
    </action>
    <!-- 配置跳转页面 -->
    <action name="*">
      <result>/WEB-INF/content/{1}.jsp</result>
    </action>
  </package>


三.一.三 编写前端界面


三.一.三.一 编写 /content/myexception.jsp


<body>
  <s:form action="Exception_execException" method="post" namespace="/"> 
    <s:textarea name="comment" label="请输入你的回复"></s:textarea>
    <s:submit value="提交"/>
  </s:form>
</body>


三.一.三.二 编写 /content/exceptionshow.jsp


<body>
展示错误
</body>


三.一.四 重启服务器,进行测试


输入网址: http://localhost:8080/Struts_Exception/Exception_toException

跳转到输入的界面


当输入两个蝴蝶飞时:


20200420102730249.png


控制台打印报错(前端没有显示错误):


20200420102736288.png


当输入非数字时,如 abc:


20200420102741734.png


20200420102746974.png


当输入正常的数字,如 207时:


20200420102753542.png


2020042010275872.png


这样的显示效果,对用户来说,是非常不友好的。

相关文章
|
1月前
|
JSON 前端开发 Java
【十八】springboot实现自定义全局异常处理
【十八】springboot实现自定义全局异常处理
35 1
【十八】springboot实现自定义全局异常处理
|
SQL JSON Java
Mybaties(十五) 分页插件使用, 参数校验以及全局异常处理
这里是Mybaties中高级应用了, 基于Mybaties+Springboot实现分页, 参数校验以及全局异常(干货满满!!!)
Struts2配置异常错误处理(十六)下
Struts2配置异常错误处理(十六)
195 0
Struts2配置异常错误处理(十六)下
|
前端开发 API
Struts2实现类型转换器(十五)上
Struts2实现类型转换器(十五)
198 0
Struts2实现类型转换器(十五)上
|
前端开发 Java
Struts2实现类型转换器(十五)下
Struts2实现类型转换器(十五)
Struts2实现类型转换器(十五)下
|
前端开发 Java 数据库连接
SpringMVC的数据验证和JSR 303国际化显示(十一)下
SpringMVC的数据验证和JSR 303国际化显示(十一)下
279 0
SpringMVC的数据验证和JSR 303国际化显示(十一)下
|
前端开发 Java 数据库连接
SpringMVC的数据验证和JSR 303国际化显示(十一)中
SpringMVC的数据验证和JSR 303国际化显示(十一)中
177 0
SpringMVC的数据验证和JSR 303国际化显示(十一)中
|
JSON 前端开发 Java
springboot 全局异常拦截器,友好异常提示
springboot 全局异常拦截器,友好异常提示
387 0
springboot 全局异常拦截器,友好异常提示
|
Java 数据格式 XML
Struts常见异常信息和解决方法
以下所说的struts-config.xml和ApplicationResources.properties等文件名是缺省时使用的,如果你使用了多模块,或指定了不同的资源文件名称,这些名字要做相应的修改。
1068 0