`

JSF中Exception的处理

    博客分类:
  • JSF
阅读更多

JSFException的处理<o:p></o:p>

环境: myfaces1.1.5,richfaces1.3,Websphere6.1

目标

统一处理应用中的Exception,解析其中的错误信息,使用Globalization 来显示消息。

分析

JSF中有两类error,一类是input error,是由用户输入错误的信息造成的,一般在input 验证或者转化过程中会出现;另一类是application error,是系统中可能出现的各种错误,如SQLExceptionNullPointerException等。对于application error,在系统中会统一抛出AppException,然后由我们自己订制的ActionListener处理;而对于input error,则由JSF处理。下面详细讨论如何处理application Error.

思路:将Exception转化为Faces Message处理。

在系统中我们采用两种策略共同处理Exception。即当JSF请求处理中出现Exception时,采取第一种策略,在这个页面上显示一条消息提示用户;当非JSF请求出现Exception时,将这个Exception抛给Web Container,并将页面导航到某一个错误页面。。

<o:p> </o:p>

实现<o:p></o:p>

下面分别讨论这两种策略如何实现。<o:p></o:p>

第一种,JSF请求,弹出提示消息。<o:p></o:p>

在我们的系统中,综合使用Exception FacesMessage来综合处理Exception,当Exception抛出时,尤其是Business Exception发生时,这个Exception是发生在JSFInvokeAppication Phase,因此通过订制ActionListener就捕获这个Exception,并将这个Exception转化为FacesMessage,并根据ExceptionMessage到资源文件中加载对应的国际化。

ActionListen无法捕获这个Exception时,将这个错误发送到WebContainer,并转向error页面。这时,对于这个请求的响应会产生500Error Code并发送到客户端。

因此,首先要定制JSFActionListener,在其上添加以下方法:<o:p></o:p>

try {<o:p></o:p>

outcome = (String) methodBinding.invoke(facesContext, null);<o:p></o:p>

} catch (Exception e) {<o:p></o:p>

Throwable cause = e.getCause();<o:p></o:p>

if (cause != null && cause instanceof AbortProcessingException) {<o:p></o:p>

throw (AbortProcessingException) cause;<o:p></o:p>

} else {<o:p></o:p>

Exception ex = (Exception) e.getCause();<o:p></o:p>

String message = ex.getMessage();<o:p></o:p>

//get localized Message string from resource bundle <o:p></o:p>

String localizedMessage = getBundleMessage(message);<o:p></o:p>

if (null != localizedMessage && "".equals(localizedMessage)) {<o:p></o:p>

throwNewFacesMessage(actionEvent.getComponent()<o:p></o:p>

.getClientId(facesContext), localizedMessage,<o:p></o:p>

FacesMessage.SEVERITY_ERROR);<o:p></o:p>

} else {<o:p></o:p>

throwNewFacesMessage(actionEvent.getComponent()<o:p></o:p>

.getClientId(facesContext), message,<o:p></o:p>

FacesMessage.SEVERITY_ERROR);<o:p></o:p>

}<o:p></o:p>

}// org.apache.myfaces.application.ActionListenerImpl

在上面的方法中拦截所有的Exception,并转化为FacesMessage,这样JSF会直接转向Render Phase,从而停止Application method的进一步处理,实现Exceptionhandler<o:p></o:p>

其次,在页面上添加<h:messages></h:messages>标识,就可以显示所有的错误消息。<o:p></o:p>

再者,覆盖A4J.AJAX.onError由于我们在系统中还采用了RichfacesRichfaces在判断Ajax请求在服务器的处理出现错误后,会有一个默认的处理函数A4J.AJAX.onError这样当服务器端发送500Error Code时,就可以被客户端的Ajax感知,并添加处理:<o:p></o:p>

A4J.AJAX.onError = function(req,status,message) {

var report = "An error has occurred during the request,Message is: " + message;

if(Ext.MessageBox.show){

Ext.MessageBox.show({

title: 'Error Report',

msg: report,

width:400,

buttons: Ext.MessageBox.OK

});

}else{

alert(report);

}

<o:p> </o:p>

};<o:p></o:p>

第二种,非Ajax请求,跳转到错误页面。可以通过配置web.xml来实现:<o:p></o:p>

<error-page>

<exception-type>javax.faces.FacesException<!---->exception-type>

<location>/error.jsp<!---->location>

<!---->error-page>

<error-page>

<error-code>500<!---->error-code>

<location>/error.jsp<!---->location>

<!---->error-page><o:p></o:p>

这样,当产生错误时,就会转向这个页面。<o:p></o:p>

分享到:
评论
2 楼 okhaoba 2011-09-27  
楼主正解。
1 楼 lokinell2006 2007-12-27  
good idea

相关推荐

    JSF+hibernate实现批量删除

    在IT行业中,JavaScript Server Faces(JSF)是一种用于构建企业级Web应用程序的Java框架,而Hibernate则是一个流行的Java对象关系映射(ORM)工具,它简化了数据库操作。本篇文章将详细探讨如何利用JSF与Hibernate...

    jsf2.0上传组件(servlet3.0)

    Managed Bean是JSF应用程序中的业务逻辑容器,它负责处理用户输入和执行相关的操作。 ```xml ``` 这段代码创建了一个文件上传表单,其中`#{fileUploadBean.file}`引用了Managed Bean中的属性,用于存储上传的...

    jsf实现基于ajax的上传例子

    3. **编写Filter类**:实现 `Filter` 接口,并在 `doFilter` 方法中处理文件上传。 ```java import javax.servlet.*; import javax.servlet.http.*; import org.apache.commons.fileupload.FileItem; import ...

    JavaEE5实战笔记04JSF的一些补充

    在上面的例子中,`adminAction`是一个托管Bean,它包含`logout`和`listException`等方法。这些方法的执行结果(通过`from-outcome`)可以决定页面的流向。如果在方法执行过程中发生错误,可以捕获异常并显示给用户,...

    jsf+hibernate+spring集成案例

    - **com.model.exception:** 存放异常处理类。 - **com.data.dao:** 存放DAO接口。 - **com.data.dao.impl:** 存放DAO实现。 5. **异常处理类:** - 创建异常处理类`UserException.java`: ```java public ...

    关于jsp中的JSP详解

    4. **JSP内置对象**:JSP提供了九个内置对象,如`request`, `response`, `session`, `pageContext`, `out`, `exception`等,它们提供了对HTTP请求、响应、会话和异常处理的直接访问。 5. **EL(Expression Language...

    JSP中文入门基础教程(包括常用标签)

    8. **exception**: 用于捕获和处理异常。 9. **page**: 代表当前的JSP页面,类型为Servlet实例。 ### JSP标准动作标签 JSP 2.0引入了JSP标准动作(JSP Standard Tag Library,JSTL),以减少脚本的使用。常见的...

    j2ee joone 技术论文

    因此,文档提出了一种解决方案——在JSF框架中实现数据表控件的分页功能,以此减少服务器端资源消耗和网络传输数据量,提高客户端响应速度。 #### 三、JSF框架简介 ##### 1. JSF框架特点 - **组件为中心的UI构建*...

    100家大公司java笔试题汇总.docx

    2. Java中的异常可以分为两种:checked exception和unchecked exception,checked exception需要在方法声明中throws,unchecked exception不需要。 3. Java中的finally块总是会被执行,哪怕try块中抛出异常也一样。 ...

    JSP系统JSP三大架构中STRUTS的使用

    而在JSP的三大主流架构——Struts、Spring MVC和JSF中,Struts是最早被广泛采用的MVC(Model-View-Controller)框架。本篇文章将详细阐述Struts在JSP系统中的应用及其重要性。 首先,理解Struts框架的核心概念是...

    Java EE5 教程

    2. **通用异常处理(Exception Handling)**: 引入了声明式异常处理,允许在方法级别声明可抛出的异常,简化了异常处理代码。 3. **简化EJB(Enterprise JavaBeans)**: EJB 3.0是Java EE5的一部分,极大地简化了...

    java获取IP地址

    - 对于JSF(JavaServer Faces)应用,由于页面逻辑与后台Bean分离,需要在Bean中处理。例如,在JSF Bean中,你可以通过`FacesContext`获取当前请求的实例,然后将其转换为`HttpServletRequest`,再调用`...

    struts下上传图片到数据库并显示到页面实例

    在Struts的配置文件(struts-config.xml)中,我们需要定义对应的Action和ActionForward,以处理上传和显示图片的请求。 最后,前端页面(HTML/JSF/JSP等)需要包含用于上传图片的表单,以及显示图片的标签。例如,...

    JSP基础

    JSF是另一种Java Web开发框架,它也支持组件化开发,但提供了更丰富的UI组件和更强大的事件处理机制。相比JSP,JSF更加面向组件,但学习曲线相对较陡峭。 10. **JSP的最佳实践**: - 避免在JSP页面中编写过多的...

    必联采购网java程序员笔试题.doc

    // 处理ExceptionType1 } catch (ExceptionType2 e2) { // 处理ExceptionType2 } finally { // 无论是否发生异常都会执行的代码 } ``` 3. **JSP动作**:主要有jsp:include、jsp:forward、jsp:param、jsp:...

    JSP程序设计从入门到精通 word版

    在JSP中,可以利用JDBC进行数据库连接、执行SQL语句、处理结果集等操作。通过JSP的SQL标签库或者JavaBean,可以方便地实现数据库操作,并将结果展示在网页上。 第5章 JSP与JavaBean JavaBean是Java的一种组件模型,...

    Java面试题答案分析.pdf

    Struts是早期流行的Java Web框架之一,虽然现在有更多的框架可以选择,比如Spring MVC和JSF,但Struts依然是面试中考察候选人基础知识的一个重要点。 接着,文档中出现了Web服务相关的知识点。Web服务是一类基于...

    Java EE 5 Power and productivity with less complexity.doc

    其中两个重要的简化机制是注解(Annotations)和统一异常处理(Unified Exception Handling)。 **注解**是Java EE 5中的一个关键增强,它减少了XML配置文件的使用,使代码更加自我描述。通过注解,开发者可以直接...

    高级软件工程师第四套试题.doc

    Struts、JSF和Spring MVC都是MVC框架的例子,而Hibernate是一个ORM(对象关系映射)框架,主要用于处理数据库操作,不直接实现MVC,答案是B)Hibernate。 5. Struts集成:Struts与Spring结合时,通常通过配置`...

Global site tag (gtag.js) - Google Analytics