- 浏览: 168465 次
- 性别:
- 来自: 北京
最新评论
-
jpsb:
...
Spring中 Quartz 调度程序 scheduler JobDetailBean 注入 Service -
jinfreaks1981:
看不明白啊?请解释一下
Struts2 <div> id 动态生成方法 -
huivip:
多谢,刚刚把java7都卸载了,原来是这个原因
IDEA报错: Error: javac: 源版本 1.6 需要目标版本 1.6 -
youfengkai:
多谢,正好遇到问题了
IDEA报错: Error: javac: 源版本 1.6 需要目标版本 1.6 -
wmz110:
,谢谢LZ分享!很好用哦!
PL SQL 8.0.1 注册码
JpetStore中的Action与普通Struts的Action处理方式不一样。遍历JpetStore的src文件夹,并无一个具体的Action,那么它是如何来完成普通Struts的Action工作了?
查
看JpetStore的Struts.xml可以发现,它的Action只有一个,即
“org.apache.stuts.beanaction.Beanaction”。通过Eclipse查看beanaction.jar的源代码,可
以发现Beanaction继承与普通Action,即具备普通的action的功能。那么它无具体Action的奥妙在哪,继续研究
BeanAction的代码,截取BeanAction的excute方法中核心部分代码如下:
private static final String NO_METHOD_CALL = " * " ;
…….
/**/ /* 所有的FormBean都继承于BaseBean */
BaseBean bean = (BaseBean) form;
ActionContext.initCurrentContext(request, response);
if (bean != null ) {
// Explicit Method Mapping
/**/ /* 下面是检查struts.xml配置中是否有parameter属性 */
Method method = null ;
String methodName = mapping.getParameter();
if (methodName != null && ! NO_METHOD_CALL.equals(methodName)) {
try {
/**/ /* 通过反射,根据得到的方法名称取得方法的句柄 */
method = bean.getClass().getMethod(methodName, null );
synchronized (bean) {
/**/ /* 下面是关键一句,调用basebean拥有的接口ActionInterceptor的实现DefaultActionInterceptor,来完成具体方法的调用 */
forward = bean.getInterceptor().intercept( new ActionInvoker(bean, method));
}
……..
/**/ /* 无Parameter属性,检查path路径的最后一个/后的名称,即为调用的方法名 */
// 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));
}
……..
/**/ /* 根据调用方法返回的String,得到页面的转移路径 */
return mapping.findForward(forward);
通过研究上面这段代码,我们可知,JpetStore中没有具体Action实现的关键原因即在于下面这几句
method = bean.getClass().getMethod(methodName, null );
synchronized (bean) {
/**/ /* 下面是关键一句,调用basebean拥有的接口ActionInterceptor的实现DefaultActionInterceptor,来完成具体方法的调用 */
forward = bean.getInterceptor().intercept( new ActionInvoker(bean, method));
}
即将原来Action中的excute方法的实现转移到FormBean中,这样实现显得更为简捷,方便。研究ActionInvoke,它的核心代码如下:
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。
以上是整个beanaction的实现机制。个人感觉此种实现方法对于开发者而言已经类似于ASP.NET的.aspx与.cs开发模式了。下面是通过实例来说明一下BeanAction如何控制formbean的
Struts-config.xml的配置里有3种映射方式,来告诉BeanAction把控制转到哪个form bean对象的哪个方法来处理。
(1)parameter=”*’直接跳转;(2)Parameter中含具体的方法名;(3)Path中最后一个/后的方法名
以这个请求连接为例http://localhost/jpetstore4/shop/viewOrder.shtml
1. URL Pattern
name ="orderBean" scope ="session"
validate ="false" >
< forward name ="success" path ="/order/ViewOrder.jsp" />
</ action >
此种方式表示,控制将被转发到"orderBean"这个form bean对象 的"viewOrder"方法(行为)来处理。方法名取"path"参数的以"/"分隔的最后一部分。
2. Method Parameter
name ="orderBean" parameter ="viewOrder" scope ="session"
validate ="false" >
< forward name ="success" path ="/order/ViewOrder.jsp" />
</ action >
此种方式表示,控制将被转发到"orderBean"这个form bean对象的"viewOrder"方法(行为)来处理。配置中的"parameter"参数表示form bean类上的方法。"parameter"参数优先于"path"参数。
3. No Method call
name ="orderBean" parameter ="*" scope ="session"
validate ="false" >
< forward name ="success" path ="/order/ViewOrder.jsp" />
</ action >
此种方式表示,form bean上没有任何方法被调用。如果存在"name"属性,则struts把表单参数等数据填充到form bean对象后,把控制转发到"success"。否则,如果name为空,则直接转发控制到"success"。
这就相当于struts内置的org.apache.struts.actions.ForwardAction的功能
parameter ="/order/ViewOrder.jsp " scope ="session" validate ="false" >
</ action >
发表评论
-
JDK 版本号对应的数字
2017-05-26 17:03 1221J2SE 8 = 52 (0x34 hex) J2SE ... -
Java在Linux平台编译出错,都是rt.jar惹的祸
2017-04-28 10:20 1024给公司项目做集成,发现项目在windows平台下能编译 ... -
Software\JavaSoft\Java Runtime Environment\CurrentVersion has value '1.8', but '
2017-03-31 17:57 1507Registry key 'Software\JavaSoft ... -
内存溢出和内存泄漏
2017-03-05 13:38 334内存溢出和内存泄漏 内存溢出 out of memory,是指 ... -
数组和List 互相转换 List to Array
2013-06-20 10:22 10202数组和List 相互转换, 可以是任意类型的数组 pac ... -
Java中Split函数的用法技巧
2013-05-09 14:27 926在java.lang包中也有String.split()方法, ... -
JavaMail 发邮件程序
2012-02-11 17:49 1050一个简单的发邮件程序 本人测试成功,请放心使用 部分代码修改成 ... -
HttpClient getMethod postMethod response 字体集
2011-12-28 11:25 1267getMethod.getResponseBodyAsStri ... -
多个数据源 JUnit Test 报错处理 No unique bean of type [javax.sql.DataSource]
2011-11-08 17:23 7438ssh多数据源报错处理方法 No unique bean o ... -
appfuse
2011-08-01 17:36 01.按照Appfuse官网的快速指南里面的"Crea ... -
java.lang.NoSuchMethodError: org.springframework.util.ReflectionUtils.makeAccess
2010-07-11 14:56 2415java.lang.NoSuchMethodError: or ... -
解决Ultraedit32 菜单字体小的问题
2010-01-13 16:19 0解决Ultraedit32 菜单字体小的问题 2009-10- ... -
数据库连接加密 配置文件加密
2010-01-11 17:16 1994重写连接池的setPassword()方法. 写密文解析成明文 ... -
应该记录什么样的日志
2009-06-07 12:39 1116您应该对所有不期望的错误条件 (异常)进行日志. ... -
异常处理
2009-05-22 16:17 1168异常是一种对象,用来表示异常的情况. 分为检查异常和非检查异常 ... -
dbcp连接池实现
2009-03-27 13:39 1028DBCP是Apache的一个开源项目: commons.dbc ... -
Java创建Data类型数据
2009-03-04 14:20 1357Java创建Date类型数据 Date createDat ... -
创建Java类中 方法的原则
2009-03-04 14:10 1044多数方法的代码量在一行到六行之间,有些方法在六行到十二 ... -
ClassCastException
2009-01-15 15:28 1063ClassCastException异常是类型转换异常,这种异 ... -
Date类型转换成String (yyyy-MM-dd)
2008-10-11 18:03 2521public String date2String(Date ...
相关推荐
JPetStore是基于iBATIS实现的一个在线宠物商店示例,它的设计和实现为开发者提供了学习数据库驱动应用开发的良好实践。 首先,让我们深入了解一下iBATIS框架。iBATIS的核心理念是将SQL与Java代码分离,通过XML或...
这个项目对于学习iBATIS和Spring的整合使用,以及理解MVC(Model-View-Controller)设计模式在实际应用中的实现非常有帮助。 通过研究这个项目,开发者可以深入理解如何在Java Web应用中集成iBATIS进行数据操作,...
在JPetStore项目中,iBatis作为数据访问层,处理数据库的CRUD操作,通过XML映射文件与Java对象进行绑定,实现了业务逻辑与数据访问的解耦。 3. **JPetStore**:JPetStore是Java EE领域的一个经典示例应用,它是一个...
jpetstore4.0是一款经典的电子商务示例应用,它采用Spring、Struts和iBatis这三个核心框架构建,展示了如何在Java环境下实现一个完整的MVC(Model-View-Controller)架构。这个项目是针对JDK7及更高版本,以及Tomcat...
总的来说,JPetStore-5.0不仅是一个电商应用实例,也是一个学习和研究Java Web开发、iBatis、Spring和MVC模式的宝贵资源。通过对这个项目的深入研究,开发者可以提升自己的技术能力,更好地理解和运用相关技术栈。
在系统架构图中,ActionServlet作为Struts框架的核心组件,负责接收客户端请求,并通过反射机制调用业务方法,从而实现了请求的灵活路由和处理。 #### 2. iBatis(MyBatis)数据持久层的集成 iBatis(现称MyBatis...
jpetstore项目是Spring框架的一个经典示例,它全面展示了如何将Spring、iBatis和Struts这三个核心的Java Web技术进行集成,构建出一个完整的MVC(Model-View-Controller)应用程序。这个项目不仅提供了一个可直接...
在IT领域,特别是Java开发中,JPetStore经常被用作示例项目来演示和学习各种技术框架的使用。本篇将深入探讨"jpetstore-ibatis"这个项目,它是对经典的JPetStore应用的重构,采用了MyBatis(原Ibatis)作为持久层...
通过研究这个项目,开发者可以学习到如何使用Ibatis进行数据库操作,理解MVC模式在实际项目中的应用,以及如何组织和管理Java Web项目。同时,对于数据库设计、项目构建和文档编写等方面也有一定的学习价值。
【标题】"springMVC+mybatis+jpetstore工程源码"揭示了这是一个结合了SpringMVC、MyBatis和jpetstore示例项目的工程,主要用于演示如何在实际开发中整合这三个技术。SpringMVC是Spring框架的一个模块,用于处理Web...
JPetStore是ibatis的一个经典示例项目,它是一个基于MVC设计模式的网上宠物商店应用,旨在展示如何使用ibatis进行数据操作。通过深入理解JPetStore项目,我们可以更好地掌握ibatis的核心功能和实际应用。 1. **项目...
总的来说,通过研究和实践`JPetStore`工程,开发者可以深入理解Java EE开发流程,掌握MVC架构,以及iBATIS等数据访问技术。这个项目非常适合初学者入门,同时对有经验的开发者也有一定的参考价值,因为它展示了实际...
综上所述,JPetStore (Struts + Spring + Hibernate)版是一个理想的学习资源,它展示了如何在实际项目中集成和使用这些流行的技术,对于Java Web开发人员来说,深入研究这个项目可以提升他们对现代企业级应用开发的...
JpetStore 4.0作为ibatis的最新示例项目,不仅展现了ibatis在数据持久化方面的高效能力,还通过整合Struts与Spring,构建了一个层次分明、易于维护的高效编程模型。这种模式下,ibatis作为数据访问层,Struts负责...
通过研究这个项目,开发者不仅可以深入理解Ibatis和Struts1.2的工作机制,还能掌握如何在实际项目中运用这些技术,提升自己的开发技能。 总的来说,"ibatis,strust1.2结合开发的项目成品"——网上宠物店JPetStore,...
四、JPetStore示例 JPetStore是Struts的官方示例应用,也常被用来展示iBatis的整合。该应用是一个宠物商店的在线购物系统,涵盖了商品浏览、购物车、订单等典型功能。在iBatis和Struts的整合下,JPetStore的实现过程...
JpetStore 4.0是Ibatis的一个示例项目,它从Sun公司的过度设计的J2EE Petstore改进而来,设计更加简洁,避免了许多反模式,如存储过程和在代码中嵌入SQL。JpetStore 4.0采用Struts和Ibatis,提供了一个清晰的分层...
JPetStore 4.0是ibatis官方提供的一个示例程序,它采用了一种更为现代的架构设计,使用了Struts MVC框架、ibatis作为持久层,并通过POJO实现了业务层和领域层。这一版本的设计更加优雅,层次分明,是学习和参考高效...