一.在servlet容器中处理异常

以下两种方式:

1. 在web.xml定义异常处理 

如果没有在web的应用中作异常处理,那么异常就会抛给Servlet容器,应该说此时Servlet容器是处理异常的时机了。如果此时Servlet容器还不对异常处理的话,那么容器会把异常的内容直接显示给访问者。  Servlet容器通过web.xml配置对异常的处理。在web.xml中进行异常处理的配置是通过<error-page>元素来表示,支持两种类型的异常拦截。

1)依据http请求所返回的状态码来拦截

2)通过java异常类的类型来进行拦截

如下两种类型的实例

<error-page>

<error-code>404</error-code>

<location>/errors/pageNoFound.jsp</location>

</error-page>

<error-page>

<exception-type>java.lang.NullPointerException</exception-type>

<location>/errors/pageNoFound.jsp</location>

</error-page>

错误页面中错误信息的显示

从jsp2.0开始,除了在错误页面中可以使用绑定到request的exception对象外,还增加了一个名为errorData的绑定到pageContext的对象。它是javax.servlet.jsp.ErrorData类的对象。

errorData的属性

-------------------------------------------------------

属性                   类型          描述

requestURI             String        发出请求失败的URI

servletName            String        发生错误的servlet或jsp页面的名称

statusCode             int           发生错误的状态码

throwable              Throwable     导致当前错误的异常

--------------------------------------------------------

在错误页面中,可用如下实例显示错误信息

<%@ page isErrorPage="true" contentType="text/html"; charset="utf-8" %>

<html>

<head> ...</head>

<body>

请求地址:${pageContext.errorData.requestURI} <br>

状态码:  ${pageContext.errorData.statusCode} <br>

异常: ${pageContext.errorData.throwable}  <br>

</body>

</html>

注:某些版本的浏览器需要关闭“显示友好http错误信息”功能才能正常显示错误信息。“工具”->"internet选项"->高级

2.自定义异常页面(在jsp页面中定义)

通过jsp页面中@page 的errorPage属性来进行,如下:

<% page errorPage="errors/error.jsp" %>

这种处理方式将会覆盖在web.xml中的定义  自定义异常将会拦截所有的异常,也就是说不能依据不同的异常的类型来进行不同的处理(区别于servlet容器异常处理)

二.Struts的异常处理机制

以下三种方式

1.编程式处理异常手动处理

a)在发生异常的地方创建异常信息,并抛出异常

b)捕获异常,传递异常信息到相应的异常处理页面

c)在Struts的配置文件struts-config.xml中,相应的action中配置<forward>指定异常处理页面

d)异常处理jsp页面中显示信息

e)国际化资源文件ApplicationResources_zh_CN.properties中加入key-value

具体实例如下:

a)抛出异常

public void delOrg(int orgId) {

Orgnization org=(Orgnization)getHibernateTemplate().load(Orgnization.class, orgId);

if(org.getChildren().size()>0)

{

//抛出异常信息

throw new RuntimeException("存在子机构,不允许删除");

}

getHibernateTemplate().delete(org);

}

b)捕获异常,传递异常信息(此函数调用上一步定义的函数delOrg)

public ActionForward del(ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response)

throws Exception {

OrgActionForm oaf = (OrgActionForm)form;

try {

orgManager.delOrg(oaf.getId());

} catch (Exception e) {

//创建国际化文本信息

ActionMessages msgs=new ActionMessages();

ActionMessage msg=new ActionMessage("errors.detail",e.getMessage());

msgs.add("detail", msg);

//传递国际化文本信息

this.saveErrors(request, msgs);

return mapping.findForward("exception");

}

return mapping.findForward("pub_add_success");

}

c)在Struts的配置文件struts-config.xml中,相应的action中配置<forward>指定异常处理页面

<action-mappings >

<action

path="/org"

type="org.springframework.web.struts.DelegatingActionProxy"

name="orgForm"

scope="request"

parameter="method"

>

<forward name="index" path="/org/index.jsp" />

<forward name="exception" path="/org/exception.jsp" />

</action>

</action-mappings>

d)/org/exception.jsp中显示异常信息

可以用<html:errors>显示异常信息。

e)国际化资源文件ApplicationResources_zh_CN.properties中加入

errors.detail={0}

注:{0}表示接收的第一个参数。

2.自动异常处理方式(只能处理带一个参数的情况)

a)在发生异常的地方创建异常信息,并抛出异常

b)在Struts的配置文件struts-config.xml中,相应的action中配置<exception>

c)异常处理jsp页面中显示信息

d)国际化资源文件ApplicationResources_zh_CN.properties中加入key-value

此方式比上一种方式(编程式)少了"捕获异常"的步骤,在strtus-config.xml中的配置也有所不同。

在struts-config.xml的配置如下:

<action-mappings >

<action

path="/org"

type="org.springframework.web.struts.DelegatingActionProxy"

name="orgForm"

scope="request"

parameter="method"

>

<exception key="errors.detail" type="java.lang.RuntimeException"        path="/org/exception.jsp" />

<forward name="index" path="/org/index.jsp" />

</action>

</action-mappings >

3.统一的自定义异常处理

多个action使用同一个exception,将exception配置在全局exception中。mapping.findException方法会先到action中找局部exception,若没有就会找全局exception相对应前面2中方式,这种方式将所有的异常统一处理

a)自定义的异常类com.hq.exception.SystemException

b)自定义的异常处理类com.hq.exception.SystemExceptionHandler

c)struts-config.xml配置全局的exception

d)在国际资源文件ApplicationResources_zh_CN.properties中加入key-value

e)在发生异常的地方创建异常信息,并抛出异常

f)异常处理jsp页面中显示信息

a)自定义异常类com.hq.exception.SystemException

package com.hq.exception;

public class SystemException extends RuntimeException {

private String key;

private Object[]values;

public String getKey() {

return key;

}

public Object[] getValues() {

return values;

}

public SystemException() {

super();

}

public SystemException(String message, Throwable throwable) {

super(message, throwable);

}

public SystemException(String message) {

super(message);

}

public SystemException(Throwable throwable) {

super(throwable);

}

public SystemException(String key,String message)

{

super(message);

this.key=key;

}

public SystemException(String key,Object value,String message)

{

super(message);

this.key=key;

this.values=new Object[]{value};

}

public SystemException(String key,Object[] values,String message)

{

super(message);

this.key=key;

this.values=values;

}

}

b)自定义异常处理类com.hq.exception.SystemExceptionHandler

package com.hq.exception;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.ActionForm;

import org.apache.struts.action.ActionForward;

import org.apache.struts.action.ActionMapping;

import org.apache.struts.action.ActionMessage;

import org.apache.struts.action.ExceptionHandler;

import org.apache.struts.config.ExceptionConfig;

public class SystemExceptionHandler extends ExceptionHandler {

@Override

public ActionForward execute(Exception ex, ExceptionConfig ae,

ActionMapping mapping, ActionForm formInstance,

HttpServletRequest request, HttpServletResponse response)

throws ServletException {

ActionForward forward=null;

ActionMessage error=null;

if(ae.getPath()!=null)

{

forward=new ActionForward(ae.getPath());

}else

{

forward=mapping.getInputForward();

}

if(ex instanceof SystemException)

{

SystemException se=(SystemException)ex;

String key=se.getKey();

if(key==null)

{

error=new ActionMessage(ae.getKey(),se.getMessage());

}

else

{

if(se.getValues()!=null)

{

error=new ActionMessage(key,se.getValues());

}

else

{

error=new ActionMessage(key);

}

}

this.storeException(request, key, error, forward, ae.getScope());

return forward;

}

else

{

return super.execute(ex, ae, mapping, formInstance, request, response);

}

}

}

c)struts-config.xml配置全局的exception

<global-exceptions>

<exception

key="errors.detail"

type="com.hq.exception.SystemException"

path="/common/exception.jsp"

handler="com.hq.exception.SystemExceptionHandler">

</exception>

</global-exceptions>

上面的key指定properties资源文件中的key值,type指定异常类,handler指定异常的处理类(若没给出就会采用默认的ExceptionHandler)

d)在国际资源文件ApplicationResources_zh_CN.properties中加入key-value

errors.org.hasSubOrg=【{0}】存在{1}个子机构,不允许被删除!

e)在发生异常的地方创建异常信息,并抛出异常

public void delOrg(int orgId) {

System.out.println("delorg");

Orgnization org=(Orgnization)getHibernateTemplate().load(Orgnization.class, orgId);

if(org.getChildren().size()>0)

{

//统一异常处理

Throw new SystemException("errors.org.hassuborg",new Object[]{org.getName(),org.getChildren().size()},"存在子机构,不允许被删除");

}

getHibernateTemplate().delete(org);

}

f)异常处理jsp页面中显示信息

/common/exception.jsp

<html:errors/>

Java web的几种异常处理 (转)的更多相关文章

  1. 2017.10.28 针对Java Web应用中错误异常处理方法的运用

    针对Java Web应用中错误异常处理方法的运用 在javaweb中其异常都需要对Checked Exception之下的Exception进行继承,并且有选择地对发生的错误和异常进行处理.Java同 ...

  2. Java Web的两种开发模式

    参考文献:http://www.cnblogs.com/xdp-gacl/p/3908610.html 一.Jsp+JavaBean 此模式如下图所示:

  3. java web 的 几种跨域方式

  4. Java开发web的几种开发模式

    Java Web开发方案有多种可供选择,这里列举一些经典的开发模式进行横向比较,为Java Web的开发模式选择提供参考.除此之外还有好多方案(如Tapestry和Wicket等等)并不了解,这里就不 ...

  5. 常用几种Java Web容器

    Web服务器是运行及发布Web应用的容器,只有将开发的Web项目放置到该容器中,才能使网络中的所有用户通过浏览器进行访问.开发Java Web应用所采用的服务器主要是与JSP/Servlet兼容的We ...

  6. java web几种开发模式(转)

    Java Web开发方案有多种可供选择,这里列举一些经典的开发模式进行横向比较,为Java Web的开发模式选择提供参考.除此之外还有好多方案(如Tapestry和Wicket)并不了解,这里就不列举 ...

  7. 在Java Web程序中使用监听器可以通过以下两种方法

    之前学习了很多涉及servlet的内容,本小结我们说一下监听器,说起监听器,编过桌面程序和手机App的都不陌生,常见的套路都是拖一个控件,然后给它绑定一个监听器,即可以对该对象的事件进行监听以便发生响 ...

  8. ref:一种新的攻击方法——Java Web表达式注入

    ref:https://blog.csdn.net/kk_gods/article/details/51840683 一种新的攻击方法——Java Web表达式注入 2016年07月06日 17:01 ...

  9. 在Tomcat中部署Java Web应用程序几种方式

    在Tomcat中部署Java Web应用程序有两种方式:静态部署和动态部署.在下文中$CATALINA_HOME指的是Tomcat根目录. 一.静态部署      静态部署指的是我们在服务器启动之前部 ...

随机推荐

  1. MASMPlus编译出错:error LNK2001: unresolved external symbol _WinMainCRTStartup

    初学汇编,感觉很多不懂.不过那也是,如果懂了的话就不用学了,从无到有学习一门编程语言果然不是那么容易的一件事. 学习汇编总得要有一款汇编软件才行,没理由只是使用Windows自带的DEBUG.于是上了 ...

  2. &与&& C语言

    &是一个位运算符,就是将两个二进制的数逐位相与,就是都是1才是1,只要有一个为0则为0,结果是相与之后的结果.&&是一个逻辑运算符,就是判断两个表达式的真假性,只有两个表达式同 ...

  3. mysql数据库封装和 分页查询

    1 之前我们学到了php连接mysql数据库的增删改查,中间要多次调用数据库, 而且以后用到的表比较多,上传中如果需要改数据的话会非常麻烦,但是如果 我们把数据库封装,到时就可以很轻松的把改掉一些数据 ...

  4. 第十九篇 js高级知识---词法分析和AO 链

    上面一篇文章说了js的作用域链,这一节算是对上面的延申,有一个典型的例子,首先看原来的一段代码: var name = "test"; function t() { var b = ...

  5. 完全理解Python迭代对象、迭代器、生成器

    在了解Python的数据结构时,容器(container).可迭代对象(iterable).迭代器(iterator).生成器(generator).列表/集合/字典推导式(list,set,dict ...

  6. 前端总结·基础篇·JS(一)五大数据类型之字符串(String)

    前端总结系列 前端总结·基础篇·CSS(一)布局 前端总结·基础篇·CSS(二)视觉 前端总结·基础篇·CSS(二)补充 前端总结·基础篇·JS(一)五大数据类型之字符串(String) 目录 这是& ...

  7. 简单却又复杂的FizzBuzz面试编程问题

    写这篇文章主要是因为偶然看到一篇关于stackoverflow公司的面经中提到了一个有趣的面试编程问题,如题所述:FizzBuzz问题.原文引用如下: “在一些公平的考验之后,我发现那些因为代码而抓狂 ...

  8. 【Harmony】概述

      原文来自本人的微信公众号文章  系统工程实验室     引言 基于模型的系统工程(简称MBSE,英文全称Model based System Engineering )的实践至少需要三个维度的支撑 ...

  9. 利用instsrv和srvany来手动安装服务

    Windows提供了两个小工具instsrv.exe和srvany.exe来把任何应用包装成windows服务.顾名思义instsrv(install service)是用来安装服务的,而srvany ...

  10. Java基础——变量、数据类型

    一 .变量 1.计算机的内存类似于人的大脑,计算机使用内存来记忆大量运算时要使用数据.内存是一个物理设备,如何来存储一个数据呢?很简单,把内存想象成一间旅馆,要存储的数据就好比要住宿的客人. 首先,旅 ...