`
geeksun
  • 浏览: 965301 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

jpetstore的BeanAction源码解析

阅读更多

      jpetstore的两个核心类:BeanAction和BaseBean,在这儿对BeanAction进行一下解析,源码:

public class BeanAction extends Action {
  private static final String NO_METHOD_CALL = "*";
  private static final String SUCCESS_FORWARD = "success";
  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.");
        }
      }

      //实例化bean,jpetstore中的bean也是VO,里面有相应的行为操作
      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)) {         // x1
          try {

            method = bean.getClass().getMethod(methodName, null);
            synchronized (bean) {

              //执行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)) {     // x2
          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);
  }
}

BeanAction的execute()方法运行场景

1. 当请求url对应的action配置文件中带有parameter时,例如<a href="switchProductListPage.shtml?pageDirection=next"></a>链接,先查找配置文件中该aciton项的parameter属性是否已定义,如果有定义:

<action path="/shop/switchSearchListPage" type="org.apache.struts.beanaction.BeanAction"
            name="catalogBean" scope="session" parameter="switchProductListPage"
            validate="false">
      <forward name="success" path="/catalog/SearchProducts.jsp"/>
    </action>

程序将会运行x1处的代码,执行catalogBean中的switchProductListPage方法,

2. 如果请求的action的pararmeter属性未定义,如

 <html:link page="/shop/viewCategory.shtml?categoryId=FISH">这样的链接,配置文件中没有parameter属性,

<action path="/shop/viewCategory" type="org.apache.struts.beanaction.BeanAction"
            name="catalogBean" scope="session"
            validate="false">
      <forward name="success" path="/catalog/Category.jsp"/>
    </action>

程序将会运行x2处的代码,查找path中的最后一个“/”后的单词viewCategory,执行catalogBean中的viewCategory方法。

3. 第三种情况是提交的url对应的action在配置文件中的parameter="*"时,如<a href="shop/index.shtml">Enter the Store</a>这样的链接,在配置文件中

<action path="/shop/index" type="org.apache.struts.beanaction.BeanAction"
            name="catalogBean" parameter="*" validate="false">
      <forward name="success" path="/catalog/Main.jsp"/>
    </action>

程序将不会运行x1和x2处的代码,直接返回已定义好的forward页面。

分享到:
评论

相关推荐

    springMVC+mybatis+jpetstore工程源码

    【标题】"springMVC+mybatis+jpetstore工程源码"揭示了这是一个结合了SpringMVC、MyBatis和jpetstore示例项目的工程,主要用于演示如何在实际开发中整合这三个技术。SpringMVC是Spring框架的一个模块,用于处理Web...

    jpetstore源码

    **jpetstore源码详解** `jpetstore`是一个经典的示例项目,它展示了如何使用Java企业级开发框架实现一个完整的网上宠物商店。这个源码是基于特定版本的Java技术栈构建的,如Spring框架、Struts框架或者MyBatis等,...

    jpetstore系统架构图

    《深入解析jpetstore系统架构图:从设计到实现》 在IT行业的软件开发领域,jpetstore系统作为一款开源的网上宠物商店示例应用程序,以其清晰的分层架构、强大的功能性和高度可扩展性而著称。尤其在jpetstore5.0版本...

    springMVC+jpetstore+mysql工程源码

    【标题】"springMVC+jpetstore+mysql工程源码"是一个基于SpringMVC框架的电商项目示例,集成了jpetstore应用和MySQL数据库。这个项目旨在展示如何使用SpringMVC来构建一个完整的Web应用程序,并利用MySQL进行数据...

    springMVC自带的jpetstore源码

    **Spring MVC 自带的 JPetStore 源码解析** `Spring MVC` 是一个轻量级的、模型-视图-控制器(Model-View-Controller)框架,它为开发基于 Java 的 Web 应用程序提供了强大的支持。而 `jpetstore` 是 Spring 社区...

    jpetstore

    **jpetstore** 是一个由Sun Microsystems公司开发的开源Web应用程序示例,它是一个基于Java技术的网上宠物商店。这个项目被设计成一个简单的“Hello, World”式的Web应用,用以展示Java技术和相关的框架在构建电子...

    JPetStore-5.0.zip_JPETSTO_jpetstore-5_jpetstore5_jpetstore5.0_jp

    《JPetStore-5.0:一个基于iBatis的开源电商示例解析》 JPetStore-5.0是一个著名的开源项目,它基于iBatis数据持久层框架,为开发者提供了一个完整的电子商务应用程序示例。这个项目由Apache Software Foundation...

    jpetstore开源学习代码

    2. **EJB(Enterprise JavaBeans)**:作为J2EE的核心组件,EJB提供了一种规范来创建可重用的服务器端组件,如会话bean(Session Beans)用于处理业务逻辑,实体bean(Entity Beans)用于持久化数据。jpetstore可能...

    jpetstore_autom7-源码.rar

    本文将对jpetstore_autom7的源码进行深入解析,揭示其中蕴含的技术精髓。 首先,jpetstore_autom7项目基于Struts 2框架构建,这是一个经典的MVC(Model-View-Controller)架构,用于构建动态Web应用。Struts 2提供...

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

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

    JPetStore项目源码、文档、数据库脚本

    JPetStore划分成了多个模块,采取了松耦合的设计架构,允许存在多个数据源及EIS进行信息交互。它的结构相对简单,总共包括4个部分: • 购物站点 • 管理。如:销售统计,手工接受/拒绝订单 • 订单处理 通过JMS接受...

    JPetStore4.0.5

    在实际开发中,JPetStore4.0.5的源码是一个很好的学习资源。通过分析其结构,开发者可以了解如何使用Ibatis进行数据库操作,如何配置Struts的Action和ActionForm,以及如何组织MVC架构。此外,该项目还涵盖了常见的...

    学习Spring 的例子JpetStore

    《Spring框架学习:以JpetStore为例》 Spring框架是Java企业级应用开发中的核心框架,它为开发者提供了丰富的功能,简化了开发流程,提高了代码的可测试性和可维护性。JpetStore作为Spring的经典示例项目,是学习...

    spring例子: jpetstore

    描述中的链接指向了ITEYE上的一篇博客文章,虽然内容没有给出,但通常这类博客会包含对JPetStore的详细解析,包括项目的结构、主要组件、配置文件的解读以及关键代码的解释。 标签 "源码" 暗示我们可以从JPetStore...

    jpetstore4.0 (spring+struts+ibatis)

    1. **请求调度**:Struts控制器接收HTTP请求,解析请求参数,然后转发到相应的Action类进行处理。 2. **视图管理**:Struts的Tiles框架允许组合不同的JSP页面来创建复杂的视图,提高了界面的可复用性和可维护性。 3....

    MyEclipse中加载Spring的JPetStore

    1. **项目导入**:首先,你需要下载JPetStore的源码压缩包,这在你提供的文件列表中已经包含,名为"JPetStore"。在MyEclipse中,选择“File” -&gt; “Import” -&gt; “Existing Projects into Workspace”,然后在弹出的...

    Spring+EasyJWeb+iBatis版j2ee在线购物jpetstore系统源码

    Spring+EasyJWeb+iBatis版j2ee在线购物jpetstore系统,业务层及持久层使用springframework上的jpetsotre源码,表示层使用EasyJWeb,该系统是一个简单的J2EE网上商店系统,包括商品列表、购物车、用户管理、在线订单...

    J2EE without EJB书的实例jpetstore源码

    《J2EE without EJB》是一本专注于Spring框架在企业级Java应用开发中的实践书籍,其提供的jpetstore源码是书中一个非常重要的实例。这个实例深入展示了如何使用Spring框架替代传统的EJB(Enterprise JavaBeans)来...

Global site tag (gtag.js) - Google Analytics