如下兩種方式: html
若是沒有在web的應用中做異常處理,那麼異常就會拋給Servlet容器,應該說此時Servlet容器是處理異常的時機了。若是此時Servlet容器還不對異常處理的話,那麼容器會把異常的內容直接顯示給訪問者。 Servlet容器經過web.xml配置對異常的處理。在web.xml中進行異常處理的配置是經過<error-page>元素來表示,支持兩種類型的異常攔截。 web
1)依據http請求所返回的狀態碼來攔截 spring
2)經過java異常類的類型來進行攔截 apache
以下兩種類型的實例 編程
<error-page> 瀏覽器
<error-code>404</error-code> app
<location>/errors/pageNoFound.jsp</location> jsp
</error-page> ide
<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容器異常處理)
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}表示接收的第一個參數。
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 {
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/>