`

struts异常处理简单流程

阅读更多
当Web容器收到客户端的请求时,便会根据Web。xml文件中的相关配置信息找到相应的处理
servlet。一般情况下struts框架会截获所有的 。do 请求并有ActionServlet统一处理。
现在我想看看struts在处理请求的过程中发生异常时他是怎么处理的!首先,可以看看我大概花的
一个时序图:

1、2就不细说了struts拦截到客户端的do请求并由ActionServlet统一做处理!

3、ActionServlet中 doGet、doPost方法都在调用自身的process方法,process中对请求做简单处理
后又交由RequestProcessor对象中的Process方法处理。代码:
    /**
     * <p>Perform the standard request processing for this request, and create
     * the corresponding response.</p>
     *
     * @param request The servlet request we are processing
     * @param response The servlet response we are creating
     *
     * @exception IOException if an input/output error occurs
     * @exception ServletException if a servlet exception is thrown
     */
    protected void process(HttpServletRequest request, HttpServletResponse response)
        throws IOException, ServletException {

        ModuleUtils.getInstance().selectModule(request, getServletContext());
        ModuleConfig config = getModuleConfig(request);

        RequestProcessor processor = getProcessorForModule(config);
        if (processor == null) {
           processor = getRequestProcessor(config);
        }
        processor.process(request, response);

    }


4、RequestProcessor对象Process方法又会调用自身ProcessActionPerform方法。代码:
        // Call the Action instance itself
        ActionForward forward =
            processActionPerform(request, response,
                                 action, form, mapping);

        // Process the returned ActionForward instance
        processForwardConfig(request, response, forward);

processActionPerform方法便会调用struts-config.xml文件中配置的action的execute方法
    /**
     * <P>Ask the specified <code>Action</code> instance to handle this
     * request. Return the <code>ActionForward</code> instance (if any)
     * returned by the called <code>Action</code> for further processing.
     * </P>
     *
     * @param request The servlet request we are processing
     * @param response The servlet response we are creating
     * @param action The Action instance to be used
     * @param form The ActionForm instance to pass to this Action
     * @param mapping The ActionMapping instance to pass to this Action
     *
     * @exception IOException if an input/output error occurs
     * @exception ServletException if a servlet exception occurs
     */
    protected ActionForward
        processActionPerform(HttpServletRequest request,
                             HttpServletResponse response,
                             Action action,
                             ActionForm form,
                             ActionMapping mapping)
        throws IOException, ServletException {

        try {
            return (action.execute(mapping, form, request, response));
        } catch (Exception e) {
            return (processException(request, response,
                                     e, form, mapping));
        }

    }

关键点到了!!这里用了一个try{}catch(e)语句来尝试执行Action类中的execute方法,如果
发生异常便会被catch到交由processException()来处理!

5、processException函数好像有点长啊!先贴出来!
    /**
     * <p>Ask our exception handler to handle the exception. Return the
     * <code>ActionForward</code> instance (if any) returned by the
     * called <code>ExceptionHandler</code>.</p>
     *
     * @param request The servlet request we are processing
     * @param response The servlet response we are processing
     * @param exception The exception being handled
     * @param form The ActionForm we are processing
     * @param mapping The ActionMapping we are using
     *
     * @exception IOException if an input/output error occurs
     * @exception ServletException if a servlet exception occurs
     */
    protected ActionForward processException(HttpServletRequest request,
                                             HttpServletResponse response,
                                             Exception exception,
                                             ActionForm form,
                                             ActionMapping mapping)
        throws IOException, ServletException {

        // Is there a defined handler for this exception?
        ExceptionConfig config = mapping.findException(exception.getClass());
        if (config == null) {
            log.warn(getInternal().getMessage("unhandledException",
                                              exception.getClass()));
            if (exception instanceof IOException) {
                throw (IOException) exception;
            } else if (exception instanceof ServletException) {
                throw (ServletException) exception;
            } else {
                throw new ServletException(exception);
            }
        }

        // Use the configured exception handling
        try {
            ExceptionHandler handler = (ExceptionHandler)
            RequestUtils.applicationInstance(config.getHandler());
            return (handler.execute(exception, config, mapping, form,
                                    request, response));
        } catch (Exception e) {
            throw new ServletException(e);
        }

    }

这里他首先,判断异常是不是servlet抛出的IOException、ServletException如果是则直接抛出,否则
构造一个ExceptionHandler实例并将异常和相关参数交由该实例的execute()去处理!

6、ExceptionHandler.execute()方法其实很简单,大概功能就是将错误信息收集起来并保存起来!
    /**
     * <p>Handle the <code>Exception</code>.
     * Return the <code>ActionForward</code> instance (if any) returned by
     * the called <code>ExceptionHandler</code>.
     *
     * @param ex The exception to handle
     * @param ae The ExceptionConfig corresponding to the exception
     * @param mapping The ActionMapping we are processing
     * @param formInstance The ActionForm we are processing
     * @param request The servlet request we are processing
     * @param response The servlet response we are creating
     *
     * @exception ServletException if a servlet exception occurs
     *
     * @since Struts 1.1
     */
    public ActionForward execute(
        Exception ex,
        ExceptionConfig ae,
        ActionMapping mapping,
        ActionForm formInstance,
        HttpServletRequest request,
        HttpServletResponse response)
        throws ServletException {

        ActionForward forward = null;
        ActionMessage error = null;
        String property = null;

        // Build the forward from the exception mapping if it exists
        // or from the form input
        if (ae.getPath() != null) {
            forward = new ActionForward(ae.getPath());
        } else {
            forward = mapping.getInputForward();
        }

        // Figure out the error
        if (ex instanceof ModuleException) {
            error = ((ModuleException) ex).getActionMessage();
            property = ((ModuleException) ex).getProperty();
        } else {
            error = new ActionMessage(ae.getKey(), ex.getMessage());
            property = error.getKey();
        }

        this.logException(ex);

        // Store the exception
        request.setAttribute(Globals.EXCEPTION_KEY, ex);
        this.storeException(request, property, error, forward, ae.getScope());

        return forward;

    }


7、RequestProcessor对象实例接受到ExceptionHandler.execute()返回的forward后,又将forward的传给
processForwardConfg()方法处理

8、processForwardConfg()找到uri返回
    /**
     * <p>Forward or redirect to the specified destination, by the specified
     * mechanism.  This method uses a <code>ForwardConfig</code> object instead
     * an <code>ActionForward</code>.</p>
     *
     * @param request The servlet request we are processing
     * @param response The servlet response we are creating
     * @param forward The ForwardConfig controlling where we go next
     *
     * @exception IOException if an input/output error occurs
     * @exception ServletException if a servlet exception occurs
     */
    protected void processForwardConfig(HttpServletRequest request,
                                        HttpServletResponse response,
                                        ForwardConfig forward)
        throws IOException, ServletException {

        if (forward == null) {
            return;
        }
        
        if (log.isDebugEnabled()) {
            log.debug("processForwardConfig(" + forward + ")");
        }
        
        String forwardPath = forward.getPath();
        String uri = null;
        
        // paths not starting with / should be passed through without any processing
        // (ie. they're absolute)
        if (forwardPath.startsWith("/")) {
            uri = RequestUtils.forwardURL(request, forward, null);    // get module relative uri
        } else {
            uri = forwardPath;
        }
        
        if (forward.getRedirect()) {
            // only prepend context path for relative uri
            if (uri.startsWith("/")) {
                uri = request.getContextPath() + uri;
            }
            response.sendRedirect(response.encodeRedirectURL(uri));
            
        } else {
            doForward(uri, request, response);
        }

    }

  • 大小: 51.1 KB
3
2
分享到:
评论

相关推荐

    基于Struts的异常处理

    在Java Web开发中,Struts框架是一个流行的选择,它提供了强大的...通过这种方式,开发者可以创建一个统一的异常处理流程,提高代码的可维护性和用户体验,因为错误信息会被适当地呈现给用户,而不是简单的堆栈跟踪。

    Struts2的异常处理

    Struts2作为一款流行的Java Web框架,其异常处理机制是开发者必须掌握的关键部分。这篇博客主要探讨了在Struts2中如何有效地管理和处理异常,从而提高应用的稳定性和用户体验。 在Struts2中,异常处理主要通过两种...

    用struts开发的简易bbs论坛社区源码简洁设计网

    本源码提供的是一个基于Struts框架开发的简易BBS论坛社区,其设计简洁,适合初学者学习和理解Struts的工作原理以及Web应用开发的基本流程。 在Struts框架中,主要包含以下几个核心组件: 1. **ActionServlet**:这...

    struts小例子 简单的计算器

    Struts是一个开源的Java EE框架,它主要用于构建和维护可扩展、模块化和易于管理的Web应用程序。...随着对Struts的理解加深,你可以逐渐添加更复杂的功能,如国际化、异常处理和事务管理,以构建更全面的Web应用。

    struts2的简单实例

    通过这个简单的实例,你将了解Struts2的基本工作流程和核心组件。随着对框架的深入理解和实践,你可以掌握更高级的功能,如国际化、文件上传、AJAX集成等,进一步提升Web应用的开发效率和质量。

    struts2简单实例

    在这个实例中,可能有预设的拦截器链,如`defaultStack`,它包含了默认的异常处理和结果映射等拦截器。 7. **部署与运行**: - 项目结构:"Web2"目录可能包含WEB-INF下的`web.xml`文件,配置了Struts2的过滤器,...

    Struts2.5版本简单示例

    6. **异常处理**:引入了`ActionError`和`ActionSupport`类的改进,使异常处理更加灵活。 7. **插件更新**:许多插件进行了更新,以适应新的框架版本,比如国际化支持和JSON视图。 在提供的压缩包文件中,可能包含...

    struts2简单模拟

    6. **异常处理**:Struts2提供了一套完整的异常处理机制,可以捕获并控制应用程序中可能出现的异常,使开发者能够优雅地处理错误。 7. **国际化支持**:Struts2支持多语言环境,通过资源文件可以轻松实现应用程序的...

    struts1做的简单登陆系统

    11. **异常处理**:Struts1允许开发者通过配置ActionError和ActionMessage来处理和展示异常信息,提供友好的用户反馈。 12. **国际化与本地化**:Struts1支持多语言,可以通过资源文件进行国际化处理,使应用能够...

    struts1.2驱动包

    9. **异常处理**:框架提供了全局的异常处理机制,可以统一处理应用程序中出现的异常,提高代码的健壮性。 下载的"struts1.2-jars"压缩包很可能包含了Struts1.2框架所需的全部JAR文件,包括核心库、标签库、以及...

    Struts2视频教程

    - **异常处理**:配置异常拦截器,实现全局异常捕获和处理,提升用户体验。 - **文件上传与下载**:Struts2内置了对文件上传的支持,可以轻松实现文件上传功能;同时也可以配置下载功能,满足文件分发的需求。 - **...

    留言板留言板struts2留言板struts2

    9. **异常处理**:Struts2通过全局异常映射(Global Exception Mapping)来统一处理应用程序中抛出的异常,提高代码的可维护性。 10. **国际化与本地化**:Struts2支持多语言环境,可以通过资源包(properties文件...

    简单的Struts1.0的实现

    7. **错误处理和异常捕获**: 我们可以配置`struts-config.xml`中的`global-exceptions`元素来捕获全局异常,并定义错误页面。同时,Action类中的`execute`方法可以抛出`ActionError`或`ActionException`来处理特定的...

    使用struts实现的简单登入注册功能

    本项目“使用struts实现的简单登入注册功能”旨在展示如何利用Struts2框架来处理用户登录和注册的基本流程。以下将详细介绍涉及的技术和关键步骤。 1. **Struts2框架**:Struts2是Apache软件基金会的一个开源项目,...

    struts+hibernate简单的学生管理信息系统的源码

    Struts和Hibernate是两种在Java Web开发中广泛使用的开源框架,...此外,还可以深入学习关于请求处理、表单验证、国际化、异常处理等方面的知识。对于想要提升Java Web开发技能的初学者而言,这是一个很好的实践平台。

    struts程序 利用struts技术实现简单程序

    7. **异常处理**:Struts提供了全局的异常处理机制,可以捕获和处理运行时的异常,使应用程序更具健壮性。 8. **拦截器**:Struts2引入了拦截器的概念,它们是一系列处理请求的组件,可以在Action执行前后执行...

    struts入门简单例子

    10. **异常处理**:Struts 提供了一种机制来处理应用程序中的异常,通过配置文件可以定义全局或特定 Action 的异常处理策略。 总的来说,“struts入门简单例子”涵盖了 Struts 的基本组成部分和工作流程,包括用户...

    struts教程 word文档

    此外,实际操作实践,如创建简单的Struts应用程序,理解请求流程,以及如何使用Struts进行数据验证和错误处理等,都是提升技能的关键步骤。这个Word文档可能包含这些内容的详细讲解和示例,可以帮助你深入理解并应用...

    struts2完整例子

    9. **异常处理**:Struts2提供了一套完善的异常处理机制,通过`&lt;global-exception-mappings&gt;`和`&lt;package&gt;`内的`&lt;exception-mapping&gt;`标签,可以定义全局或局部的异常处理策略。 10. ** strut2-helloworld 示例**:...

    struts2参考资料

    综上所述,Struts2是一个功能强大的Java Web框架,它通过源码解析,我们可以学习到MVC模式的实现、拦截器的设计、数据校验和异常处理策略,以及视图层的组织方式等多方面的知识。而通过工具的使用,如插件和配置,...

Global site tag (gtag.js) - Google Analytics