以前学习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实验报告】 实验一主要目标是采用MVC(Model-View-Controller)架构模式,利用JSP和Servlet技术实现一个名为JPetStore的电子商务应用。在这个实验中,学生需要理解并实践以下几...
基于MVC用JSP/Servlet实现JPetStore 一、实验内容——基本任务 1.商品展示业务模块,包括大类Category、小类Product和具体商品Item的展示和搜索功能。 2.用户管理业务模块,包括用户注册、登录、修改用户信息、...
在系统架构图中,ActionServlet作为Struts框架的核心组件,负责接收客户端请求,并通过反射机制调用业务方法,从而实现了请求的灵活路由和处理。 #### 2. iBatis(MyBatis)数据持久层的集成 iBatis(现称MyBatis...
**jpetstore** 是一个由Sun Microsystems公司开发的开源Web应用程序示例,它是一个基于Java技术的网上...通过研究和实践jpetstore,开发者可以深入理解Java EE平台的工作原理,并掌握构建实际Web应用所需的关键技能。
在本实验报告中,我们将探讨如何使用MVC(Model-View-Controller)设计模式通过JSP和Servlet实现JPetStore应用程序,并进一步利用AJAX和jQuery技术优化用户体验。实验旨在加深对Web应用开发的理解,特别是Java相关...
通过详细研究jpetstore源代码,开发者不仅可以掌握J2EE的基础知识,还能深入了解如何在实际项目中应用设计模式,提升软件开发的效率和质量。同时,这个项目也适合作为面试准备,因为它覆盖了J2EE开发中的许多核心...
**基于MVC模式的JSP/Servlet实现JPetStore项目** 该项目是基于经典的MVC(Model-View-Controller)设计模式构建的,旨在提供一个网上宠物商店的示例应用。在传统的JSP/Servlet实现中,用户每次操作都需要通过完整的...
在这个例子中,你可以看到如何使用Spring配置文件管理Bean,定义Bean之间的依赖关系,以及如何在Struts Action中通过@Autowired注解自动注入依赖。同时,iBatis的SQL映射文件展示了如何编写动态SQL和结果映射,以...
Struts、Spring 和 Hibernate 是Java开发中的三大框架,它们各自在不同的层面上为应用程序提供支持。Struts 是一个 MVC(模型-视图-控制器)框架,Spring 是一个全面的后端应用框架,而 Hibernate 则是 ORM(对象...
首先,JpetStore是基于MVC(Model-View-Controller)设计模式构建的电子商务网站,展示了Spring如何整合这一模式来实现松耦合和高内聚的设计。在模型层,Spring的IoC(Inversion of Control,控制反转)容器管理着...
《MyEclipse中加载Spring的JPetStore详解》 在软件开发领域,Spring框架以其强大的功能和灵活性,已经成为Java企业级应用开发的事实标准。而MyEclipse作为一款强大的Java集成开发环境,为开发者提供了便捷的Spring...
在本项目中,你可以看到Spring框架被用来实现MVC的组件管理,它提供了依赖注入(DI)和面向切面编程(AOP)的功能。 该项目包含了多个模块,如用户管理、商品分类、购物车、订单处理等,每个模块都对应着特定的业务...
总结来说,JPetStore4.0.5是Ibatis和Struts框架的完美结合,它展示了如何在小型项目中有效地运用这两种技术,实现了高效、灵活的Web应用开发。无论你是初学者还是有经验的开发者,这个项目都值得深入研究,从中汲取...
通过研究JPetStore,开发者可以学习到如何设计数据库驱动的应用,如何使用iBATIS进行数据访问,以及如何构建符合MVC模式的Web应用。此外,该项目也提供了一个实际的场景来测试和理解事务管理、异常处理和数据库连接...
总结来说,jpetstore4.0项目利用Spring、Struts和iBatis的协同工作,实现了高效、可扩展的电子商务系统。这个项目对于学习和理解Java Web开发中的MVC架构、依赖注入、数据库操作等核心概念具有很高的参考价值。同时...
它是一个小型的在线宠物商店,包含了用户注册、登录、浏览商品、购物车管理等基本功能,有助于学习者理解Spring框架的核心特性以及MVC(Model-View-Controller)设计模式在实际开发中的应用。 描述中的链接指向了...
JPetStore遵循MVC设计模式,这是Web开发中常用的一种架构模式。Model负责业务逻辑和数据管理,View负责显示用户界面,而Controller则处理用户请求并协调Model和View之间的通信。这种分离使得代码更易于维护和扩展。 ...
在jpetstore中,Spring主要负责管理对象(如DAO、Service等),并通过配置beans.xml文件实现对象的生命周期管理和依赖关系的注入。此外,Spring的事务管理确保了数据操作的一致性。 3. **数据库集成** jpetstore...
**JPetStore5:一个基于J2EE的开源电子商务示例** **简介** JPetStore5是基于Java 2 Enterprise Edition (J2EE) 平台的一个经典示例应用,它是一个在线宠物商店,用于展示如何实现电子商务功能。这个项目在原有的...