Java web的几种异常处理 (转)
一.在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的几种异常处理 (转)的更多相关文章
- 2017.10.28 针对Java Web应用中错误异常处理方法的运用
针对Java Web应用中错误异常处理方法的运用 在javaweb中其异常都需要对Checked Exception之下的Exception进行继承,并且有选择地对发生的错误和异常进行处理.Java同 ...
- Java Web的两种开发模式
参考文献:http://www.cnblogs.com/xdp-gacl/p/3908610.html 一.Jsp+JavaBean 此模式如下图所示:
- java web 的 几种跨域方式
- Java开发web的几种开发模式
Java Web开发方案有多种可供选择,这里列举一些经典的开发模式进行横向比较,为Java Web的开发模式选择提供参考.除此之外还有好多方案(如Tapestry和Wicket等等)并不了解,这里就不 ...
- 常用几种Java Web容器
Web服务器是运行及发布Web应用的容器,只有将开发的Web项目放置到该容器中,才能使网络中的所有用户通过浏览器进行访问.开发Java Web应用所采用的服务器主要是与JSP/Servlet兼容的We ...
- java web几种开发模式(转)
Java Web开发方案有多种可供选择,这里列举一些经典的开发模式进行横向比较,为Java Web的开发模式选择提供参考.除此之外还有好多方案(如Tapestry和Wicket)并不了解,这里就不列举 ...
- 在Java Web程序中使用监听器可以通过以下两种方法
之前学习了很多涉及servlet的内容,本小结我们说一下监听器,说起监听器,编过桌面程序和手机App的都不陌生,常见的套路都是拖一个控件,然后给它绑定一个监听器,即可以对该对象的事件进行监听以便发生响 ...
- ref:一种新的攻击方法——Java Web表达式注入
ref:https://blog.csdn.net/kk_gods/article/details/51840683 一种新的攻击方法——Java Web表达式注入 2016年07月06日 17:01 ...
- 在Tomcat中部署Java Web应用程序几种方式
在Tomcat中部署Java Web应用程序有两种方式:静态部署和动态部署.在下文中$CATALINA_HOME指的是Tomcat根目录. 一.静态部署 静态部署指的是我们在服务器启动之前部 ...
随机推荐
- java 继承的学习(转)
转自:http://www.cnblogs.com/happyframework/p/3332243.html,非常感谢啊 public class test { /** * @param args ...
- AJSX 传输数组
如果要利用ajax传输数组,或者传输多个(不知道有多少个)class的某一属性的值,例如: 要将这三个数据传入php编辑界面,图片显示有三个数据,但实际上,数据的多少是由数据库所导出的数据 决定的.如 ...
- css中书写小三角
我们在开发过程中,有很多的方向标签不是图片,而是用css方法书写上去的. 首先我们要了解原理,border的边框的脚步是45度角. 向左方向: width:0px: height:0px: borde ...
- 关于BOM的理解
BOM提供了很多对象,用于访问浏览器的功能,这些功能与网页内容无关 BOM的核心对象时window,她表示浏览器的一个实例 window的双重角色 1.JS访问浏览器窗口的一个接口 2.ECMA ...
- BZOJ 4085:[Sdoi2015]quality(round 2 音质检测)(数据结构)
居然在考场上把这道题打出来了觉得自己也是有点吊啊(虽然后面就没时间做其他题了囧而且还被卡常数了...) 题解自己写了一份TEX的就直接放上来吧.... 好啦,在谈点什么别的 什么?你在bz上TLE了? ...
- PAT---完美数列
由于数值比较大,选用long型的 先用快速排序方法对数组进行排序,然后进行查找. 用一个问题是所要查找的数可能不在数组中,因此不能用现成的二叉查找法.试着对二叉查找法进行改进,单没调通. 在查找过程中 ...
- Linux配置vnc
yum install tigervnc-server vim /etc/sysconfig/vncservers 查看配置文件,修改最后面两行配置文件参数如下: VNCSERVERS="1 ...
- mac上搭建appium环境过程以及遇到的问题
Mac环境安装appium 一.Java环境 下载java sdk http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downl ...
- Cesium原理篇:3D Tiles(2)数据结构
上一节介绍3D Tiles渲染调度的时候,我们提到目前Cesium支持的Cesium3DTileContent目前支持如下类型: Batched3DModel3DTileContent Instanc ...
- 20144306《网络对抗》MAL_逆向与Bof基础
实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程序同时包含另一个代码片段,getShe ...