`

JpetStore中MVC机制实现的研究,BeanAction以及BaseBean工作机制(看完有种恍然大悟的感觉啊!)

    博客分类:
  • Java
阅读更多
以前学习iBATIS时候只是粗略的看了一下代码,今天翻出来从新看了看,才发现iBATIS给的JpetStore中关于iBATIS的实现简直太精妙了,它直接把action和actionform合并在一起~ very good!!!

JpetStore的src文件夹,并无一个具体的Action,那么它是如何来完成普通Struts的Action工作了?
查看JpetStore的struts-config.xml可以发现,它的Action只有一个,即 “org.apache.stuts.beanaction.Beanaction”。通过Eclipse查看直接跳转到beanaction.jar的源代码,可以发现Beanaction继承了普通Action,即具备普通的action的功能。那么它具体Action的奥妙在哪,继续研究BeanAction的代码,发现BeanAction其实只有一个方法,源代码如下:
public final ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
    String forward = SUCCESS_FORWARD;
    try {
      if (!(form instanceof BaseBean)) {
        if (form != null) {
          throw new BeanActionException("The form for mapping '" + mapping.getPath() + "' named '" + mapping.getName() + "' was not an instance of BaseBean.  BeanAction requires an BaseBean instance.");
        } else {
          throw new BeanActionException("The form for mapping '" + mapping.getPath() + "' named '" + mapping.getName() + "' was null.  BeanAction requires an BaseBean instance.");
        }
      }
      BaseBean bean = (BaseBean) form;
      ActionContext.initCurrentContext(request, response);
      if (bean != null) {
        // Explicit Method Mapping

        Method method = null;
        String methodName = mapping.getParameter();
        if (methodName != null && !NO_METHOD_CALL.equals(methodName)) {
          try {
            method = bean.getClass().getMethod(methodName, null);
            synchronized (bean) {
              forward = bean.getInterceptor().intercept(new ActionInvoker(bean, method));
            }
          } catch (Exception e) {
            throw new BeanActionException("Error dispatching bean action via method parameter ('" + methodName + "').  Cause: " + e, e);
          }
        }



        // Path Based Method Mapping

        if (method == null && !NO_METHOD_CALL.equals(methodName)) {
          methodName = mapping.getPath();
          if (methodName.length() > 1) {
            int slash = methodName.lastIndexOf("/") + 1;
            methodName = methodName.substring(slash);
            if (methodName.length() > 0) {
              try {
                method = bean.getClass().getMethod(methodName, null);
                synchronized (bean) {
                  forward = bean.getInterceptor().intercept(new ActionInvoker(bean, method));
                }
              } catch (Exception e) {
                throw new BeanActionException("Error dispatching bean action via URL pattern ('" + methodName + "').  Cause: " + e, e);
              }
            }
          }
        }
      }
    } catch (Exception e) {
      forward = "error";
      request.setAttribute("BeanActionException", e);
    }
    return mapping.findForward(forward);
  }


最关键的地方应该就是这里:
/*通过反射,根据得到的方法名称取得方法的句柄*/ 
            method = bean.getClass().getMethod(methodName, null); 
            synchronized (bean) { 
/*下面是关键一句,调用basebean拥有的接口ActionInterceptor的实现DefaultActionInterceptor,来完成具体方法的调用*/ 
              forward = bean.getInterceptor().intercept(new ActionInvoker(bean, method)); 
            } 

而ActionInvoker中
public String invoke() {
    try {
      return (String) method.invoke(bean, null);
    } catch (Exception e) {
      throw new BeanActionException("Error invoking Action.  Cause: " + e, e);
    }
  }

至此可知,它调用的是formbean中的函数。且从这段代码可知,formbean的这类特殊函数,此处称为action方法,要符合两个特征:1)无参数;2)返回值为string,此返回string即是struts-config.xml的全局或局部的forward。



高手估计会不屑一顾,但是新手们绝对有用,还有不懂的可以看iBATIS实战中的第14章,非常经典http://book.csdn.net/bookfiles/700/
这个网站有免费试读。
分享到:
评论

相关推荐

    基于MVC用JSPServlet实现JPetStore实验报告.doc

    【基于MVC用JSPServlet实现JPetStore实验报告】 实验一主要目标是采用MVC(Model-View-Controller)架构模式,利用JSP和Servlet技术实现一个名为JPetStore的电子商务应用。在这个实验中,学生需要理解并实践以下几...

    基于MVC用JSP/Servlet实现JPetStore

    基于MVC用JSP/Servlet实现JPetStore 一、实验内容——基本任务 1.商品展示业务模块,包括大类Category、小类Product和具体商品Item的展示和搜索功能。 2.用户管理业务模块,包括用户注册、登录、修改用户信息、...

    jpetstore系统架构图

    在系统架构图中,ActionServlet作为Struts框架的核心组件,负责接收客户端请求,并通过反射机制调用业务方法,从而实现了请求的灵活路由和处理。 #### 2. iBatis(MyBatis)数据持久层的集成 iBatis(现称MyBatis...

    jpetstore

    **jpetstore** 是一个由Sun Microsystems公司开发的开源Web应用程序示例,它是一个基于Java技术的网上...通过研究和实践jpetstore,开发者可以深入理解Java EE平台的工作原理,并掌握构建实际Web应用所需的关键技能。

    基于MVC用JSPServlet实现JPetStore实验报告+使用AJAX和jQuery改善用户体验实验报告.doc

    在本实验报告中,我们将探讨如何使用MVC(Model-View-Controller)设计模式通过JSP和Servlet实现JPetStore应用程序,并进一步利用AJAX和jQuery技术优化用户体验。实验旨在加深对Web应用开发的理解,特别是Java相关...

    jpetstore开源学习代码

    通过详细研究jpetstore源代码,开发者不仅可以掌握J2EE的基础知识,还能深入了解如何在实际项目中应用设计模式,提升软件开发的效率和质量。同时,这个项目也适合作为面试准备,因为它覆盖了J2EE开发中的许多核心...

    基于MVC用JSP/Servlet实现JPetStore——使用AJAX和jQuery改善用户体验

    **基于MVC模式的JSP/Servlet实现JPetStore项目** 该项目是基于经典的MVC(Model-View-Controller)设计模式构建的,旨在提供一个网上宠物商店的示例应用。在传统的JSP/Servlet实现中,用户每次操作都需要通过完整的...

    jpetstore spring 的经典完整可直接运行的例子 jpetstore

    在这个例子中,你可以看到如何使用Spring配置文件管理Bean,定义Bean之间的依赖关系,以及如何在Struts Action中通过@Autowired注解自动注入依赖。同时,iBatis的SQL映射文件展示了如何编写动态SQL和结果映射,以...

    Struts+Spring+Hibernate实现的jpetstore

    Struts、Spring 和 Hibernate 是Java开发中的三大框架,它们各自在不同的层面上为应用程序提供支持。Struts 是一个 MVC(模型-视图-控制器)框架,Spring 是一个全面的后端应用框架,而 Hibernate 则是 ORM(对象...

    学习Spring 的例子JpetStore

    首先,JpetStore是基于MVC(Model-View-Controller)设计模式构建的电子商务网站,展示了Spring如何整合这一模式来实现松耦合和高内聚的设计。在模型层,Spring的IoC(Inversion of Control,控制反转)容器管理着...

    MyEclipse中加载Spring的JPetStore

    《MyEclipse中加载Spring的JPetStore详解》 在软件开发领域,Spring框架以其强大的功能和灵活性,已经成为Java企业级应用开发的事实标准。而MyEclipse作为一款强大的Java集成开发环境,为开发者提供了便捷的Spring...

    JPetStore-5.0.zip_JPETSTO_jpetstore-5_jpetstore5_jpetstore5.0_jp

    在本项目中,你可以看到Spring框架被用来实现MVC的组件管理,它提供了依赖注入(DI)和面向切面编程(AOP)的功能。 该项目包含了多个模块,如用户管理、商品分类、购物车、订单处理等,每个模块都对应着特定的业务...

    JPetStore4.0.5

    总结来说,JPetStore4.0.5是Ibatis和Struts框架的完美结合,它展示了如何在小型项目中有效地运用这两种技术,实现了高效、灵活的Web应用开发。无论你是初学者还是有经验的开发者,这个项目都值得深入研究,从中汲取...

    iBATIS JPetStore

    通过研究JPetStore,开发者可以学习到如何设计数据库驱动的应用,如何使用iBATIS进行数据访问,以及如何构建符合MVC模式的Web应用。此外,该项目也提供了一个实际的场景来测试和理解事务管理、异常处理和数据库连接...

    jpetstore4.0 (spring+struts+ibatis)

    总结来说,jpetstore4.0项目利用Spring、Struts和iBatis的协同工作,实现了高效、可扩展的电子商务系统。这个项目对于学习和理解Java Web开发中的MVC架构、依赖注入、数据库操作等核心概念具有很高的参考价值。同时...

    spring例子: jpetstore

    它是一个小型的在线宠物商店,包含了用户注册、登录、浏览商品、购物车管理等基本功能,有助于学习者理解Spring框架的核心特性以及MVC(Model-View-Controller)设计模式在实际开发中的应用。 描述中的链接指向了...

    JPetStore静态页面_java_java课程设计_java编程_

    JPetStore遵循MVC设计模式,这是Web开发中常用的一种架构模式。Model负责业务逻辑和数据管理,View负责显示用户界面,而Controller则处理用户请求并协调Model和View之间的通信。这种分离使得代码更易于维护和扩展。 ...

    jpetstore宠物店程序

    在jpetstore中,Spring主要负责管理对象(如DAO、Service等),并通过配置beans.xml文件实现对象的生命周期管理和依赖关系的注入。此外,Spring的事务管理确保了数据操作的一致性。 3. **数据库集成** jpetstore...

    JPetStore5(更正了其中的2个错误)

    **JPetStore5:一个基于J2EE的开源电子商务示例** **简介** JPetStore5是基于Java 2 Enterprise Edition (J2EE) 平台的一个经典示例应用,它是一个在线宠物商店,用于展示如何实现电子商务功能。这个项目在原有的...

Global site tag (gtag.js) - Google Analytics